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

时间:2016-10-05 16:10:12

标签: linux x86 alignment elf boundary

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

有没有任何规范来判断这个?

1 个答案:

答案 0 :(得分:4)

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

规范并未强制要求段直接对齐 但是它需要

  

可加载的流程细分必须具有p_vaddrp_offset的全等值   p_align,以网页大小为模。
  该成员[p_align]给出了该值   细分在内存和文件中对齐   值0和1表示否   对齐是必需的。否则,p_addr应该是积极的,不可或缺的   2,p_offset应该等于p_align,模p_align

在我看来,术语有点偏离(段通常意义上没有对齐,它们不是以Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K 0 4096 8192 16384 409600 K*4096 的倍数开始的)。

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

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

p_vaddr

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

Sections loaded in memory

现在,如果文件中段的开始不满足引用中所述的条件且os.path.getsize不是4KiB的倍数,则此“技巧”将不起作用,操作系统需要恢复为一旦加载就移动段。
为了简化操作并且不浪费内存,段通常与文件中的4KiB对齐。