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

标签 linux x86 alignment elf boundary

我想知道ELF格式有没有规定每一段都要对齐到4kb边界? 或者,仅在 x86 平台上,ELF 的“实现”应将每个部分对齐到 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 的倍数开始)。

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

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

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

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

Sections loaded in memory

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

关于linux - 32 位可执行 session 按 4kb 对齐,它是 elf 格式的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878982/

相关文章:

linux - 静态链接的共享对象?还是损坏的文件?

php 按最新的顺序列出目录文件

html - Bootstrap 4 导航栏理解

c - 从float转换为double会产生不同的结果-相同的代码,相同的编译器,相同的OS

html - 在手机上观看时,嵌入式 Youtube 视频会 float 到右侧

text - 如何将文本与框的边缘对齐?

linux - 纯文本表格到 csv linux

ruby - 在 Linux Mint 17 上安装 Ruby on Rails

c - 为什么将 4 字节参数传递给需要 2 字节参数的函数有效?

x86 - 进入保护模式: Triple-Fault