【问题标题】:ldd produces different output for the same file on different hostsldd 为不同主机上的同一文件产生不同的输出
【发布时间】:2020-06-09 09:17:44
【问题描述】:

我使用“ldd -v”分析来自两个不同构建主机的同一个共享库(在 NFS 上复制它)。两者都是 Ubuntu 16.04,并且似乎具有相同版本的 ldd

我当然希望看到相同的输出,但它的不同不仅仅是一点点。在第一个构建主机上,GLIBC_2.18 未显示在输出中,但在第二个构建主机上显示。

构建主机 #1。

$ uname -a
Linux build-nodejs01 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

$ strings /media/nfs/libtesseract.so | grep -e '^GLIBC_'
GLIBC_2.2.5
GLIBC_2.7
GLIBC_2.14
GLIBC_2.3

$ ldd -v /media/nfs/libtesseract.so | grep libc.so.
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff784308000)
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6

构建主机 #2。

$ uname -a
Linux build-linux64-viewer04 4.4.0-143-generic #169-Ubuntu SMP Thu Feb 7 07:56:38 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu10) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

$ strings /media/nfs/libtesseract.so | grep -e '^GLIBC_'
GLIBC_2.2.5
GLIBC_2.7
GLIBC_2.14
GLIBC_2.3

$ ldd -v /media/nfs/libtesseract.so | grep libc.so.
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdb02ddd000)
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.18) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6

两台主机上的二进制文件 /usr/bin/ldd 的 md5sum 不同,但这不应该是原因。我已经证明了这一点。我从 NFS 上的每个主机复制 /usr/bin/ldd 作为 /media/nfs/ldd_1、/media/nfs/ldd_2 并从两个主机运行两个 ldd。两个 ldd 在第一台主机上都不显示 GLIBC_2.18,而是在另一台主机上显示。

strings 输出看起来更可靠(与主机无关),从我的示例中可以看出,从现在开始我将只使用 strings。但我仍然想知道 ldd 显示不同输出的原因是什么?对吗?

【问题讨论】:

    标签: libc ldd


    【解决方案1】:

    我当然希望看到相同的输出,

    您不应该:您安装了不同版本的 GLIBC:GLIBC 2.23-0ubuntu10GLIBC 2.23-0ubuntu11

    要更好地了解版本输出,请阅读this 和/或this 答案。

    但是你怎么解释...

    如果您检查您正在调用的ldd,您会发现它是一个shell 脚本,它设置LD_TRACE_LOADED_OBJECTS 环境变量并调用动态加载器/lib64/ld-linux-x86-64.so.2 来完成实际工作。动态加载器是 GLIBC 的一部分。

    两台机器上安装了不同的 GLIBC 版本 -> 不同的动态加载程序加载了不同版本的 libc-so.6(以及 GLIBC 的其他部分)-> 不同的输出。 没有什么令人惊讶。

    【讨论】:

    • 但是您如何解释 /media/nfs/ldd_1 和 /media/nfs/ldd_2 都没有在第一台主机上显示 GLIBC_2.18,但是当我调用它们时在另一台主机上显示它来自 NFS(我在问题的最后写了这个)?。似乎原因不在 ldd 二进制文件本身。可能 ldd 会加载其他 /lib/XXX.so 在每个主机上都不同,这会提供不同的功能?
    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2014-05-06
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多