Qemu-arm не может запускать скомпилированные двоичные ключи
Я запускаю Linux Mint 14 с qemu, qemu-пользователем и установкой gnueabi toolchain. Я скомпилировал test.c с arm-linux-gnueabi-gcc test.c -o test
.
Когда я пытаюсь запустить qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 test
Я получаю сообщение об ошибке: test: error while loading shared libraries: test: cannot open shared object file: No such file or directory
. Выполняя qemu-arm test
, как я уже пробовал, дает /lib/ld-linux.so.3: No such file or directory
Однако файл существует и доступен.
$ stat /usr/arm-linux-gnueabi/lib/ld-linux.so.3
File: `/usr/arm-linux-gnueabi/lib/ld-linux.so.3' -> `ld-2.15.so'
Size: 10 Blocks: 0 IO Block: 4096 symbolic link
Device: 801h/2049d Inode: 4083308 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-04-22 16:19:48.090613901 -0700
Modify: 2012-09-21 08:31:29.000000000 -0700
Change: 2013-04-22 15:58:41.042542851 -0700
Birth: -
Кто-нибудь знает, как я могу заставить qemu запустить ручную программу без необходимости подражать целому плечу ядра Linux?
test.c
#include <stdio.h>
int main() {
printf("this had better work\n");
}
и file test
есть
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf2e49db65394b77c77ee5b65b83c0cc9220cbfc0, not stripped
Ответы
Ответ 1
Если вы хотите запустить ARM без Linux, вам нужен другой компилятор (по крайней мере). arm-linux-gnueabi-gcc
- это компилятор для Linux. Компилятор и libc
тесно связаны между собой. Вам понадобится компилятор newlib
с уровнем переносимости для qemu. портирование newlib
Смотрите: Balau и Google newlib + qemu. Порт newlib
размещен на Github и, похоже, похож на блог Balau.
Как правило, не-Linux gcc называется arm-none-eabi-gcc
. Префикс arm-none-eabi- распознается некоторыми скриптами configure.
Ответ 2
вы можете запустить пример, предоставив путь к общим libs-linux-gnueabi с использованием флага -L.
qemu-arm -L /usr/arm-linux-gnueabi/
также убедитесь, что LD_LIBRARY_PATH не установлен.
unset LD_LIBRARY_PATH
Ответ 3
Я также встретил эту проблему при запуске программы на языке C с кодом сборки. Мое решение состоит в том, чтобы создать исполняемый файл с опцией "-статический", например
arm-linux-gnueabi-gcc -static -g main.c square.s
Тогда
qemu-arm a.out
не сообщит об ошибке "Невозможно найти /lib/ld -linux.so.3".
Единственный недостаток заключается в том, что исполняемый файл может иметь большой размер. Но это полезно, когда вы просто хотите протестировать свой код.
Конечно, вы можете пойти с помощью метода из Балау (см. бесшумный ответ). Но если вы не хотите чувствовать себя разочарованным чем-то вроде "последовательных портов UART" на этом шаге, который предназначен только для запуска простой "тестовой" функции, попробуйте мое исправление.
Ответ 4
Я решил проблему, скопировав следующие библиотеки в /lib, но я считаю, что должно быть лучшее решение, а не это неприятное решение, которое я придумал!
sudo cp /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib
Пожалуйста, дайте мне знать, есть ли другие лучшие решения, которые мне интересны.
Ответ 5
$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi
Это работает для меня.
Это в основном то же самое, что:
$ qemu-arm -L /usr/arm-linux-gnueabi/
Вы можете добавить его в файл ~/.bashrc, поэтому вам не нужно вводить его каждый раз, когда вы открываете терминал.
Ответ 6
Вариант, который работал у меня, состоял в том, чтобы напрямую передать библиотеку загрузчика и указать необходимые пути библиотеки, используя параметр загрузчика --library-path
. Например:
$ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf
$ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable
Или эквивалентно экспортировать LD_LIBRARY_PATH
вместо --library-path
.