目标代码重定位和 Intel Pin 交互

Posted

技术标签:

【中文标题】目标代码重定位和 Intel Pin 交互【英文标题】:Object code relocation and Intel Pin interaction 【发布时间】:2013-03-06 10:35:10 【问题描述】:

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

【问题讨论】:

【参考方案1】:

重定位是特定于处理器的,因此 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 但该网站几周后没有响应。旧版本在 this link 上,新版本在 here

还有X32 ABI

另见this question。

【讨论】:

谢谢,巴西尔。我仍然不允许投票赞成你的答案,因为我的票数少于 15。

以上是关于目标代码重定位和 Intel Pin 交互的主要内容,如果未能解决你的问题,请参考以下文章

现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个

Golang内部构件,第3部分:链接器,目标文件和重定位

代码重定位和位置无关码

ELF文件认知(二)可重定位目标文件

代码重定位

s3c2440裸机-代码重定位(2.编程实现代码重定位)