Почему общие файлы отображаются в процессе 4 раза
Я пытался понять maps
в /proc
файловая система в Linux. Я заметил, что каждый общий файл был отображен 4 раза с различными смещениями и разрешениями. Я пришел к выводу, что это должны быть различные разделы в ELF и, следовательно, отображаются по-разному (.text
, .data
, .rodata
, так далее).
Но что было удивительно, так это то, что два сопоставления всегда имели одинаковое смещение в файле. Рассмотрим пример -
7fb8eebd6000-7fb8eebe0000 r-xp 00000000 08:06 3285700 /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fb8eebe0000-7fb8eeddf000 ---p 0000a000 08:06 3285700 /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fb8eeddf000-7fb8eede0000 r--p 00009000 08:06 3285700 /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fb8eede0000-7fb8eede1000 rw-p 0000a000 08:06 3285700 /lib/x86_64-linux-gnu/libnss_files-2.19.so
2-я и 4-я запись отображаются с одинаковым смещением в файле с разными разрешениями. После запуска objdump --headers
на упомянутом .so
файл, смещение файла 0xa000
кажется .got.plt
раздел.
24 .got.plt 00000160 000000000020a000 000000000020a000 0000a000 2**3
CONTENTS, ALLOC, LOAD, DATA
Может ли кто-нибудь пролить свет на то, почему он отображается дважды?
Я знаю о таблице PLT, что она исправляется при первом посещении функции, и, следовательно, может потребоваться разрешение на запись, но зачем другое сопоставление без каких-либо разрешений на чтение / запись?
Изменить: я проверил несколько других отображений общей библиотеки, и это не .got.plt
раздел, который отображается дважды. Но всегда есть один раздел, который отображается дважды, и двойное отображение всегда имеет ---p
разрешения.