Как я могу найти, какая зависимость эльфа не выполнена?
-
21-09-2019 - |
Вопрос
Я построил программу тестовых эльфов с использованием LSB SDK (Обратите внимание, что мой вопрос не специфичен для LSB):
$ /opt/lsb/bin/lsbcc tst.c
$ ls -l a.out
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
Но я не могу запустить его (Да, я заверяю вам файл является В каталоге ...):
$ ./a.out
bash: ./a.out: No such file or directory
$ uname -a
Linux math 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux
Я думаю, что есть зависимость от эльфа, которая не выполнена, но я не знаю, как ее найти. Есть ли инструмент, похожий на LDD для библиотек, который можно использовать для поиска отсутствующего звена?
Я не думаю, что это связано с разницей 2.6.15/2.6.28-15, потому что компилятор LSB работает:
$ file /opt/lsb/bin/lsbcc
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped
На всякий случай, вот динамический раздел ELF A.out:
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400428
0x000000000000000d (FINI) 0x400638
0x0000000000000004 (HASH) 0x400278
0x0000000000000005 (STRTAB) 0x400350
0x0000000000000006 (SYMTAB) 0x4002a8
0x000000000000000a (STRSZ) 121 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 24 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400410
0x0000000000000007 (RELA) 0x4003f8
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x4003d8
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x4003ca
0x0000000000000000 (NULL) 0x0
Решение
Это похоже на то, что происходит, когда интерпретатор ELF отсутствует.
Обеспечить, что /lib/ld-lsb.so.2
(или аналогично; существует варьируется по версии и архитектуре LSB). ldd
а также readelf -l
сможет показать переводчику ELF, который запрашивает ваш исполняемый файл.
(lsbcc
(или что -то в инструментальном положении LSB) переопределяет по умолчанию системы /lib/ld-linux.so.2
, вероятно, проходя -Wl,--dynamic-linker=/lib/ld-lsb.so.2
Для компилятора, по причинам, я считаю довольно глупыми (Glibc всегда обеспечивал здесь довольно превосходную обратную связь), но там у вас есть.)