【发布时间】:2013-08-13 11:12:07
【问题描述】:
.data 和 .bss 的对齐有时是 4 个字节,有时是 32 个字节。 示例1:根据下面输出的最后一列,bss和数据的对齐方式是32字节
bash-3.00$ readelf --sections libmodel.so
There are 39 section headers, starting at offset 0x1908a63c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
...
[25] .data PROGBITS 01e221e0 1e211e0 26ca54 00 WA 0 0 32
[26] .bss NOBITS 0208ec40 208dc34 374178 00 WA 0 0 32
...
示例 2:根据下面的输出对齐 os .data 和 .bss 为 4 个字节
bash-3.00$ readelf --sections ./a.out
There are 28 section headers, starting at offset 0x78c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
...
[22] .data PROGBITS 0804956c 00056c 000034 00 WA 0 0 4
[23] .bss NOBITS 080495a0 0005a0 000004 00 WA 0 0 4
...
什么决定了 .bss 和 .data 的对齐方式?为什么有时是 4 个字节,有时是 32 个字节?
【问题讨论】:
-
数据对齐是编译器实现的细节。为什么这很重要?你想解决什么问题?
-
@lsk 我正在尝试减小我的应用程序的 .bss 段的大小,以便它在资源限制主机上消耗更少的内存。我希望 .bss 等于全局空间中定义的所有未初始化对象的大小总和。但即使我将对象的大小减少 8 个字节,.bss 的大小也不会减少。符号表确实显示对象大小减少了 8 个字节,但 .bss 大小没有变化。有 10,000 个这样的对象,但是当我将类的大小减少 8 个字节时,我在 .bss 中看不到任何变化。
标签: c memory-management