【问题标题】:Which libraries appear in /proc/$PID/pmaps?/proc/$PID/pmaps 中出现了哪些库?
【发布时间】:2013-02-08 22:04:27
【问题描述】:
在 Linux 上,您可以检查 /proc/$PID/pmaps 以查看特定程序加载的库,并且程序可以打开 /proc/self/pmaps 以检查其自身已加载的库。
我知道 pmaps 只会包含动态库,显然内核无法预测我们以后可能会打开哪些库,所以我希望这些库不包含在 /proc/self/maps 中。但我不确定其他一些情况:
是否包含在构建时已链接但我们尚未调用任何函数的库?我的理解是 Linux 会延迟链接符号直到第一次使用它们,所以我不确定它们是否会出现。
pmap 是否包含所有递归使用的库?例如。如果我查看 pmaps 中的每个库并在其上运行 ldd,然后在这些库上运行 ldd,令人作呕,我不应该找到任何不在原始 pmaps 中的新库?我在几个二进制文件上试过这个,似乎是这样,但也许我很幸运。
【问题讨论】:
标签:
linux
linker
dynamic-linking
dynamic-library
procfs
【解决方案1】:
是否包含在构建时已链接但我们尚未调用任何函数的库?
是的:在程序开始运行之前,运行时加载程序将 mmap 您的可执行文件直接依赖的每个库。
你可以通过运行找到此类库的列表
readelf -d a.out | grep NEEDED
pmap 是否包含所有递归使用的库?
是的:如果你直接依赖的库依赖于其他库,运行时加载器也会mmap递归依赖。
我的理解是 Linux 会延迟链接符号直到第一次使用它们
函数符号大部分正确,数据符号错误,懒得解决。
此外,符号是否被延迟解析取决于LD_BIND_NOW 环境变量,以及由-znow 链接器标志控制的可执行动态部分中的等效设置。
但这些都不会改变mmap pciture;如果您的动态部分中有 foo.so 的 DT_NEEDED 条目,则 foo.so 将是 mmaped(并将显示在 /proc/self/*map* 中)独立于惰性或非惰性分辨率。