Linux 哪些库出现在/proc/$PID/pmaps中?

Linux 哪些库出现在/proc/$PID/pmaps中?,linux,linker,dynamic-linking,dynamic-library,procfs,Linux,Linker,Dynamic Linking,Dynamic Library,Procfs,在Linux上,您可以检查/proc/$PID/pmaps以查看特定程序加载的库,并且程序可以打开/proc/self/pmaps以检查它自己加载的库 我知道pmap只包含动态库,显然内核无法预测我们以后可能会打开哪些库,所以我希望这些库不会包含在/proc/self/maps中。但我不确定还有其他几种情况: 是否包含在构建时已链接但我们尚未在中调用任何函数的库?我的理解是Linux会延迟链接符号,直到它们第一次被使用,所以我不确定它们是否会出现 PMAP是否包含递归使用的所有库?例如,如果我查

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

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

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

  • PMAP是否包含递归使用的所有库?例如,如果我查看PMAP中的每个库并在其上运行ldd,然后在这些库上运行ldd,那么我不应该找到任何不在原始PMAP中的新库?我在两个二进制文件上试过这个,看起来是这样,但也许我运气好


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

    阅读此帖子和其中的文章:


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

    阅读此帖子和其中的文章:

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

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

    您可以通过运行

    readelf -d a.out | grep NEEDED
    
    PMAP是否包含递归使用的所有库

    是:如果直接依赖于自身的库依赖于其他库,则运行时加载程序也将
    mmap
    递归依赖项

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

    对于函数符号,这是非常正确的,但是对于数据符号,这是错误的,因为数据符号不能被懒散地解析

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

    但所有这些都不会改变
    mmap
    pciture;如果在动态部分中有
    DT_NEEDED
    项用于
    foo.so
    ,则
    foo.so
    将被
    mmap
    ed(并在
    /proc/self/*map*
    中显示),与延迟或非延迟解析无关

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

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

    您可以通过运行

    readelf -d a.out | grep NEEDED
    
    PMAP是否包含递归使用的所有库

    是:如果直接依赖于自身的库依赖于其他库,则运行时加载程序也将
    mmap
    递归依赖项

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

    对于函数符号,这是非常正确的,但是对于数据符号,这是错误的,因为数据符号不能被懒散地解析

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

    但所有这些都不会改变
    mmap
    pciture;如果在动态部分中有
    DT_NEEDED
    项用于
    foo.so
    ,则
    foo.so
    将被
    mmap
    ed(并在
    /proc/self/*map*
    中显示),与延迟或非延迟解析无关