2

我正在开发一个多处理器架构模拟器,该模拟器使用 Intel Pin 来检测 C++ 可执行二进制文件并报告有趣的事件(例如,一些函数调用、线程创建/完成等)。基本上,我在加载图像时构建所有指令的指令解码缓存,然后分析指令执行。因此,图像加载时的指令地址与运行时的指令地址相同(或至少同步更新)是很重要的。

英特尔 Pin API(例如 IMG_AddInstrumentFunction)使我能够获取有关已加载图像(可执行文件和共享库)的信息,例如入口点、低/高地址等。

但是,我注意到插桩程序在不属于任何加载图像的地址处执行指令。通过检查,我怀疑动态加载程序(64 位 Centos 6.3上的图像 /lib64/ld-linux-x86-64.so.2 )正在通过调用例程_dl_relocate_object重新定位内存中的主要可执行文件。

我理解对可重定位代码和所有这些东西的需求。我只需要关于这些重定位如何/何时发生(在加载时和运行时)的良好文档(或只是简短描述/建议)的指针,以便我可以在我的架构模拟器中考虑它们。换句话说,用于实现它的机制(我需要检测的库函数、条件或随机化(如果有的话)、可用于抑制重定位的 g++ 编译器开关等)。PS:我只针对 x86/x86_64 架构

4

1 回答 1

4

重定位是特定于处理器的,因此 ARM 和 x86-64 和 x86 有不同的重定位(因为它们的指令集不同)。

重定位也是特定于操作系统的,但一些相关的操作系统会尝试进行相同的重定位,例如 x86-64 的 Solaris 和 Linux

它们在ABI(应用程序二进制接口)规范“System V Application Binary Interface AMD64 Architecture Processor Supplement”中有详细描述。最初的 x86-64 ABI 曾经在http://www.x86-64.org/documentation.html上 ,但该站点几周后没有响应。旧副本在此链接上,新副本在此处

还有X32 ABI

另请参阅此问题

于 2013-03-18T06:41:37.563 回答