32bit / 64bit co-exist Linux, ld-linux.so, linux-gate.so.1 etc
before this, confirm that you don't have 32bit libs notably 32bit libc, e.g. you have
/lib64/ld-linux-x86-64.so.2 but not /lib32/ld-linux.so.2
https://wiki.debian.org/Multiarch
run following on Debian 64bit to add basic support for 32bit programs (anyway you need ld-linux at least...)
dpkg --add-architecture i386; aptitude install libc6-i386 libc6-dev-i386 (note that don't use libc6:i386 otherwise apt thinks you'd use libc-i386 as the main libc)
write a simple "hello world", and compile with different flags
gcc -m32 hello.c -o hello32 ldd hello32 linux-gate.so.1 (0xf7765000) libc.so.6 => /lib32/libc.so.6 (0xf75a2000) /lib/ld-linux.so.2 (0xf7766000) gcc -m64 hello.c -o hello64 ldd hello64 linux-vdso.so.1 (0x00007fff1cfa4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe71d001000) /lib64/ld-linux-x86-64.so.2 (0x00007fe71d3c1000)
What is ld-linux.so.2?
This program is defined as part of the structure of the ELF file, in the INTERP
section of the program header. For 32bit linux binaries, this is the typical name of the 32bit interpreter. For 64bit binaries, you'll find it is typically called ld-linux-x86_64.so.2
(for 64bit x86 platforms).
You can determine this information yourself using readelf -l
, and the INTERP section:
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
What is linux-gate.so.1? very good article on this: http://www.trilithium.com/johan/2005/08/linux-gate/
there's not supposed to be a linux-gate.so.1 file present anywhere on the file system; it's a virtual DSO (dynamic shared object), a shared object exposed by the kernel at a fixed address in every process' memory:
http://en.wikipedia.org/wiki/VDSO
for example, run "cat /proc/self/maps" and it'll give the memory layout of cat process
cat /proc/self/maps 00400000-0040b000 r-xp 00000000 08:01 403141 /bin/cat 0060a000-0060b000 r--p 0000a000 08:01 403141 /bin/cat 0060b000-0060c000 rw-p 0000b000 08:01 403141 /bin/cat 02376000-02397000 rw-p 00000000 00:00 0 [heap] 7fb1eabf3000-7fb1ead93000 r-xp 00000000 08:01 391959 /lib/x86_64-linux-gnu/libc-2.18.so 7fb1ead93000-7fb1eaf92000 ---p 001a0000 08:01 391959 /lib/x86_64-linux-gnu/libc-2.18.so 7fb1eaf92000-7fb1eaf96000 r--p 0019f000 08:01 391959 /lib/x86_64-linux-gnu/libc-2.18.so 7fb1eaf96000-7fb1eaf98000 rw-p 001a3000 08:01 391959 /lib/x86_64-linux-gnu/libc-2.18.so 7fb1eaf98000-7fb1eaf9c000 rw-p 00000000 00:00 0 7fb1eaf9c000-7fb1eafbc000 r-xp 00000000 08:01 391749 /lib/x86_64-linux-gnu/ld-2.18.so 7fb1eb018000-7fb1eb1a1000 r--p 00000000 08:01 1052029 /usr/lib/locale/locale-archive 7fb1eb1a1000-7fb1eb1a4000 rw-p 00000000 00:00 0 7fb1eb1b9000-7fb1eb1bb000 rw-p 00000000 00:00 0 7fb1eb1bb000-7fb1eb1bc000 r--p 0001f000 08:01 391749 /lib/x86_64-linux-gnu/ld-2.18.so 7fb1eb1bc000-7fb1eb1bd000 rw-p 00020000 08:01 391749 /lib/x86_64-linux-gnu/ld-2.18.so 7fb1eb1bd000-7fb1eb1be000 rw-p 00000000 00:00 0 7fff48a06000-7fff48a27000 rw-p 00000000 00:00 0 [stack] 7fff48a49000-7fff48a4b000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]