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