根据我的理解,C / C ++程序在内存中看起来像这样:
我想知道以下内容:
谢谢,
答案 0 :(得分:9)
这是特定于操作系统的;我正在回答Linux。
首先,您的数字在实践中非常不正确,因为大多数程序都动态链接到多个共享对象库(包括libc6.so
...)。另请参阅ld.so(8),elf(5),execve(2)。没有单个 text
部分(但很多“文本”类似于细分)。阅读pmap和objdump命令。
然后,您可以使用cat /proc/1234/maps
了解pid 1234进程的地址空间;详细了解proc(5) ...从程序内部,阅读/proc/self/maps
;例如,在shell中尝试cat /proc/$$/maps
以显示shell进程的地址空间,并在运行该cat /proc/self/maps
命令的进程的地址空间中使用cat
。另请参阅mmap(2)。
你不能真正“重新定位”(你实际上是指“移动”)文本部分。一些地址构建在代码中。不过,请阅读gcc
的{{3}}(对于位置无关的可执行文件 ....)。
当然,如果您将程序的符号与-fPIE option标记相关联,并且使用-rdynamic(和dlsym
甚至可能{{}},则可以访问该程序的符号(从内部开始) {1}} ....)dladdr
第一个NULL
参数。
另请参阅有关dlopen(3),address space,virtual memory,ASLR,position independent code,relocation,ABI,{的wikipages {3}}以及JIT compilation和name mangling本书。