understanding shared libraries using gcc
Ich versuche das folgende Verhalten von gemeinsam genutzten Bibliotheken in C @ zu versteh
Machine One
$ cat one.c
#include<stdio.h>
int main() {
printf ("%d", 45);
}
$ gcc one.c -o one -O3
$ ldd one
linux-gate.so.1 => (0x00331000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bc2000)
/lib/ld-linux.so.2 (0x006dc000)
$ cat two.c
int main() {
int i = 0;
}
$ gcc two.c -o two -O3
$ ldd two
linux-gate.so.1 => (0x006f7000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00eb0000)
$
Machine Two
$ cat three.c
#include<stdio.h>
int main() {
printf ("%d", 45);
}
$ gcc three.c -o three -O3
$ ldd three
/usr/lib/libcwait.so (0xb7ffd000)
libc.so.6 => /lib/tls/i686/nosegneg/libc.so.6 (0x002de000)
/lib/ld-linux.so.2 (0x002bf000)
$
Ein paar Dinge, die ich derzeit nicht ganz verstehe:
Was bedeutet die in Klammern angegebene Adresse (zum Beispiel(0x002de000)
) bedeuten
Diese Adressen unterscheiden sich auch für dieselbe Bibliothek auf demselben Computer, was darauf hindeutet, dass dies Adressen der Speicherorte sind, an denen diese Bibliotheken geladen werden. Aber wenn das stimmt, warum werden diese Bibliotheken überhaupt in den Speicher geladen (ich habe die Programme noch nicht ausgeführt, sollten sie nicht nur zur Laufzeit geladen werden?).
Warum tuttwo
Brauchen Sie überhaupt Bibliotheken? Ich habe benutzt-O3
und die Assembler-Ausgabe ist
$ gcc two.c -S -O3
$ cat two.s
.file "two.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
$
Was brauchen Bibliotheken überhaupt?
Auf Maschine Zwei, warum ist/usr/lib/libcwait.so
wird anstelle von @ verwendlinux-gate.so.1
?
Ich denke, das liegt daran, dass der Kernel auf Maschine Zwei sehr alt ist (2.6.9) und die Bibliotheklinux-gate.so.1
ist nicht verfügbar. Ist das der Grund?