понимание общих библиотек с помощью gcc

Я пытаюсь понять следующее поведение общих библиотек в C

Машина первая

$ 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)
$

Машина Два

$ 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)
$

Несколько вещей, которые я не до конца понимаю в настоящее время:

Что означает адрес, указанный в скобках (например,(0x002de000)) имею в виду?

Эти адреса различны даже для одной и той же библиотеки на одном и том же компьютере, что говорит о том, что это адреса тех мест в памяти, куда эти библиотеки загружены. Но, если это правда, почему эти библиотеки вообще загружаются в память (я еще не запускал программы, не должны ли они загружаться только во время выполнения?).

Почемуtwo нужны какие-то библиотеки вообще? я использовал-O3и вывод ассемблера

$ 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
$

Зачем вообще нужны библиотеки?

На машине два, почему/usr/lib/libcwait.so используется вместоlinux-gate.so.1?

Я думаю, это потому, что ядро ​​на Machine Two очень старое (2.6.9) и библиотекаlinux-gate.so.1 не доступен. Это причина?

Ответы на вопрос(3)

Ваш ответ на вопрос