Here is an excellent doc.

Tool chains have a loose name convention like arch [-vendor] [-os] - eabi

 arch -    refers to target architecture (which in our case is ARM)
 vendor -  refers to toolchain supplier
 os -      refers to the target operating system
 eabi -    refers to Embedded Application Binary Interface

some illustrations as follows :

  • arm-none-eabi - This tool chain targets for ARM architecture, has no vendor, does not target an operating system and complies with the ARM EABI.
  • arm-none-linux-gnueabi - This toolchain targets the ARM architecture, has no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI. It is used to target ARM-based Linux systems.
Answer from zhigang on Stack Overflow
🌐
Arm Community
community.arm.com › support-forums › f › armds-forum › 5625 › key-difference-between-gcc-arm-none-eabi-and-arm-eabi
Key difference between GCC arm-none-eabi and arm-eabi
July 29, 2015 - Have a question about working on Arm technology? Browse our support forums for solutions to your questions, answer questions from fellow community members and get help from Arm experts.
Discussions

difference gcc-arm-none-eabi and arm-none-eabi-gcc
Hi I am am using stm32f103 and i was using Keil. but i want to use gcc compiler. I am confused between these two toolchain. More on forum.allaboutcircuits.com
🌐 forum.allaboutcircuits.com
4
April 11, 2020
embedded - Difference between arm-none-eabi and arm-linux-gnueabi? - Stack Overflow
What is the difference between arm-none-eabi and arm-linux-gnueabi? I know the difference in how to use them (one for bare metal software, the other one for software meant to be run on linux). But ... More on stackoverflow.com
🌐 stackoverflow.com
What are the purposes of the ARM ABI and EABI? - Stack Overflow
The more I look at this PDF (Application Binary Interface for the ARM Architecture: The Base Standard) the less I understand what it means. Also I'd like some comments on Procedure Call Standard fo... More on stackoverflow.com
🌐 stackoverflow.com
embedded - What is the difference between aarch64-none-elf and arm-none-eabi? - Stack Overflow
From what I undestand, aarch64-none-elf targets 64-bit ARMv8-A, while arm-none-eabi targets 32-bit ARMv7 and earlier, it cannot compile for aarch64, right?. Aarch64-none-elf uses ELF, while arm-non... More on stackoverflow.com
🌐 stackoverflow.com
🌐
Reddit
reddit.com › r/embedded › whats "gcc-arm-none-eabi" toolchain ??
r/embedded on Reddit: Whats "gcc-arm-none-eabi" toolchain ??
September 10, 2025 -

gcc-arm-none-eabi toolchain, my major question is, why is it made and for what problem to solve ? before toolchains existed, what were the methods used to program a chip ??

also, who makes toolchains and how are they doing it ??

