Да. Я даже сделал это во времена DOS, когда я запрограммировал в Паскале. Я предполагаю, что принцип все еще содержит:
Это действительно повреждало любые каналы.
Если 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.
Библиотеки целевой системы отличаются от библиотек хостовой системы, на которой был скомпилирован ваш исполняемый файл.
Вам следует включить опцию --static в CFLAGS и LDGLAGS, если вы используете make. Если вы используете прямой gcc, используйте опцию --static, так исполняемый файл будет переносимым.
Сначала компилируйте вашу программу с помощью - статической
, затем проверьте его. Если он работает как статичный, то на 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
между
работал для меня
Как определить проблему?
file cross_compiled_executable
Содержит что-то вроде:
interpreter /lib/ld-uClibc.so.0
и проблема в том, что этот файл не существует на целевом устройстве.
Как решить проблему?
Используйте правильный компилятор,либо:
используйте собственный компилятор на цели. Но обычно цели намного медленнее, чем ваш хост, и ограничены в пространстве, поэтому вы, вероятно, не захотите этого делать.
Вы также можете использовать функциональный эмулятор, такой как QEMU, для сборки, а затем запускать программы только на более медленной платформе, например. gem5 или медленная доска.
Просто взломать interpreter
потенциально недостаточно, в частности, вы должны обеспечить бинарную совместимость между программой и целевой libc или интерфейсами программы и ядра (, системными вызовами, /proc
и т. д. ), если вы пытаетесь использовать-static
(целевое ядро может быть слишком старым и не содержать необходимых интерфейсов ). Единственное надежное решение — использовать правильную цепочку инструментов.