Application binary interface: Difference between revisions

Content deleted Content added
See also: use Annotated link
Multiple compilers for the *same* language, presumably; multiple compilers for multiple languages is usually the case.
 
(7 intermediate revisions by 3 users not shown)
Line 8:
An ABI is at a relatively low-level of [[abstraction (computer science)|abstraction]]. Interface compatibility depends on the target [[computer hardware|hardware]] and the [[software build]] [[toolchain]]. In contrast, an [[application programming interface]] (API) defines access in [[source code]] which is a relatively high-level, hardware-independent, and [[human-readable]] format. An API defines interface at the source code level, before compilation, whereas an ABI defines an interface to compiled code.
 
API compatibility is generally the concern for [[system design]] and of the toolchain. However, a [[programmer]] may have to deal with an ABI directly when writing a program in a multiple [[programming language|languages]] or when using multiple [[compiler]]s for the same language.
 
A complete ABI, such as the [[Intel Binary Compatibility Standard]] (iBCS),<ref>[http://www.everything2.com/index.pl?node=iBCS Intel Binary Compatibility Standard (iBCS)]</ref> enables a program that supports an ABI to run without modification on multiple operating systems that provide the ABI. The target system must provide any required libraries (that implement the ABI), and there may be other prerequisites.
 
== Description ==
Interface aspects covered by an ABI include:
* [[Processor (computing)|Processor]] [[instruction set]], with details like register file structure, [[Stack register|stack]] organization, [[Computer memory|memory]] access types, etc.
* Size, layout, and [[Data structure alignment|alignment]] of basic [[data type]]s that the processor can directly access
* [[Calling convention]], which controls how the arguments of [[function (programming)|function]]s are passed, and return values retrieved; for example, it controls the following:
** How the [[call stack]] is organized
** Whether all parameters are passed on the call stack, or some are passed in registers
** Which registers are used for which function parameters
** Whether the first function parameter passed on the call stack is pushed first or last
** Whether the caller or callee is responsible for cleaning up the call stack after the function call
* [[Name mangling]]<ref>{{cite web|url=https://itanium-cxx-abi.github.io/cxx-abi/|title=Itanium C++ ABI}} (compatible with multiple architectures)</ref>
* [[exception handling|Exception]] propagation<ref>{{cite web|url=http://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html|title=Itanium C++ ABI: Exception Handling}} (compatible with multiple architectures)</ref>
* How an application should make [[system call]]s to the operating system, and if the ABI specifies direct system calls rather than procedure calls to system call [[Method stub|stubs]], the system call numbers
* In the case of a complete operating system ABI, the binary format of [[object file]]s, program libraries, etc.
 
ABIs include the [[Intel Binary Compatibility Standard]] (iBCS)<ref>{{cite web |url=http://www.everything2.com/index.pl?node=iBCS |title=Intel Binary Compatibility Standard (iBCS)}}</ref> and the [[System V Release 4]] ABIs for various instruction sets.
 
== {{Anchor|EABI}}Embedded ABI ==
Line 60 ⟶ 63:
}}</ref>
 
Widely used EABIs include the [[PowerPC]],<ref name="ppc-eabi"/> [[Arm architecture|Arm]] EABI,<ref>{{cite web|url=https://developer.arm.com/architectures/system-architectures/software-standards/abi |title=ABI for the Arm Architecture |publisher=Developer.arm.com |access-date=4 February 2020}}</ref> and [[MIPS architecture|MIPS]] EABIEABIs.<ref>{{cite mailing list |url=https://sourceware.org/legacy-ml/binutils/2003-06/msg00436.html |author=Eric Christopher |title=mips eabi documentation |mailing-list=binutils@sources.redhat.com |date=11 June 2003 |access-date=19 June 2020}}</ref> Specific software implementations like the C library may impose additional limitations to form more concrete ABIs; one example is the GNU OABI and EABI for ARM, both of which are subsets of the ARM EABI.<ref>{{cite web |title=ArmEabiPort |url=https://wiki.debian.org/ArmEabiPort |website=Debian Wiki |quote=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.}}</ref>
 
== See also ==