Top answer
1 of 12
185
Gcc-arm-none-eabi is the gcc compiler toolchain for arm outside of a hosted environment. This means that it compiles bare metal code: code running without an already existing OS. ‘Normal’ gcc uses libraries from the system where its installed, so if you compile a hello world links to and uses the standard library. Gcc-arm would mean that the compiler is a cross compiler: its installed on your system but it compiles for arm. On an arm processor could run a full fledged linux environment so a gcc-arm-aarch64-linux or something like that would compile a program on your pc for that arm system running linux. Now there are meriads of arm systems not running linux which needs code to be compiled for as well. This is the place for the none-eabi variant: it does not use any system library and uses a standard interface for calling functions and other stuff. So in other words this is just the bare metal cross compiler for arm systems. And who makes these? Anyone who wants to. Gcc is an open source project and anyone could compile the toolchain. With compiling you can ‘select’ your version: do you want to build a linux-on-riscv compiler running on your pc? Definitely possible! The linux distro repos contain a couple of standard versions of gcc of which arm-none-eabi is one
2 of 12
24
It contains the compiler, linker, and other helpful utilities to make code that can be loaded onto a microcontroller. Before any of those utilities existed, you could literally flip switches on a console to set your program in memory. You had to know the hex values for all your opcodes, and how each one expected parameters to be formatted. Programs were very limited. Compilers came along (like gcc) that took slightly more readable code (like assembly or C) and automatically converted them into a binary file. Then linkers showed up to automatically connect up multiple C files and create more complex programs. At the same time, utilities like gdb and openocd showed up to help get that binary file into the memory of a microcontroller, using protocols like swd or jtag. Specifically though, arm (the company that creates the arm instruction set and cortex architecture, that chip makers like ST/Apple/etc license and use), maintains arm-none-eabi-gcc and provides it for free. It has some competition from paid compilers like Keil and IAR, but in most cases gcc is the best choice.
🌐
EmbDev
embdev.net › arm programming with gcc/gnu tools
what is difference between arm-elf and arm-eabi? - EmbDev.net
EmbDev.net · Contact – Data privacy information – Advertising on EmbDev.net
🌐
All About Circuits
forum.allaboutcircuits.com › home › forums › embedded & programming › microcontrollers
difference gcc-arm-none-eabi and arm-none-eabi-gcc | All About Circuits
April 11, 2020 - Hi I am am using stm32f103 and i was using Keil. but i want to use gcc compiler. I am confused between these two toolchain.
🌐
Debian Manpages
manpages.debian.org › unstable › binutils-arm-none-eabi › arm-none-eabi-as.1.en.html
arm-none-eabi-as(1) — binutils-arm-none-eabi — Debian unstable — Debian Manpages
February 11, 2026 - The following architecture names are recognized: "armv8-a", "armv8.1-a", "armv8.2-a", "armv8.3-a", "armv8.4-a" "armv8.5-a", "armv8.6-a", "armv8.7-a", "armv8.8-a", "armv8.9-a", "armv8-r", "armv9-a", "armv9.1-a", "armv9.2-a", "armv9.3-a", "armv9.4-a" and "armv9.5-a".
Find elsewhere
🌐
The Rust Programming Language
doc.rust-lang.org › rustc › platform-support › arm-none-eabi.html
arm-none-eabi - The rustc book
Rust targets starting with arm* generate Arm (A32) code by default, whilst targets named thumb* generate Thumb (T32) code by default. Most Arm chips support both Thumb mode and Arm mode, with the notable exception that M-profile processors (thumbv*m*-none-eabi* targets) only support Thumb-mode.
Top answer
1 of 4
96

