我正在开发一个多处理器架构模拟器,该模拟器使用 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 架构