Differences between revisions 53 and 54
Revision 53 as of 2012-05-15 02:43:58
Size: 13065
Editor: ?JonathanNieder
Comment: shrink description column a little more
Revision 54 as of 2012-05-15 02:44:55
Size: 13066
Editor: ?JonathanNieder
Comment: word size is two words
Deletions are marked like this. Additions are marked like this.
Line 23: Line 23:
 ||<rowbgcolor="maroon" rowstyle="color: white; font-weight: bold;"style="text-align: center">multiarch name ||<style="text-align: center">syscall ABI ||<style="text-align: center">instruction set ||<style="text-align: center">endian&shy;ness ||<style="text-align: center">wordsize ||<style="text-align: center">description ||<style="text-align: center">spec documents ||  ||<rowbgcolor="maroon" rowstyle="color: white; font-weight: bold;"style="text-align: center">multiarch name ||<style="text-align: center">syscall ABI ||<style="text-align: center">instruction set ||<style="text-align: center">endian&shy;ness ||<style="text-align: center">word size ||<style="text-align: center">description ||<style="text-align: center">spec documents ||

Multiarch Architecture Specifiers (Tuples)

This document describes the new schema for representing architecture ABIs as directory names, using normalized GNU triplets. The process to document the tuples in the Debian Policy and distribution independent standards is tracked in http://bugs.debian.org/664257.

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.

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.
  • Historical note: On ARM, the canonical GNU triplet for EABI systems, whether using hard-float or soft-float, was 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 finally succeeded to push the arm-linux-gnueabihf triplet upstream, but there may still be some broken packages around for a while.

Used solution

Use normalized GNU triplets for most tuples, and extend the GNU triplet when it is ambiguous.

  • multiarch name

    syscall ABI

    instruction set

    endian­ness

    word size

    description

    spec documents

    aarch64-linux-gnu

    linux

    ARMv8

    little

    64

    aarch64 Linux Platform

    Procedure Call Standard for the ARM 64-bit Architecture1
    ELF for the ARM 64-bit Architecture2

    alpha-linux-gnu

    linux

    Alpha

    little

    64

    glibc, Tru64 calling standard

    Tru64 UNIX Calling Standard for Alpha Systems3

    arm-linux-gnu

    linux

    ARM

    little

    32

    Old ARM ABI (APCS)

    ARM Procedure Call Standard (ARM DUI 0041 chapter 9)4

    arm-linux-gnueabi

    linux

    ARMv4t+

    little

    32

    ARM EABI (AAPCS)
    soft-float

    Procedure Call Standard for the ARM Architecture (ARM IHI 0042D)5
    ARM GNU/Linux ABI Supplement6

    arm-linux-gnueabihf

    linux

    ARMv7+

    little

    32

    ARM EABI (AAPCS)
    hard-float

    AAPCS (ARM IHI 0042D)5 and
    XXXXX (TBD)

    hppa-linux-gnu

    linux

    PA-RISC

    big

    32

    PA-RISC Linux 32-bit ELF

    parisc-linux toolchain documents7

    i386-gnu

    Hurd

    IA-32

    little

    32

    Hurd/IA-32

    ia32 functions calls8
    LSB Bug 32689
    OS interface XXXXX undocumented

    i386-linux-gnu

    linux

    IA-32

    little

    32

    LSB IA32
    16-byte aligned stack

    SCO Developer Specifications10
    SysV ABI Intel386 Architecture Processor Supplement8
    LSB Core-IA3211
    LSB Bug 32689

    ia64-linux-gnu

    linux

    IA-64

    little

    64

    LSB IA64

    Intel Itanium SysV psABI12
    LSB Core-IA6413

    i386-kfreebsd-gnu

    FreeBSD

    IA-32

    little

    32

    glibc kFreeBSD IA-32

    XXXXX undocumented

    m68k-linux-gnu

    linux

    MC68000

    big

    32

    m68k SysV ABI

    ISBN: 978-0138776633

    mips-linux-gnu

    linux

    MIPS

    big

    32

    MIPS o32 ABI

    SysV ABI MIPS Processor Supplement14

    mipsel-linux-gnu

    linux

    MIPS

    little

    32

    MIPS o32 ABI

    SysV ABI MIPS Processor Supplement14

    mips64-linux-gnuabin32

    linux

    MIPS64

    big

    32

    MIPS n32 ABI

    MIPSpro N32 ABI Handbook15

    mips64el-linux-gnuabin32

    linux

    MIPS64

    little

    32

    MIPS n32 ABI

    MIPSpro N32 ABI Handbook15

    mips64-linux-gnuabi64

    linux

    MIPS64

    big

    64

    MIPS 64-bit ABI

    MIPSpro N32 ABI Handbook15

    mips64el-linux-gnuabi64

    linux

    MIPS64

    little

    64

    MIPS 64-bit ABI

    MIPSpro N32 ABI Handbook15

    powerpc-linux-gnu

    linux

    PowerPC

    big

    32

    LSB PPC32

    SysV ABI PowerPC Processor Supplement16
    LSB Core-PPC3217

    powerpc-linux-gnuspe

    linux

    PowerPC

    big

    32

    PowerPC e500 (SPE)

    Power 32-bit ABI Supplement 1.0 Linux18

    ppc64-linux-gnu

    linux

    PowerPC

    big

    64

    LSB PPC64

    64-bit PowerPC ELF ABI Supplement19
    LSB Core-PPC6420

    s390-linux-gnu

    linux

    System/390

    big

    32

    LSB S390

    S/390 ELF ABI Supplement21
    LSB Core-S39022

    s390x-linux-gnu

    linux

    z/Architecture

    big

    64

    LSB S390X

    zSeries ELF ABI Supplement23
    LSB Core-S390X24

    sh4-linux-gnu

    linux

    SH-4

    little

    32

    glibc Linux SH-4
    with fpu, double pervading

    SH-4 Generic and Specific ABI25

    sparc-linux-gnu

    linux

    SPARC

    big

    32

    glibc Linux sparc32

    SysV ABI SPARC Processor Supplement26

    sparc64-linux-gnu

    linux

    SPARCv9+

    big

    64

    glibc Linux sparc64

    SysV ABI SPARCv9 Processor Supplement27

    x86_64-kfreebsd-gnu

    FreeBSD

    x86_64

    little

    64

    glibc kFreeBSD x86-64

    XXXXX undocumented

    x86_64-linux-gnu

    linux

    x86_64

    little

    64

    LSB AMD64

    SysV ABI AMD64 Architecture Processor Supplement28
    LSB Core-AMD6429

    x86_64-linux-gnux32

    linux

    x86_64

    little

    32

    glibc Linux x32

    x32-abi documents30

