ldd производит разные выходные данные для одного и того же файла на разных хостах.

Я анализирую с помощью «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 на обоих хостах, но это не должно быть причиной. Я доказал это таким образом. Я скопировал /usr/bin/ldd с каждого хоста в NFS как /media/nfs/ldd_1, /media/nfs/ldd_2 и запустил оба ldd с обоих хостов. Оба ldd не показывают GLIBC_2.18 на первом хосте, но показывают его на другом хосте.

Вывод strings выглядит более надежным (независимым от хоста), как видно из моих примеров, и теперь я буду использовать только strings. Но я все же хотел бы знать, по какой причине ldd показывает другой вывод? Это правильно?


person Alexander Samoylov    schedule 25.02.2020    source источник


Ответы (1)


Я ожидаю, конечно, увидеть тот же результат,

Вы не должны: у вас установлены разные версии GLIBC: GLIBC 2.23-0ubuntu10 и GLIBC 2.23-0ubuntu11.

Чтобы лучше понять вывод версии, прочитайте это и/или этот ответ.

Но как это объяснить...

Если вы проверите ldd, который вы вызываете, вы обнаружите, что это сценарий оболочки, который устанавливает LD_TRACE_LOADED_OBJECTS переменную среды и вызывает динамический загрузчик /lib64/ld-linux-x86-64.so.2 для выполнения фактической работы. Динамический загрузчик является частью GLIBC.

На двух машинах установлены разные версии GLIBC -> разные динамические загрузчики загружают разные версии libc-so.6 (и других частей GLIBC) -> разные выходные данные. Здесь нет ничего удивительного.

person Employed Russian    schedule 29.02.2020
comment
Но как вы объясните, что и /media/nfs/ldd_1, и /media/nfs/ldd_2 не показывают GLIBC_2.18 на первом хосте, но показывают его на другом хосте, когда я вызываю их из NFS (я писал об этом в конец в моем вопросе)?. Похоже, что причина не в самом бинарнике ldd. Вероятно, ldd загружает другие файлы /lib/XXX.so, которые отличаются на каждом хосте, и это дает разную функциональность? - person Alexander Samoylov; 05.03.2020