首页 > 解决方案 > Intel 引脚修改指令地址

问题描述

我正在尝试使用 Intel Pin-tool 工具对可执行二进制文件进行一些指令分析。

在分析我的 Pin-tool 中执行的指令后,我观察到收到的指令地址(程序计数器)值范围与我在使用objdump -d -S <binary>. 我正在标准的 Linux/bin/ls可执行二进制文件上对其进行测试。

根据我的理解,Pin 修改了原始二进制文件以放置自己的“钩子”来收集执行相关信息,这些信息在我们想要的 Pin 工具中调用回调进行分析。因此,这自然会导致实际执行的二进制文件与原始文件不同。不幸的是,我不知道其他关于 Pin 的幕后花絮。

我想知道是否有任何方法可以保留原始代码布局,或者获得旧二进制和新二进制指令地址之间的某种对应关系?

标签: x86instrumentationintel-pin

解决方案


现代发行版使用 PIE 可执行文件,它们是在运行时重定位的 ELF 共享对象。 objdump仅向您显示相对于图像库的地址。 gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?x86-64 Linux中不再允许使用 32 位绝对地址?

您可以像 GDB 那样禁用 ASLR,这样它总是会重新定位到同一个地方,例如0x55555...,但它仍然不会匹配objdump地址。

你可以我认为objdump --adjust-vma=offset用来重新定位你的拆卸。

或者您可以使用 objdump 构建非 PIE 可执行文件,gcc -no-pie -fno-pie -O3这样 objdump 将知道每条指令的真实运行时地址。


推荐阅读