我想知道ELF格式是否已指定每个部分应与4kb边界对齐? 或者,仅在x86平台上,ELF的“实现”应将每个部分对齐到4kb边界。
有没有任何规范来判断这个?
答案 0 :(得分:4)
ELF 1.2 specifications描述驻留在文件中特定偏移量的实体,通常表示为p_offset
,并将加载到内存中的特定地址(通常表示为p_vaddr
)。
规范并未强制要求段直接对齐 但是它需要
可加载的流程细分必须具有
p_vaddr
和p_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
中指定的地址。
现在,如果文件中段的开始不满足引用中所述的条件且os.path.getsize
不是4KiB的倍数,则此“技巧”将不起作用,操作系统需要恢复为一旦加载就移动段。
为了简化操作并且不浪费内存,段通常与文件中的4KiB对齐。