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]

 

你可能感兴趣的:(linux)