#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
какой компоновщик был выбран.