Linux 如何找到未满足的ELF依赖项?

Linux 如何找到未满足的ELF依赖项?,linux,elf,dynamic-linking,Linux,Elf,Dynamic Linking,我已经使用LSB SDK构建了一个测试ELF程序(请注意,我的问题不是针对LSB的): 但是我无法启动它(是的,我向您保证文件在目录中……: 我认为有一个ELF的依赖,这是没有实现,但我不知道如何找到它。是否有类似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, ve

我已经使用LSB SDK构建了一个测试ELF程序(请注意,我的问题不是针对LSB的):

但是我无法启动它(是的,我向您保证文件在目录中……:

我认为有一个ELF的依赖,这是没有实现,但我不知道如何找到它。是否有类似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
以防万一,这里是a.out的ELF动态部分:

 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在这里一直提供相当出色的向后兼容性),但现在你有了它。)

就是这样,我在系统上没有LSB解释器(/lib64/ld-LSB-x86-64.so.3)。事实上,我不知道有一个LSB特定的解释器,我需要安装。。。有趣的是,LSB SDK中的二进制文件不符合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
 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