Кросс-компиляция из Linux в ARM-ELF (ARM926EJ-S/MT7108)

На данный момент я установил все кросс-компиляционные пакеты в мою систему Ubuntu, но у меня возникла проблема, и мне нужна помощь.

Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 184.72
Features        : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 32768
I assoc         : 4
I line length   : 32
I sets          : 256
D size          : 32768
D assoc         : 4
D line length   : 32
D sets          : 256

Hardware        : MT7108
Revision        : 0000
Serial          : 0000000000000000

Это целевая машина, для которой мне нужно выполнить кросс-компиляцию. Какие флаги мне следует использовать при компиляции?

2 ответа

Решение

apt-cache search arm | grep ^gcc- дает следующий список,

  1. gcc-4.7-aarch64-linux-gnu - компилятор GNU C
  2. gcc-4.7-arm-linux-gnueabi - компилятор GNU C
  3. gcc-4.7-arm-linux-gnueabi-base - GCC, коллекция компиляторов GNU (базовый пакет)
  4. gcc-4.7-arm-linux-gnueabihf - компилятор GNU C
  5. gcc-4.7-arm-linux-gnueabihf-base - GCC, коллекция компиляторов GNU (базовый пакет)
  6. gcc-4.7-multilib-arm-linux-gnueabi - компилятор GNU C (мультибиблиотечные файлы)
  7. gcc-4.7-multilib-arm-linux-gnueabihf - компилятор GNU C (мультибиблиотечные файлы)
  8. gcc-aarch64-linux-gnu - компилятор GNU C для архитектуры arm64
  9. gcc-arm-linux-gnueabi - Компилятор GNU C для архитектуры armel
  10. gcc-arm-linux-gnueabihf - Компилятор GNU C для архитектуры armhf

Вы должны установить gcc-arm-linux-gnueabi, который является псевдонимом для gcc-4.7-arm-linux-gnueabi. gcc-4.7-multilib-arm-linux-gnueabi также возможен, но более сложен. Используйте флаги, -march=armv5te -mtune=arm926ej-s -msoft-float -mfloat-abi=soft, Вы можете сделать больше настройки, указав --param NAME=VALUE возможность gcc с параметрами, настроенными на синхронизацию подсистемы памяти вашей системы.

Возможно, вы не сможете использовать эти gcc версии вашего Linux могут быть скомпилированы с OABI и / или быть довольно древними по сравнению с той, для которой был создан компилятор. В некоторых случаях libc будет вызывать более новый Linux API, который может отсутствовать. Если компилятор /libc не был настроен на обратную совместимость, он может не работать с вашей системой. Вы можете использовать http://crosstool-ng.org/, чтобы создать собственный компилятор, созданный для вашей системы, но это намного сложнее.

У вас есть ARMv5 без процессора с плавающей запятой. Этого должно было быть достаточно с -march=armv5 а также -mfloat-abi=soft флаги.

Однако, если эти флаги у вас не работают, я бы предложил написать самое маленькое c-приложение для тестирования цепочки инструментов.

/* no includes */
int main(void) {   
    return 42;
}

и скомпилировать его с наиболее полными / строгими флагами

$arm-linux-gnueabi-gcc -Wall --static -O2 -marm -march=armv5 simple.c -o simple

после этого нажмите simple чтобы нацелиться, запустите его, затем выполните echo $? чтобы убедиться, что вы получите 42, Если это работает, попробуйте посмотреть, сможете ли вы получить printf за работой. Если это тоже работает, вы в значительной степени настроены на все. Если printf не удастся, самое простое решение будет найти правильный набор инструментов для вашей цели.

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