44
votes

I have tried to understand the naming conventions behind the gcc cross-compilers, but there seems to be conflicting answers. I have the following three cross-compilers in my system:

  • arm-none-linux-gnueabi (CodeSourcery ARM compiler for linux)
  • arm-none-eabi (CodeSourcery ARM compiler for bare-metal systems)
  • arm-eabi (Android ARM compiler)

When reading through the GNU libtool manual, it specifies the cross-compiler naming convention as:

cpu-vendor-os (os = system / kernel-system)

This does not seem completely accurate with the compilers in my system. Is the information in the GNU manual old, or have the compiler distributors simply stopped following it?

2

2 Answers

33
votes

The naming comes down to this:

arch-vendor-(os-)abi

So for example:

x86_64-w64-mingw32 = x86_64 architecture (=AMD64), w64 (=mingw-w64 as "vendor"), mingw32 (=win32 API as seen by GCC)

i686-pc-msys = 32-bit (pc=generic name) msys binary

i686-unknown-linux-gnu = 32-bit GNU/linux

And your example specifically:

arm-none-linux-gnueabi = ARM architecture, no vendor, linux OS, and the gnueabi ABI.

The arm-eabi is alike you say, used for Android native apps.

One caveat: Debian uses a different naming, just to be difficult, so be careful if you're on a Debian-based system, as they have different names for eg. i686-pc-mingw32.

3
votes

The fact is that, there is a rule, and it is the one described above from rubenvb. But in several cases the naming you will find is incorrect, as:

gcc-pippotron-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
gcc-pippotron-arm-none-eabi-4.8-2013.11_linux

This maming above are 2 examples that are not respecting the rule.