6.4. ABI Variables

6.4.1. ABI

An application binary interface (ABI) describes the low-level interface between a computer program and the operating system. Specifying the ABI is part of the process of fine tuning the cross-compilation toolchain for the selected platform. A good overview of ABIs is provided by the following wikipedia entry: http://en.wikipedia.org/wiki/Application_binary_interface

6.4.2. ARM ABIs

On the ARM architecture, there are two major ABI types to choose from: EABI and OABI. There is also a Thumb ABI and an Intel IWMMX specific ABI but these are generally not recommended for most uses.

The EABI (Embedded ABI) is newer and supports additional features, faster software floating point operations, and Thumb interworking, but is only compatible with ARMv4t and newer cores. The EABI has sub-ABIs of: aapcs-linux and aapcs. aapcs-linux has standard Linux 4 byte enums while aapcs has variable length enums. aapcs-linux is recommended over aapcs.

The OABI (old ABI) is called apcs-gnu and supports ARMv4 and older cores. Generally the OABI is not used by modern ARM processors.

The following table gives the kernel CONFIG variable, found in "Kernel Features", versus ABI.

Table 6.1. List of Build Variables

Kernel ABI CLFS_ABI=Value Note
CONFIG_AEABI aapcs-linux aapcs-linux Recommended for EABI. Standard Linux 32 bit (int) enums
  apcs-gnu apcs-gnu Recommended for OABI
CONFIG_THUMB2_KERNEL atpcs atpcs Thumb ABI
  aapcs aapcs EABI w/ variable size enums
CONFIG_IWMMXT iwmmxt iwmmxt Supports Intel XScale MMX extensions

6.4.3. Set ABI Variable

Based on a review of the kernel configuration file the following setting for CLFS_ABI is appropriate:

  export CLFS_ABI=aapcs-linux
  echo export CLFS_ABI=\""${CLFS_ABI}\"" >> ~/.bashrc