compreendendo bibliotecas compartilhadas usando o gcc
Estou tentando entender o seguinte comportamento de bibliotecas compartilhadas em C
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)
$
Máquina Dois
$ 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)
$
Algumas coisas que eu não entendo completamente no momento:
Qual é o endereço indicado entre parênteses (por exemplo,(0x002de000)
) significar?
Esses endereços são diferentes mesmo para a mesma biblioteca na mesma máquina, o que sugere que esses são endereços dos locais na memória em que essas bibliotecas são carregadas. Mas, se isso for verdade, por que essas bibliotecas são carregadas na memória (eu ainda não executei os programas, eles não deveriam ser carregados apenas em tempo de execução?).
Porquetwo
precisa de alguma biblioteca? Eu tenho usado-O3
e a saída do assembler é
$ 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
$
Qual é a necessidade de qualquer biblioteca?
Na Máquina Dois, por que é/usr/lib/libcwait.so
sendo usado em vez delinux-gate.so.1
?
Eu acho que isso ocorre porque o kernel na Máquina Dois é muito antigo (2.6.9) e a bibliotecalinux-gate.so.1
não está disponível. Essa é a razão?