【问题标题】:Are ELF binaries with ABIs of 'System V' and 'Linux' mutually compatible?具有“System V”和“Linux”ABI 的 ELF 二进制文件是否相互兼容?
【发布时间】:2022-01-12 00:29:39
【问题描述】:

TL;DR : 我的二进制文件无法加载 /lib64/libm.so,我不知道为什么。看着精灵们模糊的小标题,唯一看起来不兼容的就是 ABI 编号。

长格式: 未找到声称该二进制文件的试运行炸弹 - 但它存在。

[aardvark@aardvark-burrow ~/project-src] ldd  /data/users/aardvark/project-src/buck-out/gen/arvr/libraries/perception/calib/metrics/metrics_test
/data/users/aardvark/project-src/buck-out/gen/arvr/libraries/perception/calib/metrics/metrics_test: error while loading shared libraries: /lib64/libc.so: invalid ELF header

cat-ing /lib64/libm.so 揭示:

/* GNU ld script
*/
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libm.so.6  AS_NEEDED ( /usr/lib64/libmvec_nonshared.a /lib64/libmvec.so.1 ) )

按照最后的链接,我得到了一个 ELF 文件。我阅读了标题和需要它的二进制文件,将它们填充到文本文件中,然后区分它们:

[aardvark@aardvark-burrow ~/project-src] diff ~/logs/elf.ray_transport_test.txt ~/logs/elf.libm.txt 
--- /home/aardvark/logs/elf.ray_transport_test.txt  2021-12-06 11:34:40.843179878 -0800
+++ /home/aardvark/logs/elf.libm.txt    2021-12-06 11:33:50.264101198 -0800
@@ -1,20 +1,20 @@
 ELF Header:
-  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
+  Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 
   Class:                             ELF64
   Data:                              2's complement, little endian
   Version:                           1 (current)
-  OS/ABI:                            UNIX - System V
+  OS/ABI:                            UNIX - GNU 
   ABI Version:                       0
   Type:                              DYN (Shared object file)
   Machine:                           Advanced Micro Devices X86-64
   Version:                           0x1
-  Entry point address:               0x13220
+  Entry point address:               0xc520
   Start of program headers:          64 (bytes into file)
-  Start of section headers:          15936800 (bytes into file)
+  Start of section headers:          2189472 (bytes into file)
   Flags:                             0x0
   Size of this header:               64 (bytes)
   Size of program headers:           56 (bytes)
   Number of program headers:         9
   Size of section headers:           64 (bytes)
-  Number of section headers:         40
-  Section header string table index: 39
+  Number of section headers:         37
+  Section header string table index: 36

我的 VM id 本身是通过 uname -a 获得的:

Linux aardvark-burrow.zoo.com 5.6.13-0_fbk17_hardened_5815_gc01d8dbd2635 #1 SMP Fri Jul 9 10:54:31 PDT 2021 x86_64 x86_64 x86_64 GNU/Linux

这就是我的可执行文件失败的原因吗?

还有什么问题?

【问题讨论】:

  • 你是在为赫德建造吗?我的库说 System V。
  • 二进制文件将在 x86_64 Android 版本上运行,该版本运行在我上面“未命名”的机器上托管的模拟器上。同一台 VM 是构建机器。

标签: c linux linker cross-platform elf


【解决方案1】:

您的错误消息指的是/lib64/libc.so,而不是/lib64/libm.so

看起来有些东西正在尝试加载libc.so(和libm.so而不是加载libc.so.6(和libm.so.6)。

由于.so 文件不是 ELF(它们是链接器脚本),当然尝试加载它们会失败。

假设负载发生是因为readelf -d metrics_test | grep NEEDED | egrep 'lib(c|m)\.so$ 非空,问题是metrics_test 未正确链接。

特别是,当metrics_test 被链接时,它获取了libc.solibm.so 的一些非链接器脚本版本。

您可以在链接时使用-Wl,-t 找出 libc.solibm.so 链接器选择了哪个。

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2017-10-11
    • 2011-04-15
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多