Почему общие файлы отображаются в процессе 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 разрешения.

0 ответов

Другие вопросы по тегам