【问题标题】:How to interpret the output of the ldd program?如何解释 ldd 程序的输出?
【发布时间】:2015-12-23 03:11:51
【问题描述】:
[root@wdctc1281 bin]#  ldd node
        linux-vdso.so.1 =>  (0x00007fffd33f2000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f70f7855000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f70f764d000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f70f7345000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f70f7043000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f70f6e2d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f70f6c10000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f70f684f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f70f7a61000)

第一行和最后一行是什么意思?它们看起来不像正常的

xxxx.so => /lib64/xxxxx.so (0xxxxxxxxxxxxxxxxxxxx)

格式。

【问题讨论】:

  • 您是否尝试阅读 ldd 的手册页?它会准确地告诉你它的作用。
  • 我知道它的作用,但我不知道在我的情况下在哪里可以找到 linux-vdso.so.1(第一行),以及为什么没有指向 /lib64/ld 的箭头-linux-x86-64.so.2(最后一行)。

标签: linux gnu binutils ldd


【解决方案1】:

第一行是 VDSO。这在vdso(7) manpage 中有详细描述。基本上,它是一个嵌入在内核中的共享库,并且在执行新进程时自动加载。这就是为什么右侧没有文件系统路径的原因——没有!该文件仅存在于内核内存中(嗯,不是 100% 精确,但请参阅手册页了解更多信息)。

最后一行是 ELF 解释器。这在ld.so(8) manpage 中有详细描述。它具有完整路径的原因是因为您的程序中硬编码了完整路径。它在右侧没有条目的原因是它没有(直接)链接,因此没有执行搜索。您可以通过运行来检查:

$ readelf -l node | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ scanelf -i node
ET_EXEC /lib64/ld-linux-x86-64.so.2 node

所有其他行都是您链接的库。当您在文件上运行readelf -d 时,您可以通过查看DT_NEEDED 标签来查看这些内容。由于这些文件缺少完整路径,ld.so 需要对其执行动态路径搜索。这实际上是这些行告诉你的:“libdl.so.2 是必需的,所以当我搜索它时,我在/lib64/libdl.so.2 找到了它(并在地址0x00007f70f7855000 加载到内存中)”

【讨论】:

  • 您能详细说明一下吗? the reason it doesn't have an entry on the right side is that it's not linked against (directly) and thus no search was performed. 如果ldd 确实为某些二进制输出了<some non-standard absolute path>/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2,那说明什么?上述二进制文件依赖于左侧,它被解析到右侧..?
【解决方案2】:

ldd filename 显示文件使用的程序共享库。

例如,libc.so.6 是 libc 共享对象版本 6,它位于 /lib64 中,其内存位置为 0x00007f70f684f000。

最后一行谈到了 /lib64 下的 ld-linux-x86-64.so 版本 2。这家伙会找到并加载node需要的共享库。它将准备这些库并运行它们。所以,用非常粗略的术语来说,ld-linux-x86-64 是跑步者。 libc.so.6 和其他已加载,ldd 显示这些共享库的位置和内存位置。这是我的理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多