我已经建立了使用LSB SDK测试程序ELF(请注意,我的问题是不特定于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

我认为是未满足的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版本和体系结构而异)存在。 lddreadelf -l将能够显示您的可执行文件请求ELF解释。

lsbcc(或LSB工具链的东西)覆盖系统的默认/lib/ld-linux.so.2,可能通过传递-Wl,--dynamic-linker=/lib/ld-lsb.so.2到了编译器的原因,我认为是相当愚蠢的(Glibc的一贯提供相当出色的向后兼容性在这里),但有你有它。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top