我想知道ELF格式有没有规定每一段都要对齐到4kb边界? 或者,仅在 x86 平台上,ELF 的“实现”应将每个部分对齐到 4kb 边界。
有没有规范可以判断这个?
最佳答案
ELF 1.2 specifications描述驻留在文件中特定偏移处的实体,通常表示为 p_offset
,并将加载到内存中的特定地址(通常表示为 p_vaddr
)。
规范不要求任何段直接对齐。
但是它需要
Loadable process segments must have congruent values for
p_vaddr
andp_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, andp_addr
should equalp_offset
, modulop_align
.
我认为这个术语有点不对(段不是通常意义上的对齐,它们不是以 p_align
的倍数开始)。
引用背后的基本原理是系统必须能够快速加载一个段,因此有必要避免在内存中移动它以匹配其加载地址。
加载时的文件由一个或模式“单元”内存组成,称为页面。
页面通常具有固定大小,因此它们都从其大小倍数的地址开始。
对于 32 位 x86 系统,这个大小是 4KiB,想象一下页面序列及其起始地址:
Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K
0 4096 8192 16384 409600 K*4096
重点是可以非常快速地更改页面地址,而无需复制任何字节,这称为重新映射。
加载文件后,操作系统会重新映射文件的页面,以便每个段都位于 p_vaddr
中指定的地址。
现在,如果文件中段的开头不满足引用中所述的条件并且 p_align
不是 4KiB 的倍数,这个“技巧”将不起作用,操作系统需要加载后恢复移动段。
为了使事情变得简单并且不浪费内存,段通常在文件中与 4KiB 对齐。
关于linux - 32 位可执行 session 按 4kb 对齐,它是 elf 格式的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878982/