【问题标题】: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 中。但我不确定其他一些情况:

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

  2. 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.soDT_NEEDED 条目,则 foo.so 将是 mmaped(并将显示在 /proc/self/*map* 中)独立于惰性或非惰性分辨率。

    【讨论】:

      【解决方案2】:

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

      阅读此主题和其中的文章:

      Understanding Linux /proc/id/maps

      【讨论】:

        猜你喜欢
        • 2021-06-12
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 2015-03-21
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        相关资源
        最近更新 更多