An ABI (Application Binary Interface) is a standard that defines a mapping between low-level concepts in high-level languages and the abilities of a specific hardware/OS platform's machine code. That includes things like:

  • how C/C++/Fortran/... data types are laid out in memory (data sizes / alignments)
  • how nested function calls work (where and how the information on how to return to a function's caller is stored, where in the CPU registers and/or in memory function arguments are passed)
  • how program startup / initialization works (what data format an "executable" has, how the code / data is loaded from there, how DLLs work ...)

The answers to these are:

  • language-specific (hence you've got a C ABI, C++ ABI, Fortran ABI, Pascal ABI, ... even the Java bytecode spec, although targeting a "virtual" processor instead of real hardware, is an ABI),
  • operating-system specific (MS Windows and Linux on the same hardware use a different ABI),
  • hardware/CPU-specific (the ARM and x86 ABIs are different).
  • evolving over (long) time (existing ABIs have often been updated / rev'ed so that new CPU features could be made use of, like, say, specifying how the x86 SSE registers are to be used by apps was of course only possible once CPUs had these regs, therefore existing ABIs needed to be clarified).

Without some kind of this standardization, (machine) code created by different compilers couldn't use the same kind of libraries (how would you know in which way the library code expects function arguments or data structures to be passed ?).

Every platform (a combination of specific hardware, operating system software and code written in specific programming languages / compiled with specific compilers) defines a whole set of ABIs to make things interoperable. The terminology in this area isn't clear, sometimes people just talk about "the ABI", other times it's called the "platform supplement", or one mentions the programming language and says e.g. "the C++ ABI". Keep in mind, there is not one such thing.

The documents that you linked to in your question are all specific examples of this (language- / operating-system / hardware-specific ABIs).

Even on a specific platform, there's no necessity to have one and only one ABI (set) because different such conventions might have different advantages (and therefore provide better performance / smaller code / better memory usage / ... - depending on the program) and system designers usually try to be flexible / permissible.
On 32bit Microsoft Windows, for example, there's a multitude of ABIs (fastcall, stdcall, pascal, ...) for the function calling convention parts.

Anyway, a generic stackoverflow search for "ABI" (included the links under the "Related" sidebar) gives so many leads to researching this question that I close my answer at this point.

2 of 4
23

ARM ABI should be referred when an OS kernel port on ARM is used.

EABI is when the processor boots to load an application with no intermediate kernel. (Something like there used to be ROM-BASIC when DOS came about), i. e. the firmware itself is the free-standing application, no board-specific monitor or anything.

The first link is to detailed sub-part related to procedure-calls of the ARM ABI. As the programmers' model advances with each version of ARM CPU, such topics are important and covered by ABI.

The second link is about binary format specification for object files generated by compiler called ELF that's specified by an OS vendor brand SCO. Perhaps SCO is Santa Cruz Organization that makes its own flavors of Unix as well as Linux, however that story deviates from the question. You should be interested in this if you intend to implement linker supporting ELF targeting ARM.

Unless you are directly concerned with implementation details of build tool-chain for ARM, EABI should be of little concern, and unless you are accounting for OS specific aspects of such tool-chain ARM ABI should also be of little concern.

🌐
NXP Community
community.nxp.com › t5 › i-MX-Processors › What-s-the-difference-between-arm-linux-arm-none-linux-gnueabi › td-p › 258887
Solved: What's the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB? - NXP Community
March 25, 2014 - Tool chains have a loose name convention like arch [-vendor] [-os] - eabi · arch - refers to target architecture (which in our case is ARM) ... arm-none-eabi - This tool chain targets for ARM architecture, has no vendor, does not target an operating system and complies with the ARM EABI.
Top answer
1 of 1
1

(I have the same confusion. And I try to answer it based on my investigation/understanding.)

Possible Naming Schema

According to quote from ARM GNU Toolchain Downloads page, bare metal and Linux are two different targets. And to differentiate from the target architecture, I call it target environment. And my way to tell it is: if it has "linux" in the name, it targets Linux environment, otherwise bare metal.

Available for bare-metal and Linux targets

So I interpret the toolchain names with below schema:

...<host_arch>-<target_arch>-<vendor>-<target_env+abi>
  1. Host OS: on what OS the toolchain itself runs. This is not part of the name but listed in the toolchain download page.

  2. Host Arch: on what machine architecture the toolchain itself runs.

  3. Target Arch: What machine architecture the toolchain's output targets.

  4. Vendor: Who offers the toolchain.

  5. Target Environment: can be bare metal or GNU/Linux.

  6. ABI: things like call conventions for assembly functions. This is related to both architecture and OS (link). So far I have seen: eabi/elf/linux-gnu/linux-gnueabi

About the "target_env+abi" part

I think this is the most confusing part. ABI is related to machine architecture, OS and language (link). And I think below naming convention holds based on the both the Target Arch + Target Environment.

  1. For AArch32 + bare metal, use "eabi".

  2. For AArch64 + bare metal, use "elf". (similar to eabi)

  3. For AArch32 + Linux/GNU, use "linux-gnueabi" (eabi generated by gcc)

  4. For AArch64 + Linux/GNU, use "linux-gnu" (maybe similar to 3 just like 2 to 1)

So I think all 4 of them are about EABI. But may have some subtle differences.

Hope some guru can shed some light here.

Examples

Let's take some toolchain names from the ARM GNU Toolchain Downloads page as examples.

Example 1:
arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-eabi.zip

  1. Host Arch = x86-64 because of the "mingw-w64-i686"

  2. Host OS = Windows because listed so.

  3. Target Arch = AArch32 because of the arm.

  4. Target Environment = bare metal because no linux in the name.

  5. Vendor: by open-source community, no specific vendor so it is none.

  6. ABI = eabi

Example 2:
arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-linux-gnueabihf.zip

  1. Host Arch = x86-64 because of the "mingw-w64-i686"

  2. Host OS = Windows because listed so.

  3. Target Arch = AArch32 because of the arm.

  4. Target Environment = GNU Linux because of the "linux" in the name.

  5. Vendor: by open-source community, no specific vendor so it is none.

  6. ABI = linux-gnueabi

Example 3:
arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-aarch64-none-elf.zip

  1. Host Arch = x86-64 because of the "mingw-w64-i686"

  2. Host OS = Windows because listed so.

  3. Target Arch = AArch64 because of the "aarch64".

  4. Target Environment = bare metal because no linux in the name.

  5. Vendor: by open-source community, no specific vendor so it is none.

  6. ABI = elf

Example 4:
arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz

  1. Host Arch = x86-64 because of the "x86_64"

  2. Host OS = Linux because listed so.

  3. Target Arch = AArch32 because of the "arm".

  4. Target Environment = bare metal because no linux in the name.

  5. Vendor: by open-source community, no specific vendor so it is none.

  6. ABI = eabi

Example 5:
arm-gnu-toolchain-14.2.rel1-aarch64-aarch64-none-linux-gnu.tar.xz

  1. Host Arch = AArch64 because of the first "aarch64"

  2. Host OS = Linux because listed in Linux-hosted section

  3. Target Arch = AArch64 because of the second "aarch64".

  4. Target Environment = GNU Linux because of the "linux" in the name.

  5. Vendor: by open-source community, no specific vendor so it is none.

  6. ABI = linux-gnu

To answer the original question

  • aarch64-none-elf: is for AArch64 bare metal, vendor is none

  • arm-none-eabi: is for AArch32 bare metal, vendor is none

🌐
Debian
wiki.debian.org › ArmEabiPort
ArmEabiPort - Debian Wiki
February 1, 2026 - Strictly speaking, both the old and new ARM ABIs are subsets of the ARM EABI specification, but in everyday usage the term "EABI" is used to mean the new one described here and "OABI" or "old-ABI" to mean the old one.
🌐
Debian Manpages
manpages.debian.org › testing › binutils-arm-none-eabi › arm-none-eabi-ld.1.en.html
arm-none-eabi-ld(1) — binutils-arm-none-eabi — Debian testing — Debian Manpages
Specify how to report x86-64 ISA levels in input relocatable files. isa-level-report=none, which is the default, will make the linker not report x86-64 ISA levels in input files. isa-level-report=all will make the linker report needed and used x86-64 ISA levels in input files.
🌐
GitHub
github.com › xpack-dev-tools › arm-none-eabi-gcc-xpack
GitHub - xpack-dev-tools/arm-none-eabi-gcc-xpack: A binary distribution of the Arm Embedded GCC toolchain · GitHub
A binary distribution of the Arm Embedded GCC toolchain - xpack-dev-tools/arm-none-eabi-gcc-xpack
Starred by 273 users
Forked by 32 users
Languages   C 95.5% | MDX 3.2% | Shell 0.4% | TypeScript 0.3% | C++ 0.2% | Linker Script 0.2%
🌐
GNU
gcc.gnu.org › onlinedocs › gcc › ARM-Options.html
ARM Options (Using the GNU Compiler Collection (GCC))
You can also set the fpu name at function level by using the target("fpu=") function attributes (see ARM Attributes) or pragmas (see Function Specific Option Pragmas). ... Specify the format of the __fp16 half-precision floating-point type. Permissible names are ‘none’, ‘ieee’, and ‘alternative’; the default is ‘none’, in which case the __fp16 type is not defined.
🌐
Eeworld
en.eeworld.com.cn › news › mcu › eic481974.html
The difference between arm cross compiler gnueabi, none- ...
December 4, 2019 - Design of wireless meteorological information collection system based on PTR2000 · National Technology brings together 11 major themes and 2 new products to add color to ELEXCON 2022
🌐
GitHub
github.com › marketplace › actions › arm-none-eabi-gcc-gnu-arm-embedded-toolchain
arm-none-eabi-gcc GNU Arm Embedded Toolchain - GitHub Marketplace
- name: To create an environmental variable with the toolchain path provide a name via the `path-env-var` input uses: carlosperate/arm-none-eabi-gcc-action@v1 with: path-env-var: ARM_NONE_EABI_GCC_PATH - name: The path will be exported to that environmental variable name run: echo "The output path is $ARM_NONE_EABI_GCC_PATH" The changes can be found in the CHANGELOG.md file, or the GitHub Releases notes. MIT License. This project is a fork of fiam/arm-none-eabi-gcc, copyright @fiam (thanks for the awesome work Alberto!