fame fame - 19 days ago 5
Linux Question

Cross compile from linux to ARM-ELF (ARM926EJ-S/MT7108)

I have installed all cross compile packages on my ubuntu system so far but am having a
problem and need some help.

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


This is the target machine I need to cross compile for. What flags should I
use when compiling?

Answer

apt-cache search arm | grep ^gcc- gives the following list,

  1. gcc-4.7-aarch64-linux-gnu - GNU C compiler
  2. gcc-4.7-arm-linux-gnueabi - GNU C compiler
  3. gcc-4.7-arm-linux-gnueabi-base - GCC, the GNU Compiler Collection (base package)
  4. gcc-4.7-arm-linux-gnueabihf - GNU C compiler
  5. gcc-4.7-arm-linux-gnueabihf-base - GCC, the GNU Compiler Collection (base package)
  6. gcc-4.7-multilib-arm-linux-gnueabi - GNU C compiler (multilib files)
  7. gcc-4.7-multilib-arm-linux-gnueabihf - GNU C compiler (multilib files)
  8. gcc-aarch64-linux-gnu - The GNU C compiler for arm64 architecture
  9. gcc-arm-linux-gnueabi - The GNU C compiler for armel architecture
  10. gcc-arm-linux-gnueabihf - The GNU C compiler for armhf architecture

You should install gcc-arm-linux-gnueabi which is an alias for gcc-4.7-arm-linux-gnueabi. gcc-4.7-multilib-arm-linux-gnueabi is also possible, but more complicated. Use the flags, -march=armv5te -mtune=arm926ej-s -msoft-float -mfloat-abi=soft. You can do more tuning by specifying the --param NAME=VALUE option to gcc with parameters tuned to your systems memory sub-system timing.

You may not be able to use these gcc versions as your Linux maybe compiled with OABI and/or be quite ancient compared to the one the compiler was built for. In some cases, the libc will call a newer Linux API, which may not be present. If the compiler/libc was not configured to be backwards compatible, then it may not work with your system. You can use crosstool-ng to create a custom compiler that is built to suit your system, but this is much more complex.