Совместимы ли двоичные файлы ELF с ABI «System V» и «Linux»?

#c #linux #linker #cross-platform #elf

#c #линукс #линкер #кросс-платформенный #эльф

Вопрос:

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  

Мой идентификатор виртуальной машины сам по себе через 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  

Так вот почему мой исполняемый файл выходит из строя?

В чем еще может быть проблема?

Комментарии:

1. Вы строите для Херда? Мои библиотеки говорят, что система V.

2. Двоичный файл должен запускаться на сборках Android x86_64, работающих на эмуляторе, размещенном на машине, которую я «не назвал» выше. Одна и та же виртуальная машина является машиной сборки.

Ответ №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.so и libm.so .

Вы можете использовать -Wl,-t время ссылки, чтобы узнать, какой libc.so и libm.so какой компоновщик был выбран.