0

在 Linux 上,您可以检查 /proc/$PID/pmaps 以查看特定程序加载的库,并且程序可以打开 /proc/self/pmaps 以检查它本身已加载的库。

我知道 pmaps 只会包含动态库,显然内核无法预测我们以后可能会打开哪些库,所以我希望这些库不包含在 /proc/self/maps 中。但我不确定其他一些情况:

  1. 是否包含在构建时已链接但我们尚未调用任何函数的库?我的理解是 Linux 会延迟链接符号,直到第一次使用它们,所以我不确定它们是否会出现。

  2. pmaps 是否包含所有递归使用的库?例如,如果我查看 pmaps 中的每个库并在其上运行 ldd,然后在这些库上运行 ldd,令人作呕,我不应该找到任何不在原始 pmaps 中的新库?我在几个二进制文件上试过这个,看起来是这样,但也许我很幸运。

4

2 回答 2

2

/proc/$pid/maps 不仅会列出已加载的库,还会列出所有其他映射的内存段。

阅读此线程和其中的文章:

了解 Linux /proc/id/maps

于 2013-02-08T22:23:37.413 回答
2

是否包含在构建时已链接但我们尚未调用任何函数的库?

是的:mmap在您的程序开始运行之前,运行时加载程序将您的可执行文件直接依赖的每个库。

您可以通过运行找到此类库的列表

readelf -d a.out | grep NEEDED

pmaps 是否包含所有递归使用的库?

是的:如果您直接依赖的库本身依赖于其他库,则运行时加载器也mmap将递归依赖。

我的理解是 Linux 会延迟链接符号,直到第一次使用它们

这对于函数符号来说大部分是正确的,但对于数据符号来说是错误的,不能懒惰地解决。

此外,符号是否被延迟解析取决于LD_BIND_NOW环境变量,以及可执行动态部分中的等效设置,由-znow链接器标志控制。

但是,这些都不会改变mmap图片;如果您的动态部分中有一个DT_NEEDED条目,则将被编辑(并将显示在)独立于惰性或非惰性分辨率。foo.sofoo.so mmap/proc/self/*map*

于 2013-02-10T03:02:26.760 回答