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

时间:2017-09-18 15:05:49

标签: linux intel-pin

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

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

如果您将其放在PIN_StartProgram之前,那么地图文件将不会包含某些区域,例如heap;

如果您将其放在Fini中,并将其与PIN_AddFiniFunction(Fini, 0);挂钩,则应该是好的。但是,当您只跟踪一个ls执行时,您看不到任何与输出相关的地址空间布局。那是有线的。

2 个答案:

答案 0 :(得分:0)

Pin具有更细粒度的方法来解决空间布局问题。您可以使用IMG_AddInstrumentFunction()获取图像加载的回调,并通过使用malloc()检测free()RTN_Replace()调用或甚至检测mmap()来获取堆分配的回调,{ {1}}以及使用brk()进行堆分配的其他系统调用。

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

答案 1 :(得分:0)

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

因此,您应该为每个图像添加一个检测功能。例如,将以下语句添加到main函数:

IMG_AddInstrumentFunction(Image, 0);

然后你应该在每次加载图像时阅读procfs。这是因为您不知道哪个图像是最后一个图像(当然,如果您知道哪个图像是最后一个图像,您只需在加载该图像后只读取一次该文件):

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

在执行程序期间,您始终拥有地址空间的最新映射,一切都会正常。尽管如此,您应该始终注意运行时布局修改,使用brk()系统调用来增加堆大小等情况。