如何在Linux上从Intel Pin获取地址空间布局?
我想从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
/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()
系统调用增加堆大小。您说“输出相关地址空间布局”是什么意思?您说“输出相关地址空间布局”是什么意思?