Can anyone explain the gcc cross-compiler naming convention?

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?


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.


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.