如何在运行时获取数据和bss地址空间(在Unix C程序中)

use*_*696 0 c unix

我需要在运行时获取数据段的bss和数据部分的地址空间.我需要每个部分的开始和结束地址.

Die*_*Epp 5

术语"数据段"有点过时了.

在Unix系统上,有一种可靠的方法来检索结束地址:简单地调用brk.但是,该brk功能带有警告.从手册页:

brk和sbrk功能是虚拟内存管理出现前几天遗留下来的历史好奇心.

重点原创.

如果您使用ELF: 如果您知道使用ELF二进制文件,则在加载程序时或多或少会忽略该信息.ELF程序被加载段,.data.bss部分..data.bss部分在相同的段,但段还具有其他部分(.ctors,.dtors,.got等等).

如果您使用Linux:如果您知道自己专门使用Linux,那么您可以执行以下操作:

  1. 从可执行文件中读取ELF头文件.您可以/proc/self/exe用来查找可执行文件.

  2. 从中读取内存映射/proc/self/maps.

  3. 对于与您的文件对应的地图,您可以.data通过查看偏移来确定哪个地图对应于该部分.

如果您正在使用glibc:符号__data_start指向数据部分的开头,我想我已经看到了__bss_start定义.

extern char __data_start;
extern char __bss_start;
void *get_data_start(void) { return &__data_start; }
Run Code Online (Sandbox Code Playgroud)

但是......你想要完成什么?最有效的解释为什么你想知道这些部分的位置.你在写垃圾收集器吗?一个调试器?你想保存过程图像吗?

警告:谁知道上述任何事情何时会破裂.也许__data_start没有定义,或者可能brk指向一些不相关的记忆区域.阅读ELF标题似乎是最可靠的技巧,并且它也有库.