“Никакой такой файл или каталог” при выполнении кросс-скомпилированной программы на Raspberry Pi

Да. Я даже сделал это во времена DOS, когда я запрограммировал в Паскале. Я предполагаю, что принцип все еще содержит:

  1. Близкий stdout
  2. Вновь откройте stdout как консоль
  3. Запишите вывод в stdout

Это действительно повреждало любые каналы.

8
17.11.2013, 22:35
4 ответа

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

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

Если Вы используете crosstool-NG, взглянули на .config для значения CT_ARCH_ARCH. Для пи малины это должен быть "armv6j" 1 - или по крайней мере, это - то, что работает на меня. Существуют другие специфические особенности, но я думаю, что это должно быть достаточно. К сожалению, если это неправильно, теперь необходимо восстановить.

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

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

5
27.01.2020, 20:12

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

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

0
27.01.2020, 20:12

Сначала компилируйте вашу программу с помощью - статической , затем проверьте его. Если он работает как статичный, то на Raspberry Pi

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

, то проверьте все libs, если они там

, я решил, как это. У меня /lib/ld-linux-armhf-so.3 , но не /lib/ld-linux.so.3 Затем сделайте LN -S между работал для меня

1
27.01.2020, 20:12

Как определить проблему?

file cross_compiled_executable

Содержит что-то вроде:

interpreter /lib/ld-uClibc.so.0

и проблема в том, что этот файл не существует на целевом устройстве.

Как решить проблему?

Используйте правильный компилятор,либо:

  • Человек, создавший образ диска, должен предоставить вам кросс-компилятор или точно рассказать, как его собрать, например. с поперечным инструментом -нг . Как его получить для RPI спрашивали здесь .
  • скомпилируйте свой собственный образ и кросс-компилятор, например. с Buildroot . Вот общий пример QEMU . Buildroot имеет поддержку RPI .
  • используйте собственный компилятор на цели. Но обычно цели намного медленнее, чем ваш хост, и ограничены в пространстве, поэтому вы, вероятно, не захотите этого делать.

    Вы также можете использовать функциональный эмулятор, такой как QEMU, для сборки, а затем запускать программы только на более медленной платформе, например. gem5 или медленная доска.

Просто взломать interpreterпотенциально недостаточно, в частности, вы должны обеспечить бинарную совместимость между программой и целевой libc или интерфейсами программы и ядра (, системными вызовами, /procи т. д. ), если вы пытаетесь использовать-static(целевое ядро ​​может быть слишком старым и не содержать необходимых интерфейсов ). Единственное надежное решение — использовать правильную цепочку инструментов.

2
27.01.2020, 20:12

Теги

Похожие вопросы