понимание общих библиотек с помощью 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
не доступен. Это причина?