Ldd не работает с динамически связанным двоичным кодом
У меня есть двоичный файл, который использует кучу .so файлов.
bash-3.00$ file foo
foo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.21, dynamically linked (uses shared libs), not stripped
Но если я запустил ldd в этом файле, он не смог забрать файлы .so, на которые зависит двоичный файл. '
bash-3.00$ ldd foo
not a dynamic executable
bash-3.00$
readelf действительно показывает список разделяемых библиотек, используемых двоичным..
bash-3.00$ readelf -d foo
Dynamic segment at offset 0x17c810 contains 70 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdl.so.2]
Почему ldd не может выбрать зависимости библиотеки в этом случае?
Ответы
Ответ 1
Как и в одном из комментариев, вы пытались использовать ldd на 64-битной системе для проверки 32-разрядного объекта ELF. ldd использует стандартный динамический компоновщик для отслеживания зависимостей, поэтому, если ваша платформа не имеет линкера, требуемого проверяемым объектом ELF, ldd терпит неудачу.
Readelf и objdump более надежны в этих ситуациях.
Ответ 2
Обратите внимание, что в Fedora 21 для получения ldd для идентификации 32-битных файлов .so мне пришлось установить следующее:
sudo yum install glibc.i686 libgcc.i686 libstdc++.i686 glibc-devel.i686
Я не уверен, какой из них исправил ошибку "не динамический исполняемый файл", которую я видел в ldd.