2016-01-10 7 views
4

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 

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

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

+0

Возможно, вам просто нужно установить разрешение exec на ваш двоичный файл, например: 'chmod a + x./Hello' – dewaffled

+0

@frymode Спасибо, но это не так, у него есть правильные флаги:' -rwxr-xr-x 1 root root 5720 Jan 10 11:40 hello' – charles

+0

Есть ли новая строка в вашей 'LD_LIBRARY_PATH' или это просто артефакт из копирования и вставки? – nneonneo

ответ

4

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

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

+0

@nneoneo Ты гений, который исправил это. Бесконечно благодарен. Команда компиляции, которую я использовал, выглядит следующим образом: 'arm-linux-gnueabi-g ++ hello.cpp -mcpu = cortex-a9 -Wl, - dynamic-linker =/opt/lib/ld-linux.so.3 -o привет ' – charles

 Смежные вопросы

  • Нет связанных вопросов^_^