кросс-компиляция для ARM: ошибка отсутствует, такой файл или каталог

Я написал простую программу 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: нет такой команды.

3
задан 14 April 2017 в 16:26

1 ответ

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

file cross_compiled_executable

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

interpreter /lib/ld-uClibc.so.0

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

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

Используйте подходящий компилятор, либо:

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

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

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

0
ответ дан 14 April 2017 в 16:26

Другие вопросы по тегам:

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