I Кросс-платформенный небольшую программу Hello World для ARM встроенных устройств (Маршрутизатор Asus RT-AC68U работает DD-WRT):Действительно ARM исполняемым не находит библиотеки
# 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
Как получить исполняемый файл, чтобы найти библиотеки в нужном месте?
Редактировать: Я попытался связать библиотеки статически в исполняемом файле, и программа отлично работает на целевой платформе. Однако это не приемлемое решение для того, что я хочу сделать.
Возможно, вам просто нужно установить разрешение exec на ваш двоичный файл, например: 'chmod a + x./Hello' – dewaffled
@frymode Спасибо, но это не так, у него есть правильные флаги:' -rwxr-xr-x 1 root root 5720 Jan 10 11:40 hello' – charles
Есть ли новая строка в вашей 'LD_LIBRARY_PATH' или это просто артефакт из копирования и вставки? – nneonneo