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

如何在Linux上从Intel Pin获取地址空间布局?,linux,intel-pin,Linux,Intel Pin,我想从Linux上的Intel Pin获取地址空间布局 首先,我尝试读取文件-/proc/PID/maps,并获取地址空间布局。但是什么时候执行这部分代码呢 如果将其放在PIN_StartProgram之前,则贴图文件将不包含某些区域,如堆 如果您将其放入Fini,并使用PIN\u addfini函数(Fini,0)钩住它,它应该是好的。但是,当您仅跟踪一个ls执行时,您无法看到任何与输出相关的地址空间布局。这是有线的。Pin有一种更细粒度的地址空间布局方法。您可以使用IMG\u AddInst

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

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

如果将其放在
PIN_StartProgram
之前,则贴图文件将不包含某些区域,如


如果您将其放入
Fini
,并使用
PIN\u addfini函数(Fini,0)钩住它,它应该是好的。但是,当您仅跟踪一个
ls
执行时,您无法看到任何与输出相关的地址空间布局。这是有线的。

Pin有一种更细粒度的地址空间布局方法。您可以使用
IMG\u AddInstrumentFunction()
获取映像加载的回调,并通过使用
RTN\u Replace()
或甚至检测
mmap()
brk()来检测
malloc()
free()
调用来获取堆分配的回调
和使用
PIN\u AddSyscallEntryFunction()进行堆分配的其他系统调用。


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

Pin有一种更细粒度的方法来处理空间布局。您可以使用
IMG\u AddInstrumentFunction()
获取映像加载的回调,并通过使用
RTN\u Replace()
或甚至检测
mmap()
brk()来检测
malloc()
free()
调用来获取堆分配的回调
和使用
PIN\u AddSyscallEntryFunction()进行堆分配的其他系统调用。


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

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

因此,您应该为每个图像添加一个插装函数。例如,将以下语句添加到主函数:

IMG_AddInstrumentFunction(Image, 0);
然后,您应该在每次加载图像时读取procfs。这是因为您不知道最后加载的图像是哪一个图像(当然,如果您知道最后加载的图像是哪一个图像,那么您只需在加载该图像后读取文件一次即可):


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

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

因此,您应该为每个图像添加一个插装函数。例如,将以下语句添加到主函数:

IMG_AddInstrumentFunction(Image, 0);
然后,您应该在每次加载图像时读取procfs。这是因为您不知道最后加载的图像是哪一个图像(当然,如果您知道最后加载的图像是哪一个图像,那么您只需在加载该图像后读取文件一次即可):


在程序执行期间,您始终拥有地址空间的最新映射,一切都会很好。尽管如此,您在修改运行时布局时应始终小心,例如使用
brk()
系统调用增加堆大小。

您说“输出相关地址空间布局”是什么意思?您说“输出相关地址空间布局”是什么意思?