32 位可执行会话按 4kb 对齐,它是 elf 格式的一部分吗?

32bit executable session is aligned by 4kb, is it part of elf format?

我想知道ELF格式有没有规定每个section要对齐到4kb边界? 或者,仅在 x86 平台上,ELF 的 'implementation' 应将每个部分对齐到 4kb 边界。

这个有判断规范吗?

ELF 1.2 specifications 描述了驻留在文件中特定偏移处的实体,通常表示为 p_offset,并将加载到内存中的特定地址(通常表示为 p_vaddr).

该规范不强制直接
段的任何对齐 但是它需要

Loadable process segments must have congruent values for p_vaddr and p_offset, modulo the page size.
This member [p_align] gives the value to which the segments are aligned in memory and in the file.
Values 0 and 1 mean that no alignment is required. Otherwise, p_align should be a positive, integral power of 2, and p_addr should equal p_offset, modulo p_align.

我认为这个术语有点不对(段不是通常意义上的对齐,它们不是从 p_align 的倍数开始)。

引用背后的基本原理是系统必须能够快速加载一个段,因此有必要避免在内存中移动它以匹配其加载地址。

加载时的文件由一个或模式"unit"内存组成,称为
页面通常具有固定大小,因此它们的起始地址都是其大小的倍数。
对于 32 位 x86 系统,这个大小是 4KiB,想象一下页面序列及其起始地址:

Page 0  Page 1  Page 2  ... Page 4 ... Page 100 ... Page K 
  0      4096    8192        16384      409600      K*4096

重点是可以非常快速地更改页面地址,而无需复制任何字节,这称为重新映射
加载文件后,OS 重新映射文​​件的页面,以便每个段位于其在 p_vaddr 中指定的地址。

现在,如果文件中段的开头不满足引用中所述的条件并且 p_align 不是 4KiB 的倍数,则此 "trick" 将不起作用并且 OS 加载后需要恢复移动段。
为了使事情变得简单并且不浪费内存,段通常在文件中对齐到 4KiB。