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

标签 c++ gcc ld glibc intel-pin

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

相关文章:

c - 我在动态库中重新定义了标准C库函数,但无法使用它

c++ - 返回对属性的引用 (GCC)

c - 对主 ld 的 undefined reference

c++ - 查看包含依赖项

c++ - 如果 const 引用也只需要一个拷贝,为什么在 C++11 中建议按值传递(如果需要拷贝)?

gcc - 了解 gcc 缩写

c - 在 Ubuntu 13.04 中用 C 语言演示缓冲区溢出

linux - 为什么 ld 找不到 libcurses.so,即使它在 `/usr/lib` 目录中?

c++ - 八位字节,四字还是什么?

c++ - 检查是否定义了 uint64_t