ABI List
Contents
glibc supports the following (architecture, ABI) combinations, with dynamic linker names as indicated. There may well be other cases of configure triplets and --with-fp / --without-fp options accepted by configure, but they are unlikely actually to work.
The expectation is that binaries and shared libraries from different ABIs on this list cannot be loaded in the same process, and if possible the dynamic linker should check compatibility and prevent attempts to load them, but that binaries and shared libraries from the same ABI will interoperate as long as the processor supports the instructions required by all relevant code. (It is possible that cases of mixed ABIs may appear to work sometimes, for example if functions with floating-point arguments and return values are not used and that is the only difference in the ABIs, but this is not considered a supported use of glibc.)
The entries for sparc are awaiting architecture maintainer confirmation that soft-float is not in use for that architecture. Architecture maintainers should check their entries, correct them as needed them remove references to their architectures in this paragraph.
Hurd
x86
32-bit, hard-float, LE: /lib/ld.so (that is, GCC uses that name with -dynamic-linker so in PT_INTERP; it gets the SONAME ld.so.1 by default)
Linux kernel
aarch64
- LP64, hard-float, BE: /lib/ld-linux-aarch64_be.so.1
- LP64, hard-float, LE: /lib/ld-linux-aarch64.so.1
(The ILP32 port is not yet in glibc.)
alpha
- LP64, hard-float, LE: /lib/ld-linux.so.2
arc
- soft-float ABI, LE: /lib/ld-linux-arc.so.2
- soft-float ABI, BE: /lib/ld-linux-arceb.so.2
- hard-float ABI, LE: /lib/ld-linux-arc.so.2
(ARC function-calling ABI is the same for both hard and soft-float)
arm
- hard-float ABI, BE32: /lib/ld-linux-armhf.so.3
- hard-float ABI, BE8: /lib/ld-linux-armhf.so.3
- hard-float ABI, LE: /lib/ld-linux-armhf.so.3
- soft-float ABI, BE32: /lib/ld-linux.so.3
- soft-float ABI, BE8: /lib/ld-linux.so.3
- soft-float ABI, LE: /lib/ld-linux.so.3
(The ARM soft-float ABI can be used with both hard and soft-float code. ARM supports two variants of big-endian operation, (on newer processors) BE8 and (on older processors) BE32, which are the same at .o level but incompatible for linked executables and shared libraries.)
C-SKY
- 32-bit, ABIV2, hard-float, LE: /lib/ld-linux-cskyv2-hf.so.1
- 32-bit, ABIV2, soft-float, LE: /lib/ld-linux-cskyv2.so.1
hppa
- 32-bit, hard-float, BE: /lib/ld.so.1
ia64
- LP64, hard-float, LE: /lib/ld-linux-ia64.so.2
loongarch
- LP64, hard-float, LE: /lib64/ld-linux-loongarch-lp64d.so.1
- LP64, soft-float, LE: /lib64/ld-linux-loongarch-lp64s.so.1
m68k
- classic m68k, hard-float (hardware or kernel emulated), BE: /lib/ld.so.1
ColdFire, hard-float, BE: /lib/ld.so.1
ColdFire, soft-float, BE: /lib/ld.so.1
(The ColdFire function-calling ABI is the same for both hard and soft-float, but the glibc ABI, e.g. size of jmp_buf, is different.)
microblaze
- hard or soft float, BE: /lib/ld.so.1
- hard or soft float, LE: /lib/ld.so.1
mips
- classic NaN, o32, hard-float, BE: /lib/ld.so.1
- classic NaN, o32, hard-float, LE: /lib/ld.so.1
- classic NaN, o32, soft-float, BE: /lib/ld.so.1
- classic NaN, o32, soft-float, LE: /lib/ld.so.1
NaN2008, o32, hard-float, BE: /lib/ld-linux-mipsn8.so.1
NaN2008, o32, hard-float, LE: /lib/ld-linux-mipsn8.so.1
NaN2008, o32, soft-float, BE: /lib/ld-linux-mipsn8.so.1
NaN2008, o32, soft-float, LE: /lib/ld-linux-mipsn8.so.1
- classic NaN, n32, hard-float, BE: /lib32/ld.so.1
- classic NaN, n32, hard-float, LE: /lib32/ld.so.1
- classic NaN, n32, soft-float, BE: /lib32/ld.so.1
- classic NaN, n32, soft-float, LE: /lib32/ld.so.1
NaN2008, n32, hard-float, BE: /lib32/ld-linux-mipsn8.so.1
NaN2008, n32, hard-float, LE: /lib32/ld-linux-mipsn8.so.1
NaN2008, n32, soft-float, BE: /lib32/ld-linux-mipsn8.so.1
NaN2008, n32, soft-float, LE: /lib32/ld-linux-mipsn8.so.1
- classic NaN, n64, hard-float, BE: /lib64/ld.so.1
- classic NaN, n64, hard-float, LE: /lib64/ld.so.1
- classic NaN, n64, soft-float, BE: /lib64/ld.so.1
- classic NaN, n64, soft-float, LE: /lib64/ld.so.1
NaN2008, n64, hard-float, BE: /lib64/ld-linux-mipsn8.so.1
NaN2008, n64, hard-float, LE: /lib64/ld-linux-mipsn8.so.1
NaN2008, n64, soft-float, BE: /lib64/ld-linux-mipsn8.so.1
NaN2008, n64, soft-float, LE: /lib64/ld-linux-mipsn8.so.1
nios2
- soft-float, LE: /lib/ld-linux-nios2.so.1
or1k
- soft-float, BE: /lib/ld-linux-or1k.so.1
- hard-float, BE: /lib/ld-linux-or1k.so.1
(On OpenRISC "hard-float" and "soft-float" have the same ABI, there is not a separate floating point register set, general purpose registers are used for both integers and floats and calling conventions do not change.)
powerpc
- 32-bit, hard-float, BE: /lib/ld.so.1
- 32-bit, soft-float, BE: /lib/ld.so.1
- 64-bit, hard-float, BE: /lib64/ld64.so.1
- 64-bit, hard-float, LE: /lib64/ld64.so.2
(The GCC distinction for 64-bit is actually ELFv1/ELFv2, but the BE ELFv2 and LE ELFv1 combinations aren't supported.)
RISC-V
- 64-bit, soft-float, LE: /lib/ld-linux-riscv64-lp64.so.1
- 64-bit, hard-float, LE: /lib/ld-linux-riscv64-lp64d.so.1
("hard-float" and "soft-float" here refer to the ABI, which is distinct from the target ISA. Specifically, the soft-float ABI can target ISAs with hardware floating point instructions.)
s390
- 32-bit, hard-float, BE: /lib/ld.so.1
- 64-bit, hard-float, BE: /lib/ld64.so.1
sh
- SH3, soft-float, BE: /lib/ld-linux.so.2
- SH3, soft-float, LE: /lib/ld-linux.so.2
- SH4, hard-float, BE: /lib/ld-linux.so.2
- SH4, hard-float, LE: /lib/ld-linux.so.2
- SH4, soft-float, BE: /lib/ld-linux.so.2
- SH4, soft-float, LE: /lib/ld-linux.so.2
sparc
- 32-bit, hard-float, BE: /lib/ld-linux.so.2
- 64-bit, hard-float, BE: /lib64/ld-linux.so.2
x86 / x86_64
- 32-bit, hard-float, LE: /lib/ld-linux.so.2
- 64-bit, hard-float, LE: /lib64/ld-linux-x86-64.so.2
- x32, hard-float, LE: /libx32/ld-linux-x32.so.2