根据我的理解,C/C++ 程序在内存中看起来像这样:
我想知道以下内容:
- 我可以访问正在运行的程序的“文本部分”吗?通过访问我的意思是打印开始和结束地址并检查内容。
- 我可以在运行时将“文本部分”重新定位到内存中的其他地址吗?
谢谢,
根据我的理解,C/C++ 程序在内存中看起来像这样:
我想知道以下内容:
谢谢,
它是特定于操作系统的;我只回答 Linux。
首先,您的数字在实践中完全不正确,因为大多数程序都动态链接到多个共享对象库(包括libc6.so
...)。另请参见ld.so(8)、elf(5)、execve(2)。没有单个 text
部分(但有许多“文本”之类的段)。阅读pmap和objdump命令。
然后,你可以用 ; 了解一个 pid 1234 的进程的地址空间cat /proc/1234/maps
;阅读有关proc(5)的更多信息...从程序内部阅读/proc/self/maps
;例如,尝试cat /proc/$$/maps
在 shell 中显示 shell 进程cat /proc/self/maps
的地址空间,以及运行该cat
命令的进程的地址空间。另请参见mmap(2)。
您不能真正“重新定位”(您实际上的意思是“移动”)文本部分。一些地址是在代码中构建的。但是,请阅读(对于与位置无关的可执行文件....)的-fPIE 选项。gcc
当然,如果您将程序与-rdynamic标志链接,并且如果您使用dlopen(3)(dlsym
甚至可能dladdr
....)与NULL
第一个filename
参数,您可以访问程序的符号(从内部)。
另请参阅有关地址空间、虚拟内存、ASLR、位置无关代码、重定位、ABI、JIT 编译、名称修改和x86-64 ABI 规范和高级 Linux 编程书的维基页面。