mat*_*ath 12 linux elf dynamic-linking
我使用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
Run Code Online (Sandbox Code Playgroud)
但我无法启动它(是的,我向你保证,该文件是在目录...):
$ ./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
Run Code Online (Sandbox Code Playgroud)
我认为有一个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
Run Code Online (Sandbox Code Playgroud)
以防万一,这是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
Run Code Online (Sandbox Code Playgroud)
eph*_*ent 15
这看起来就像缺少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总是提供相当优秀的向后兼容性),但是你有它.)