Я пытаюсь понять следующее поведение разделяемых библиотек в Cпонимание общих библиотек с использованием GCC
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)
$
машина Два
$ 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
недоступна. Это причина?
'two.c 'можно было бы оптимизировать в 0-байтную (или почти 0-байтовую) программу. Но ни один производитель не собирается создавать компиляторы, которые оптимизируют для тривиальных программ. –