There are 3 regular ABIs that can be used on standard Intel-compatible machines (not Itanium).
- A classic 32-bit architecture, often called "x86" for short, which has triples such as
i[3-6]86-linux-gnu . Registers and pointers are 32 bits. - AMD's 64-bit extension, often called "amd64" for short, which has the GNU
x86_64-linux-gnu triple. Registers and pointers - 64 bits. - New "x32" ABI with triple
x86_64-linux-gnux32 . Registers are 64 bits, but pointers are only 32 bits, which saves a lot of memory when working with a large number of pointers. It also provides access to all other 64-bit processor functions.
Each of the above has its own system call interface, its own ld.so , its own complete set of libraries, etc. But you can run all 3 in the same kernel.
On Linux, their loaders are:
% objdump -f /lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2 /lib/ld-linux.so.2: file format elf32-i386 architecture: i386, flags 0x00000150: HAS_SYMS, DYNAMIC, D_PAGED start address 0x00000a90 /lib64/ld-linux-x86-64.so.2: file format elf64-x86-64 architecture: i386:x86-64, flags 0x00000150: HAS_SYMS, DYNAMIC, D_PAGED start address 0x0000000000000c90 /libx32/ld-linux-x32.so.2: file format elf32-x86-64 architecture: i386:x64-32, flags 0x00000150: HAS_SYMS, DYNAMIC, D_PAGED start address 0x00000960
Now, if you get a message about โskipping an incompatible libraryโ, it means that something went wrong with your configuration. Make sure that you do not have bad variables in the environment or are transferred to the command line or files installed outside the control of the package manager.
source share