ELF 加载程序如何映射小于页面大小的部分?

How does the ELF loader mmap sections smaller than a page size?

mmap 手册页指出“文件以页面大小的倍数映射。”,在我的系统上是 4096 字节 (0x1000)。然而 ELF 文件可以有小于 0x1000 的部分,例如:

[Sections]

nth paddr        size vaddr       vsize perm name
―――――――――――――――――――――――――――――――――――――――――――――――――
0   0x00000000    0x0 0x00000000    0x0 ---- 
1   0x00001000  0xb93 0x00401000  0xb93 -r-x .text
2   0x00002000  0x660 0x00402000  0x660 -r-- .rodata
3   0x00002660  0x304 0x00402660  0x304 -r-- .eh_frame
4   0x00003000   0xe6 0x00404000   0xe6 -rw- .data
5   0x000030e6    0x0 0x00404100  0x100 -rw- .bss
6   0x000030e6   0x2e 0x00000000   0x2e ---- .shstrtab

ELF如何加载和映射它们?它不能天真地四舍五入到 0x1000,因为那样下一节就会失败。它是否以某种方式检测到这一点并将连续的页面组合在一起?如果他们有不同的权限怎么办?

How does ELF load and mmap them?

ELF 加载程序不查看也不关心任何部分。事实上,headers 部分可以完全剥离,可执行文件将继续正常工作。部分在(静态)link 时间 使用。

加载器关心的是。您可以使用 readelf -Wl a.out.

查看段(以及段到段的映射)

是的:段可以有 non-even 页长度。加载程序不关心——它只是执行 mmap()(内核将映射舍入到整个页面大小)。

另请参阅this 部分相关的答案。

它可能只用一整页来满足您的请求,但正如您所说,让步的内存量只是您请求的内存量。这既不与任意请求的可能性冲突,又与系统无关。如果您调整内存量,请考虑您要求的确切内存量。