Кросс-компиляция из 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-
дает следующий список,
- gcc-4.7-aarch64-linux-gnu - компилятор GNU C
- gcc-4.7-arm-linux-gnueabi - компилятор GNU C
- gcc-4.7-arm-linux-gnueabi-base - GCC, коллекция компиляторов GNU (базовый пакет)
- gcc-4.7-arm-linux-gnueabihf - компилятор GNU C
- gcc-4.7-arm-linux-gnueabihf-base - GCC, коллекция компиляторов GNU (базовый пакет)
- gcc-4.7-multilib-arm-linux-gnueabi - компилятор GNU C (мультибиблиотечные файлы)
- gcc-4.7-multilib-arm-linux-gnueabihf - компилятор GNU C (мультибиблиотечные файлы)
- gcc-aarch64-linux-gnu - компилятор GNU C для архитектуры arm64
- gcc-arm-linux-gnueabi - Компилятор GNU C для архитектуры armel
- 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
не удастся, самое простое решение будет найти правильный набор инструментов для вашей цели.