Multiarch Architecture Specifiers (Tuples)
This document describes the new schema for representing architecture ABIs as directory names, using normalized GNU triplets.
The abandoned proposal can be found at Multiarch/TuplesAbandoned.
This page is part of the larger effort to implement Multiarch library handling on Linux. For more information about Multiarch, see Multiarch, https://wiki.ubuntu.com/MultiarchSpec.
Contents
The problem
Multiarch specifies a method of making libraries for multiple, mutually-incompatible architectures installable on a single filesystem in a manner that ensures the same binaries can be used without modification on any system. To accomplish this, we require unique identifiers for each architecture that identifies an incompatible set of libraries that we want to be co-installed. We want these identifiers to be specified in as vendor-neutral a manner as possible, to ensure we retain maximal binary compatibility across Linux distributions.
Why not use GNU triplets?
Earlier proposals for multiarch did use GNU triplets as the components of the library path. Proof-of-concept implementations ran into two distinct cases where GNU triplets could not be used effectively in a cross-distribution manner:
- On IA-32, the GNU triplet varies according to the precise instruction set being targeted: e.g., i486-linux-gnu, i586-linux-gnu i686-linux-gnu. Such triplets will be inconsistent over time within a single distribution as compiler defaults are changed, let alone between distributions.
On ARM, the canonical GNU triplet for EABI systems, whether using hard-float or soft-float, is arm-linux-gnueabi, despite the fact that hard-float and soft-float libraries use different calling conventions and can't be intermixed. The advice given by upstream GCC developers was to use the vendor field in the GNU triplet to express this difference1; however, the vendor field is private by design, making this unreliable for cross-distribution use. Work is in progress (March 2012) to push the arm-linux-gnueabihf triplet upstream.
Used solution
Use normalized GNU triplets for most tuples, and extend the GNU triplet when it is ambiguous.
multiarch name
syscall ABI
instruction set
endianness
wordsize
status in Debian
description
spec document(s)
alpha‑linux‑gnu
linux
Alpha
little
64
EOL
glibc, Tru64 calling standard
Tru64 UNIX Calling Standard for Alpha Systems1
arm‑linux‑gnu
linux
ARM
little
32
EOL
Old ARM ABI (APCS). HW FPU expected with kernel emulation as fallback. DO NOT USE
ARM Procedure Call Standard (ARM DUI 0041 chapter 9)2
arm‑linux‑gnueabi
linux
ARMv4t+
little
32
released
New ARM EABI (AAPCS), soft-float
Procedure Call Standard for the ARM Architecture (ARM IHI 0042D)3 and ARM GNU/Linux ABI Supplement4
arm‑linux‑gnueabihf
linux
ARMv7+
little
32
development
New ARM EABI (AAPCS), hard-float
AAPCS (ARM IHI 0042D)3 and XXXXX (TBD)
hppa‑linux‑gnu
linux
PA-RISC
big
32
EOL
PA-RISC Linux 32-bit ELF
parisc-linux toolchain documents5
i386‑gnu
Hurd
IA-32
little
32
development
Hurd/ix86, 16-byte aligned stack
ia32 functions calls6, OS interface XXXXX undocumented
i386‑linux‑gnu
linux
IA-32
little
32
released
LSB IA32, 16-byte aligned stack
SCO Developer Specifications7, SysV ABI Intel386 Architecture Processor Supplement6, LSB Core-IA328
ia64‑linux‑gnu
linux
IA-64
little
64
released
LSB IA64
amd64‑kfreebsd‑gnu
FreeBSD
x86_64
little
64
released
XXXXX none I could find
i386‑kfreebsd‑gnu
FreeBSD
IA-32
little
32
released
XXXXX none I could find
m68k‑linux‑gnu
linux
MC68000
big
32
EOL
m68k SysV ABI
ISBN: 978-0138776633
mips‑linux‑gnu
linux
MIPS
big
32
released
MIPS o32 ABI
SysV ABI MIPS Processor Supplement11
mipsel‑linux‑gnu
linux
MIPS
little
32
release
MIPS o32 ABI
SysV ABI MIPS Processor Supplement11
mips64‑linux‑gnuabin32
linux
MIPS
big
32
none yet
MIPS n32 ABI
MIPSpro N32 ABI Handbook12
mips64el‑linux‑gnuabin32
linux
MIPS
little
32
none yet
MIPS n32 ABI
MIPSpro N32 ABI Handbook12
mips64‑linux‑gnuabi64
linux
MIPS64
big
64
none yet
MIPS 64-bit ABI
MIPSpro N32 ABI Handbook12
mips64el‑linux‑gnuabi64
linux
MIPS64
little
64
none yet
MIPS 64-bit ABI
MIPSpro N32 ABI Handbook12
powerpc‑linux‑gnu
linux
PowerPC
big
32
released
LSB PPC32
powerpc‑linux‑gnuspe
linux
PowerPC
big
32
development
SYSV soft-float ABI, uses e500v2 SPE FPU (limited hw options) PowerPCSPEPort
Power 32-bit ABI Supplement 1.0 Linux15
ppc64‑linux‑gnu
linux
PowerPC
big
64
development
LSB PPC64
s390‑linux‑gnu
linux
System/390
big
32
released
LSB S390
s390x‑linux‑gnu
linux
z/Architecture
big
64
development
LSB S390X
sparc‑linux‑gnu
linux
SPARC
big
32
released
glibc Linux sparc32
SysV ABI SPARC Processor Supplement22
sparc64‑linux‑gnu
linux
SPARCv9+
big
64
development
glibc, Linux sparc64
SysV ABI SPARCv9 Processor Supplement (draft23 available online, can't find anything more concrete)
x86_64‑linux‑gnu
linux
x86_64
little
64
released
LSB AMD64
SysV ABI AMD64 Architecture Processor Supplement24, LSB Core-AMD6425
The status describes if the name is used in a (to be) released version of Debian and/or Ubuntu (release), if it is a new or abandoned port on Debian Ports (port), or if it's used as a name for a Debian gcc multilib configuration (biarch).
Supporting interfaces
- dpkg-architecture -qDEB_HOST_MULTIARCH (on dpkg based systems).
- gcc -print-multiarch (proposed patch; currently only available in Debian wheezy (unreleased), and in Ubuntu 11.10 (oneiric) or newer.
To avoid divergent embedded implementations of architecture->tuple mappings in every piece of software that wants to make use of these paths, a standard commandline tool that encapsulates this mapping should be provided, similar to the config.guess and config.sub tools that are a standard part of GNU autotools. We recommend a name of lsb_architecture for this tool.
http://www.openwatcom.org/ftp/devel/docs/alpha%20calling%20standard.pdf (1)
http://infocenter.arm.com/help/topic/com.arm.doc.dui0041c/BGBGFIDA.html (2)
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042a/IHI0042A_aapcs.pdf (3 4)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-IA32/LSB-Core-IA32/elf-ia32.html (10)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-IA64/LSB-Core-IA64/elf-ia64.html (12)
http://techpubs.sgi.com/library/manuals/2000/007-2816-005/pdf/007-2816-005.pdf (15 16 17 18)
http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf (19)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-PPC32/LSB-Core-PPC32/elf-ppc32.html (20)
https://www.power.org/resources/downloads/Power-Arch-32-bit-ABI-supp-1.0.tgz (21)
http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html (22)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-PPC64/LSB-Core-PPC64/elf-ppc64.html (23)
http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_s390.html (24)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-S390/LSB-Core-S390/elf-s390.html (25)
http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html (26)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-S390X/LSB-Core-S390X/elf-s390x.html (27)
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-AMD64/LSB-Core-AMD64/elf-amd64.html (31)