如何从 Linux 上的 Intel Pin 获取地址 space 布局?

How to get address space layout from Intel Pin on Linux?

我想从 Linux 上的 Intel Pin 获取地址 space 布局。

首先,我尝试读取文件 - /proc/PID/maps 并获取地址 space 布局。但是你什么时候执行这部分代码?

如果你把它放在PIN_StartProgram之前,地图文件将不会包含一些区域,比如heap

如果放在Fini里,用PIN_AddFiniFunction(Fini, 0);钩住,应该不错。但是,当您仅跟踪一次 ls 执行时,您看不到任何与输出相关的地址 space 布局。那是有线的。

Pin 有更细粒度的方法来解决 space 布局。您可以使用 IMG_AddInstrumentFunction() 获取图像加载的回调,并通过使用 RTN_Replace() 检测 malloc()free() 调用或什至检测 mmap() 来获取堆分配的回调,brk() 和其他用于堆分配的系统调用 PIN_AddSyscallEntryFunction().

您可以在 Pin 教程和 Pin 套件中的示例中找到使用这些 API 的示例。

也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址 space 还没有准备好。您可以等到所有图像加载完毕,然后读取procfs 的内容。

所以你应该为每个图像添加一个检测函数。例如在main函数中加入如下语句:

IMG_AddInstrumentFunction(Image, 0);

那么你应该在每次加载图像时阅读 procfs。这是因为你不知道最后加载的是哪张图片(当然,如果你知道最后一张是哪张图片,你可以简单地只读一次文件,在加载完那张图片后):

VOID Image(IMG img, VOID *v)
{
    ...
    /* open /proc/PID/maps and read its contents */
    ...
}

在程序执行过程中,你总是有地址space的最新映射,一切都会好起来的。尽管如此,您应该始终注意运行时布局修改,以及使用 brk() 系统调用增加堆大小等情况。