Я написал простую программу Hello world и скомпилировал ее с помощью компилятора gcc-arm-linux-gnueabi
. Он хорошо компилируется, но когда я пытаюсь выполнить его на компьютере ARM, он жалуется, что «нет такого файла или каталога». Я думаю, что gcc-arm-linux-gnueabi
для встроенного Linux только из-за e(mbedded)abi
. Отличается ли он от ARM Linux ABI?
Пожалуйста, помогите мне решить эту проблему.
код здесь
#include "stdio.h"
int main(void) {
printf("Hello world !\n");
return 0;
}
, скомпилированный как
> arm-linux-gnueabi-gcc -Wall -o crosscomp hello.c
Когда я выполняю это перекрестное сравнение на целевом ARM машинная ошибка - перекрестная компиляция. Нет такого файла или директории.
РЕДАКТИРОВАТЬ Когда я использовал arm-linux-gnueabi-gcc
, точка входа не совпадала с целевой точкой входа машины (readelf -l crosscom), но когда я скомпилировано с aarch64-linux-gnu-gcc
точкой входа, соответствующей целевой машине. Но теперь ошибка становится отказано в разрешении на ./crosscomp. Я попытался с sudo, который говорит crosscomp: нет такой команды.
Как идентифицировать проблему?
file cross_compiled_executable
Содержит что-то вроде:
interpreter /lib/ld-uClibc.so.0
, и проблема в том, что этот файл не существует на цели .
Как решить проблему?
Используйте подходящий компилятор, либо:
использовать собственный компилятор для цели. Но, как правило, цели гораздо медленнее, чем ваш хост, и из-за ограниченного пространства вам вряд ли захочется этого делать.
Вы также можете использовать функциональный эмулятор, такой как QEMU, для сборки, а затем запускать программы только на более медленной платформе, например, gem5 или медленная доска.
Просто взломать interpreter
потенциально недостаточно, особенно если вам необходимо обеспечить двоичную совместимость между программой и целевым libc, или интерфейсами программы и ядра (syscalls, /proc
и т. Д.) попробуйте использовать -static
(целевое ядро может быть слишком старым и не содержать требуемых интерфейсов). Единственное надежное решение - использовать правильный набор инструментов.