访问C ++程序的代码部分

时间:2013-11-08 05:51:54

标签: c++ c linux memory-management elf

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

Memory Layout of C programs. Source : Internet

我想知道以下内容:

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

1 个答案:

答案 0 :(得分:9)

这是特定于操作系统的;我正在回答Linux。

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

然后,您可以使用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 spacevirtual memoryASLRposition independent coderelocationABI,{的wikipages {3}}以及JIT compilationname mangling本书。