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

Tro*_*yvs 3 linux x86 alignment boundary elf

我想知道 ELF 格式是否已指定每个部分应与 4kb 边界对齐?或者,仅在 x86 平台上,ELF 的“实现”应将每个部分与 4kb 边界对齐。

是否有任何规范可以对此进行判断?

Mar*_*oom 5

所述ELF 1.2规范描述的实体驻留在特定文件中的偏移量,经常表示为p_offset,这将在存储器中的特定地址被加载(通常表示为p_vaddr)。

该规范不强制的片段的任何对准直接
然而它要求

可加载进程段必须具有p_vaddr和 的全 等值p_offset,以页面大小为模。
该成员 [ p_align] 给出了段在内存和文件中对齐的值 。
值 0 和 1 表示不需要对齐。否则,p_align应该是 2 的正整数幂,并且p_addr应该等于p_offset,模p_align

在我看来,这个术语有点偏离(段在通常意义上没有对齐,它们不是以倍数开始的) p_align)。

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

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

Page 0  Page 1  Page 2  ... Page 4 ... Page 100 ... Page K 
  0      4096    8192        16384      409600      K*4096
Run Code Online (Sandbox Code Playgroud)

关键是可以非常快速地更改页面的地址,而无需复制任何字节,这称为重新映射
加载文件后,操作系统会重新映射文​​件的页面,以便每个段都位于p_vaddr.

加载到内存中的部分

现在,如果文件中段的开头不满足引用中规定的条件并且p_align不是 4KiB 的倍数,则此“技巧”将不起作用,操作系统需要在加载后恢复为移动段。
为了使事情变得简单并且不浪费内存,文件中的段通常与 4KiB 对齐。

  • 请注意,问题是关于部分(没有任何 4KiB 对齐要求)。目前尚不清楚OP是否理解部分和段之间的区别。 (2认同)