我想从linux上的intel pin获取地址空间布局。
首先,我尝试读取文件-/proc/PID/maps
并获取地址空间布局。但是你什么时候执行这部分代码呢?
如果将其放在PIN_StartProgram
之前,则映射文件将不包含某些区域,如heap
;
如果你把它放在Fini
中,并用PIN_AddFiniFunction(Fini, 0);
钩住它,它应该是好的。但是,当您只跟踪一个ls
执行时,您看不到任何与输出相关的地址空间布局。那是有线的。
最佳答案
也许不是最好的解决办法,但对我来说很有效。主要问题是当工具启动时,地址空间还没有准备好。您可以等到加载了所有图像,然后读取procfs的内容。
所以应该为每个图像添加一个instrumentation函数。例如,向主函数添加以下语句:
IMG_AddInstrumentFunction(Image, 0);
然后应该在每次加载图像时读取procfs。这是因为您不知道哪个映像是最后加载的映像(当然,如果您知道哪个映像是最后加载的映像,则只需在加载该映像后读取该文件一次即可):
VOID Image(IMG img, VOID *v)
{
...
/* open /proc/PID/maps and read its contents */
...
}
在程序执行过程中,您总是有地址空间的最新映射,一切都会好起来的。尽管如此,对于运行时布局修改,您应该始终小心,例如使用
brk()
系统调用增加堆大小。