我想从Linux上的Intel Pin获取地址空间布局。
首先,我尝试读取文件 - /proc/PID/maps
并获取地址空间布局。但是你什么时候执行这部分代码?
如果您将其放在PIN_StartProgram
之前,那么地图文件将不会包含某些区域,例如heap
;
如果您将其放在Fini
中,并将其与PIN_AddFiniFunction(Fini, 0);
挂钩,则应该是好的。但是,当您只跟踪一个ls
执行时,您看不到任何与输出相关的地址空间布局。那是有线的。
答案 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()
系统调用来增加堆大小等情况。