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

时间:2012-01-20 07:56:27

标签: c unix

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

2 个答案:

答案 0 :(得分:5)

术语“数据段”有点过时了。

在Unix系统上,有一种可靠的方法来检索 end 地址:只需调用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. 中读取内存地图
  4. 对于与您的文件对应的地图,您可以通过查看偏移来确定哪个地图与.data部分相对应。

  5. 如果您使用的是glibc符号__data_start指向数据部分的开头,我认为我已将__bss_start定义为好。

    extern char __data_start;
    extern char __bss_start;
    void *get_data_start(void) { return &__data_start; }
    

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

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

答案 1 :(得分:0)

也许不是一个令人满意的答案,但在linux下,你可以使用/ proc / self / exe, contains 是你的过程映像的符号链接。