我想从 Linux 上的 Intel Pin 获取地址空间布局。
首先,我尝试读取文件 - /proc/PID/maps
并获取地址空间布局。但是你什么时候执行这部分代码呢?
如果你把它放在PIN_StartProgram
之前, map 文件将不会包含一些区域,比如heap
;
如果你把它放在Fini
中,并用PIN_AddFiniFunction(Fini, 0);
hook它,应该就可以了。但是,当您仅跟踪一次 ls
执行时,您看不到任何与输出相关的地址空间布局。那是有线的。
最佳答案
也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址空间还没有准备好。您可以等到所有图像都加载完毕,然后再读取 procfs 的内容。
所以你应该为每个图像添加一个检测函数。例如在main函数中添加如下语句:
IMG_AddInstrumentFunction(Image, 0);
那么你应该在每次加载图像时读取 procfs。这是因为你不知道最后加载的是哪张图片(当然,如果你知道最后一张是哪张图片,你可以在加载该图片后只读取一次文件):
VOID Image(IMG img, VOID *v)
{
...
/* open /proc/PID/maps and read its contents */
...
}
在程序执行期间,您始终拥有地址空间的最新映射,一切都会好起来的。尽管如此,您应该始终小心处理运行时布局修改,以及使用 brk()
系统调用增加堆大小等情况。
关于linux - 如何从 Linux 上的 Intel Pin 获取地址空间布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46282615/