Architectures in Debian:

  • Debian architecture name

    status in Debian

    multiarch name

    alpha

    EOL

    alpha-linux-gnu

    amd64

    released

    x86_64-linux-gnu

    arm

    EOL

    arm‑linux‑gnu

    arm64

    none

    aarch64‑linux‑gnu

    armel

    released

    arm-linux-gnueabi

    armhf

    development

    arm-linux-gnueabihf

    hppa

    EOL

    hppa‑linux‑gnu

    hurd-i386

    development

    i386-gnu

    i386

    released

    i386-linux-gnu

    ia64

    released

    ia64-linux-gnu

    kfreebsd-amd64

    released

    x86_64-kfreebsd-gnu

    kfreebsd-i386

    released

    i386-kfreebsd-gnu

    m68k

    EOL

    m68k-linux-gnu

    mips

    released

    mips-linux-gnu

    mipsel

    released

    mipsel-linux-gnu

    powerpc

    released

    powerpc-linux-gnu

    powerpcspe

    development

    powerpc-linux-gnuspe

    ppc64

    development

    ppc64-linux-gnu

    s390

    released

    s390-linux-gnu

    s390x

    development

    s390x-linux-gnu

    sh4

    development

    sh4-linux-gnu

    sparc

    released

    sparc-linux-gnu

    sparc64

    development

    sparc64-linux-gnu

    x32

    none

    x86_64-linux-gnux32

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).

On Debian systems, the Debian architecture name associated to a triplet can be retrieved with "dpkg-architecture -t<triplet> -qDEB_HOST_ARCH".

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.

  1. http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055a/IHI0055A_aapcs64.pdf (1)

  2. http://infocenter.arm.com/help/topic/com.arm.doc.ihi0056a/IHI0056A_aaelf64.pdf (2)

  3. http://www.openwatcom.org/ftp/devel/docs/alpha%20calling%20standard.pdf (3)

  4. http://infocenter.arm.com/help/topic/com.arm.doc.dui0041c/BGBGFIDA.html (4)

  5. http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042a/IHI0042A_aapcs.pdf (5 6)

  6. https://sourcery.mentor.com/GNUToolchain/kbentry39 (7)

  7. http://wiki.parisc-linux.org/ToolChain (8)

  8. http://refspecs.linuxbase.org/elf/abi386-4.pdf (9 10)

  9. https://lsbbugs.linuxfoundation.org/show_bug.cgi?id=3268 (11 12)

  10. http://www.sco.com/developers/devspecs/ (13)

  11. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-IA32/LSB-Core-IA32/elf-ia32.html (14)

  12. http://refspecs.linuxbase.org/elf/IA64-SysV-psABI.pdf (15)

  13. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-IA64/LSB-Core-IA64/elf-ia64.html (16)

  14. http://refspecs.linuxbase.org/elf/mipsabi.pdf (17 18)

  15. http://techpubs.sgi.com/library/manuals/2000/007-2816-005/pdf/007-2816-005.pdf (19 20 21 22)

  16. http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf (23)

  17. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-PPC32/LSB-Core-PPC32/elf-ppc32.html (24)

  18. https://www.power.org/resources/downloads/Power-Arch-32-bit-ABI-supp-1.0.tgz (25)

  19. http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html (26)

  20. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-PPC64/LSB-Core-PPC64/elf-ppc64.html (27)

  21. http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_s390.html (28)

  22. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-S390/LSB-Core-S390/elf-s390.html (29)

  23. http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html (30)

  24. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-S390X/LSB-Core-S390X/elf-s390x.html (31)

  25. http://sg.renesas.com/support/downloads/download_results/C2003801-C2003900/sh4_000_top_abi_00013.jsp (registration required) (32)

  26. http://www.sparc.com/standards/psABI3rd.pdf (33)

  27. draft http://www.sparc.com/standards/64.psabi.1.35.ps.Z available online, can't find anything more concrete (34)

  28. http://x86-64.org/documentation/abi.pdf (35)

  29. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-AMD64/LSB-Core-AMD64/elf-amd64.html (36)

  30. https://sites.google.com/site/x32abi/ (37)