我需要在运行时获取数据段的bss和数据部分的地址空间。我需要每个部分的开始和结束地址。
答案 0 :(得分:5)
术语“数据段”有点过时了。
在Unix系统上,有一种可靠的方法来检索 end 地址:只需调用brk
即可。但是,brk
函数会出现警告。从手册页:
brk和sbrk功能是虚拟内存管理出现前几天遗留的历史好奇心。
重点原创。
如果您使用ELF:如果您知道使用的是ELF二进制文件,那么在加载程序时,或多或少会忽略该信息。 ELF程序由段加载,但.data
和.bss
是部分。 .data
和.bss
部分是在同一个细分受众群中,但该细分受众群还包含其他部分(.ctors
,.dtors
,.got
等。
如果您使用Linux:如果您知道自己专门使用Linux,则可以执行以下操作:
从可执行文件中读取ELF标头。您可以使用/proc/self/exe
查找可执行文件。
从/proc/self/maps
。
对于与您的文件对应的地图,您可以通过查看偏移来确定哪个地图与.data
部分相对应。
如果您使用的是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 是你的过程映像的符号链接。