Действительный исполняемый файл ARM не находит библиотеки

Я кросс-скомпилировал небольшую программу Hello World для встроенного устройства ARM (маршрутизатор Asus RT-AC68U с DD-WRT):

# arm-linux-gnueabi-g++ hello.cpp -mcpu=cortex-a9 -s -o hello

Файл выглядит нормально:

# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=5099693c31154cdd7f04c16ced5b80b1e35e625b, stripped

Это зависит от нескольких библиотек:

# readelf -d hello

Dynamic section at offset 0xf08 contains 26 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
(...)

Когда я пытаюсь выполнить файл в целевой системе, я получаю следующее:

# ./hello
-sh: ./hello: not found

Если я запускаю исполнение из ld-linux.so.3 без каких-либо других параметров все работает:

# /opt/lib/ld-linux.so.3 ./hello
Hello, world.

При перечислении библиотек файл, похоже, ищет библиотеки в папке / lib (их там нет, они находятся в / opt / lib):

# /opt/lib/ld-linux.so.3 --list ./hello
libstdc++.so.6 => /lib/libstdc++.so.6 (0x76dfb000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x76de0000)
libc.so.6 => /opt/lib/libc.so.6 (0x76cb2000)
libc.so => /lib/libc.so (0x76c35000)
/lib/ld-linux.so.3 => /opt/lib/ld-linux.so.3 (0x76f20000)

Я предполагаю, что ошибка связана с тем, что исполняемый файл при запуске сам по себе не находит необходимые разделяемые библиотеки. Все необходимые библиотеки находятся в папке / opt / lib, и эта папка включена в переменную среды LD_LIBRARY_PATH:

# echo $LD_LIBRARY_PATH
/lib:/usr/lib:/jffs/lib:/jffs/usr/lib:/jffs/usr/local/lib
:/mmc/lib:/mmc/usr/lib:/opt/lib:/opt/usr/lib

Как мне получить исполняемый файл, чтобы найти библиотеки в нужном месте?

Изменить: я попытался статически связать библиотеки в исполняемом файле, и программа отлично работает на целевой платформе. Однако это нереальное решение для того, что я хочу сделать.

4

Решение

Ваш ld-linux.so.3 оказывается в нестандартном месте (/opt/lib), и возможно, что ваш gcc указывает другой интерпретатор программы. Ты можешь использовать readelf -l <program> проверить, какой программный интерпретатор ожидает ваш бинарный файл PT_INTERP, «Запрашивающий переводчик программы»).

Если программный интерпретатор двоичного файла не подходит для вашей платформы, вы можете указать его вручную, передав -Wl,--dynamic-linker=/opt/lib/ld-linux.so.3 в gcc,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]