«Нет такого файла или каталога» при выполнении кросс-скомпилированной программы на малиновой пи

Недавно я купил Малину Пи. Я уже настроил его, и я устанавливаю кросс-компилятор для руки на моем рабочем столе (amd64). Я составил простую программу «hello world», а затем scp ./hello david@192.168.1.33:~/hello ее с рабочего стола на свой Pi с помощью scp ./hello david@192.168.1.33:~/hello . После входа в мой Pi я запустил ls -l hello и получил нормальный ответ:

 -rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello 

Но когда я пытаюсь выполнить его, я получаю следующее:

 david@raspberry-pi:~$ ./hello -bash: ./hello: No such file or directory david@raspberry-pi:~$ file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x6a926b4968b3e1a2118eeb6e656db3d21c73cf10, not stripped david@raspberry-pi:~$ ldd hello not a dynamic executable 

  • Подождите, пока появилось сетевое устройство, прежде чем приступить к загрузке другого сетевого устройства?
  • Может ли distcc использовать ccache на серверах компиляции?
  • Неизвестная проблема - после нескольких минут после Debian
  • Кросс-компиляционное ядро ​​не может найти gcc
  • Как захватить все конфигурации системы и применить к удаленным машинам?
  • Акции NFS (Windows с использованием FreeNFS, но подключение к Linux)
  • Wget: ошибка сегментации (сбрасывание ядра)
  • Не удалось запустить сеть на Alpine linux
  • 3 Solutions collect form web for “«Нет такого файла или каталога» при выполнении кросс-скомпилированной программы на малиновой пи”

    Если ldd говорит, что это не динамический исполняемый файл, он был скомпилирован для неправильной цели.

    Очевидно, вы выполнили кросс-компиляцию, так как file говорит, что это 32-разрядный исполняемый файл ARM. Тем не менее, существует более одной архитектуры ARM, поэтому, возможно, ваша привязка была настроена неправильно.

    Если вы используете crosstool-NG, посмотрите на .config для значения CT_ARCH_ARCH . Для малины pi это должно быть «armv6j» 1 – или, по крайней мере, это то, что работает для меня. Есть и другие особенности, но я думаю, этого должно быть достаточно. К сожалению, если это не так, вам нужно перестроить.

    ИМО, получающий перекрестный компилятор для работы на рабочем месте, может быть утомительным и разочаровывающим, но, полагая, что хост не является существенным фактором (это не должно быть), в этом случае это можно сделать. Crosstool-ng использует конфигуратор TLI, поэтому, если вам нужно попробовать несколько сборок, каждый раз записывайте свои варианты, чтобы вы знали, что сработало.

    1 Я считаю, что armv7 – гораздо более распространенная арка (много телефонов и т. Д.), Поэтому, если вы просто используете то, что, по вашему мнению, является обобщенным кросс-компилятором ARM, это, вероятно, проблема. Эти цифры сбивают с толку, поскольку, например, процессор pi является ARM11 , но (согласно этой странице), семейство процессоров ARM11 использует архитектуру ARMv6 – то есть ARM11 представляет собой реализацию ARMv6.

    сначала скомпилируйте свою программу с --static опции --static , затем проверьте ее. если он работает как статический, то на малине pi

     cat "programname" | grep "lib*" /lib/ld-linux.so.3 libc6.so 

    затем проверьте все библиотеки, если они там

    Я так решил. У меня есть /lib/ld-linux-armhf-so.3 но не /lib/ld-linux.so.3 тогда сделайте ln -s между тем, который работал для меня

    Библиотеки целевой системы отличаются от библиотек хост-системы, в которую был скомпилирован ваш исполняемый файл.

    Если вы используете make, вы должны включить –статический вариант в ваших CFLAGS и LDGLAGS. Если вы используете прямой gcc, используйте параметр -static, так что исполняемый файл переносится.

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.