我正在开发一个多处理器架构模拟器,它使用 Intel Pin 来检测 C++ 可执行二进制文件并报告有趣的事件(例如,一些函数调用、线程创建/完成等)。基本上,我在加载图像时构建所有指令的指令解码缓存,然后分析指令执行情况。因此,图像加载时的指令地址与运行时的指令地址相同(或至少同步更新)非常重要。
英特尔 Pin API(例如 IMG_AddInstrumentFunction)使我能够获取有关已加载镜像(可执行文件和共享库)的信息,例如入口点、低/高地址等。
但是,我注意到检测的程序在不属于任何已加载图像的地址处执行指令。通过检查,我怀疑动态加载程序(64 位 Centos 6.3 上的镜像/lib64/ld-linux-x86-64.so.2)正在重新定位通过调用例程_dl_relocate_object在内存中执行主要可执行文件。
我理解对可重定位代码和所有这些东西的需求。我只需要指向关于如何/何时发生这些重定位(在加载时和运行时)的良好文档(或只是一个简短的描述/建议),以便我可以在我的架构模拟器中考虑它们。换句话说,用于实现它的机制(我需要检测的库函数、条件,或者可能是随机化(如果有的话)、可以使用的 g++ 编译器开关抑制搬迁等)。 P.S.:我仅针对 x86/x86_64 架构
最佳答案
重定位是特定于处理器的,因此 ARM 和 x86-64 和 x86 有不同的重定位(因为它们的指令集不同)。
重定位也是特定于操作系统的,但一些相关的操作系统尝试进行相同的重定位,例如适用于 x86-64 的 Solaris 和 Linux
ABI 中有详细描述。 (应用程序二进制接口(interface))规范“System 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/