# What is the difference in toolchains named Arm OABI and EABI?

**URL:** <https://linux-tips.com/t/what-is-the-difference-in-toolchains-named-arm-oabi-and-eabi/67>\
**Category:** Embedded\
**Created:** [January 9, 2015, 10:08pm UTC](https://linux-tips.com/t/what-is-the-difference-in-toolchains-named-arm-oabi-and-eabi/67 "2015-01-09T22:08:39Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Greg](https://linux-tips.com/letter_avatar_proxy/v4/letter/g/71c47a/32.png) [@Greg](https://linux-tips.com/u/Greg)\
**Post date:** [January 9, 2015, 10:08pm UTC](https://linux-tips.com/t/what-is-the-difference-in-toolchains-named-arm-oabi-and-eabi/67/1 "2015-01-09T22:08:39Z")

</div>

There are options to select Arm OABI and Arm EABI in cross compiling systems like buildroot but which one must be selected for newer boards like BeagleBoneBlack? What is the difference?

---

<div class="post-metadata">

**Author:** ![demirten](https://linux-tips.com/user_avatar/linux-tips.com/demirten/32/64_2.png) [@demirten](https://linux-tips.com/u/demirten)\
**Post date:** [January 9, 2015, 10:46pm UTC](https://linux-tips.com/t/what-is-the-difference-in-toolchains-named-arm-oabi-and-eabi/67/2 "2015-01-09T22:46:42Z")

</div>

**OABI** was the first Application Binary Interface for ARM architecture. OABI assumes machine has a FPU unit to accelerate floating point instructions so OABI toolchains generates codes to execute on FPU. But this is not the case for ARM cores. When FPU instruction tried to execute, it leads to a kernel exception and if you build Netwinder Floating Point Emulation or Fast Floating Point Emulation support in kernel, exception will be handle in kernel emulating related instruction.

But as you may guess, this is a very slow operation because a context switch required for every instructions which needs FPU emulation.

**EABI** is the new Embedded ABI for ARM systems. It solves the context switch problem with emulating FPU instructions in userspace. In order to use this feature, you can pass `-mfloat-abi=soft` to `gcc` for generating fully software emulated floating points.

With this method programs runs 10x or more faster when compared to FPU emulation in kernel.

New ARM cores also introduced a new Floating Point Unit named **V** ector **F** loating **P** oints which uses a different instruction set. Even more, **NEON** introduced as an extension of VFP which allows for very efficient manipulation of matrices, and vector data in general. This leads to toolchains with hard floating point support named **eabihf** You can specify fpu in gcc with `-mfpu=vfp` or `-mfpu=neon`

For the BeagleBoneBlack case, you can use **eabihf** toolchain for maximum performance but it is also possible to use **eabi** with soft floating point emulation in userspace provided by gcc.
