【问题标题】:How can I find which ELF dependency is not fulfilled?如何找到未满足的 ELF 依赖项?
【发布时间】:2010-12-06 10:22:50
【问题描述】:

我已经使用 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

【问题讨论】:

    标签: linux elf dynamic-linking


    【解决方案1】:

    这看起来就像缺少 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 一直提供相当出色的向后兼容性这里),但你有它。)

    【讨论】:

    • 就是这样,我的系统上没有 LSB 解释器 (/lib64/ld-lsb-x86-64.so.3)。事实上,我不知道我需要安装一个特定于 LSB 的解释器……有趣的是,LSB SDK 中的二进制文件不兼容 LSB。
    猜你喜欢
    • 2020-09-11
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2016-08-29
    • 2019-01-25
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多