我正在使用Intel Pin来检测C++可执行二进制文件并报告有趣的事件(例如某些函数调用,线程创建/完成等)的多处理器体系结构模拟器。基本上,我会在所有指令加载图像时为所有指令建立一个指令解码缓存,然后分析指令执行。因此,重要的是,图像加载时的指令地址必须与运行时的指令地址相同(或至少与之同步更新)。
英特尔Pin API(例如IMG_AddInstrumentFunction)使我能够获取有关已加载图像(可执行文件和共享库)的信息,例如入口点,低/高地址等。
但是,我注意到,已检测程序在不属于任何已加载镜像的地址上执行指令。通过检查,我怀疑动态加载器( 64位Centos 6.3 上的image /lib64/ld-linux-x86-64.so.2)正在通过调用例程 _dl_relocate_object 将内存中的主要可执行文件重定位。
我知道需要可重定位的代码以及所有这些东西。我只需要有关如何/何时发生这些重定位(在加载时和运行时)的良好文档(或只是简短的描述/建议)的指针,以便在体系结构模拟器中将它们考虑在内。换句话说,机制用于实现它(我需要检测的库函数,条件,或者如果有的话,可能是随机的,可以用来抑制重定位的g++编译器开关,等等)。
附言:我只针对x86 / x86_64体系结构
最佳答案
重定位是特定于处理器的,因此ARM和x86-64和x86具有不同的重定位(因为它们的指令集不同)。
重定位也是特定于操作系统的,但是某些相关的OS会尝试具有相同的重定位,例如适用于x86-64的Solaris和Linux
在ABI(应用程序二进制接口(interface))规范“系统V应用程序二进制接口(interface)AMD64体系结构处理器补充”中详细介绍了它们。原始的x86-64 ABI曾经在http://www.x86-64.org/documentation.html上
但该网站已有几个星期没有响应了。旧副本在this link上,而较新的副本在here上
还有X32 ABI
另请参见this question。
关于c++ - 目标代码重定位和Intel Pin交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15470922/