我试图了解Linux中maps
文件系统中的/proc
。我观察到每个共享文件被映射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
第二个和第四个条目以不同的权限映射到文件中的相同偏移处。
在上述objdump --headers
文件上运行.so
时,0xa000
部分似乎出现了文件偏移.got.plt
。
24 .got.plt 00000160 000000000020a000 000000000020a000 0000a000 2**3
CONTENTS, ALLOC, LOAD, DATA
有人可以解释为什么它被映射了两次吗?
我知道PLT表是在第一次访问该函数时对其进行修补的,因此可能需要写许可权,但是为什么要另一个没有任何读/写许可权的映射呢?
编辑:我检查了其他一些共享库映射,而不是两次映射了.got.plt
部分。但是,始终有一个节被两次映射,并且双重映射始终具有---p
权限。