/proc/self/maps - 第三个映射文件?

Bru*_*ger 7 linux executable proc

我在我的笔记本电脑上运行 Arch linux,它现在是内核 3.12.9。内核在动态链接的可执行文件中映射的方式发生了一些变化,我无法弄清楚。这是示例:

% /usr/bin/cat /proc/self/maps
...
00400000-0040b000 r-xp 00000000 08:02 1186756             /usr/bin/cat
0060a000-0060b000 r--p 0000a000 08:02 1186756             /usr/bin/cat
0060b000-0060c000 rw-p 0000b000 08:02 1186756             /usr/bin/cat
00d6c000-00d8d000 rw-p 00000000 00:00 0                   [heap]
7f29b3485000-7f29b3623000 r-xp 00000000 08:02 1182988     /usr/lib/libc-2.19.so
...
Run Code Online (Sandbox Code Playgroud)

我的问题是:来自 的第三个映射是什么/usr/bin/cat

基于readelf -l /usr/bin/cat,有一个 0x1f8 字节的可加载段应该映射到 0x400000。在 0x60ae10 处有一个 0xae10 字节的可加载段。这两个文件对应于 00400000-0040b000 映射和 0060a000-0060b000 映射。但是第三个映射,声称文件偏移量为 0xb000 字节,似乎不对应任何 Elf64_Phdr。实际上,elf 头只有 2 个 PT_LOAD 段。

我通读fs/binfm_elf.c了内核 3.13.2 源代码,除了 PT_LOAD 段之外,我没有看到内核映射到任何其他内容。如果我运行strace -o trace.out /usr/bin/cat /proc/self/maps,我看不到任何mmap()会映射到 的调用/usr/bin/cat,因此内核映射了第三个部分。

我在cat /proc/self/maps运行内核 2.6.18 + RH 补丁的 RHEL 服务器上运行了相同的命令 ( )。这仅显示了 2 个 /usr/bin/cat 映射到内存中,因此这可能是内核 3.x 的新内容。

小智 2

我终于明白了这一点。内核只映射 2 个段。第三部分是内核加载的两部分之一的一部分。运行时链接器(在 INTERP pheader 中命名的程序,现在对我来说是 /usr/lib/ld-2.24.so)更改了映射的权限,mprotect()以便有读/写全局变量,只读全局变量和读取/执行文本段。您可以使用 看到这种情况发生strace,但很容易错过,因为它只是一个mprotect()调用。

导致此问题的不是内核更改,而是 GNU lib C 更改。