1. .bss 段为何在 ELF 中只占 size 而非数据?
为什么 .bss 段在 ELF 文件中只占用 size(大小)而不占用实际数据?
- .bss 段存放未初始化/零初始化的全局变量
- 存储空间与运行时空间的分离
- 文件体积与加载效率
.bss 段存放未初始化的全局变量和静态变量(以及显式初始化为 0 的变量),这些变量在加载时统一清零。由于它们的值在文件中没有意义(全是 0),ELF 只需在节头中记录 .bss 的 size(大小),而不在文件里存放实际数据,从而减小文件体积。加载器在进程运行时按 size 分配一段清零的内存(通常映射到 ZERO_PAGE 或 memset 清零)。这是典型的"存储与运行时分离"优化。
全零数据无需存储,用 size 加"加载时清零"的语义即可复现,既省磁盘又省加载流量。这也是 .data 与 .bss 区分的关键:.data 存放有初始值的变量,必须存数据;.bss 存零值变量,只需 size。