术语"数据段"有点过时了.
在Unix系统上,有一种可靠的方法来检索结束地址:简单地调用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; }
Run Code Online (Sandbox Code Playgroud)
但是......你想要完成什么?最有效的解释为什么你想知道这些部分的位置.你在写垃圾收集器吗?一个调试器?你想保存过程图像吗?
警告:谁知道上述任何事情何时会破裂.也许__data_start没有定义,或者可能brk指向一些不相关的记忆区域.阅读ELF标题似乎是最可靠的技巧,并且它也有库.