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 linux

/lib64/ld-linux-x86-64.so.2 but not /lib32/ld-linux.so.2this

https://wiki.debian.org/Multiarch spa

 

run following on Debian 64bit to add basic support for 32bit programs (anyway you need ld-linux at least...)code

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 flagsorm

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?blog

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

You can determine this information yourself using readelf -l, and the INTERP section:get

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/it

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
io

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]