1

根据我的理解,C/C++ 程序在内存中看起来像这样:

C程序的内存布局。 资料来源:互联网

我想知道以下内容:

  1. 我可以访问正在运行的程序的“文本部分”吗?通过访问我的意思是打印开始和结束地址并检查内容。
  2. 我可以在运行时将“文本部分”重新定位到内存中的其他地址吗?

谢谢,

4

1 回答 1

9

它是特定于操作系统的;我只回答 Linux。

首先,您的数字在实践中完全不正确,因为大多数程序都动态链接到多个共享对象库(包括libc6.so...)。另请参见ld.so(8)elf(5)execve(2)。没有单个 text部分(但有许多“文本”之类的段)。阅读pmapobjdump命令。

然后,你可以用 ; 了解一个 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位置无关代码重定位ABIJIT 编译名称修改x86-64 ABI 规范高级 Linux 编程书的维基页面。

于 2013-11-08T05:54:15.827 回答