Адрес загрузки общей библиотеки под Linux - PullRequest
6 голосов
/ 02 марта 2011

У меня есть серьезные сомнения относительно общей библиотеки. Я изучил то, что виртуальный адрес библиотеки, который будет использоваться разными процессами, будет одинаковым для всех этих процессов. Но я попытался разобраться в этом с помощью файловой системы proc с помощью следующего набора команд:

$ cat /proc/*/maps | grep /lib/libc-2.12.1.so

Вывод был:

0025a000-003b1000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00485000-005dc000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
005dc000-005dd000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005dd000-005df000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005df000-005e0000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00181000-002d8000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
002d8000-002d9000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002d9000-002db000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002db000-002dc000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0013c000-00293000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00293000-00294000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00294000-00296000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00296000-00297000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00bf7000-00d4e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00d4e000-00d4f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d4f000-00d51000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d51000-00d52000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00227000-0037e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
0037e000-0037f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0037f000-00381000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so

Виртуальные адреса разные для одной и той же общей библиотеки для разных процессов.

Может кто-нибудь объяснить, почему это так?

Ответы [ 2 ]

6 голосов
/ 02 марта 2011

Загрузчик разделяемой библиотеки ld.so может изменять виртуальные адреса, по которым загружается разделяемая библиотека, в зависимости от потребностей двоичного файла, поскольку размер кода, данных и других разделов может варьироваться от одного двоичного файла к другому.Процесс перестановки адресного пространства называется relocation .

Перемещение также является причиной, по которой вам необходимо скомпилировать разделяемые библиотеки как позиционно-независимый код с gcc -fPIC.

3 голосов
/ 02 марта 2011

Тот же виртуальный адрес для разделяемых библиотек от a.out дней. ELF не имеет такого ограничения.

Дополнительно ядро ​​рандомизирует макет отображения (см. ASLR).

...