确定C程序数据段的堆栈底部,开始和结束

时间:2009-11-18 15:01:34

标签: c

我试图了解如何为C程序分配内存空间。为此,我想确定堆栈和数据段边界。是否有任何图书馆电话或系统电话可以完成这项工作?我发现堆栈底部可以通过读取/ proc / self / stat来确定。但是,我找不到怎么做。请帮忙。 :)

3 个答案:

答案 0 :(得分:2)

进程不再有单个“数据段”。他们在地址空间中有一堆内存映射。常见的情况是:

  • 共享库或可执行代码或rodata,映射共享,无需写访问权。
  • Glibc堆段,使用rw权限映射的匿名段。
  • 线程堆栈区域。它们看起来很像堆段,但通常用一些未映射的防护页面彼此分开。

正如尼古拉指出的那样,你可以使用pmap工具查看这些列表。

答案 1 :(得分:0)

没有通用的方法可以做到这一点。事实上,一些安全计算环境随机化了确切的地址空间分配和顺序,因此代码注入攻击对工程师来说更具挑战性。

但是,每个C运行时库都必须安排数据和堆栈段的贡献,以便程序正常工作。读取运行时启动代码是找到答案的最直接方式。

您对哪个C编译器感兴趣?

答案 2 :(得分:0)

查看/proc/<pid>/maps/proc/<pid>/smaps(假设是Linux)。还pmap <pid>