6

.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 个字节?

4

4 回答 4

0

我认为那些不同的对齐值是由各自的ld脚本决定的。

  • 对于libmodel.sosection .data align=16, section .bss align=16
  • 对于a.outsection .data align=4, section .bss align=4
于 2013-08-12T11:21:11.140 回答
0

为什么有时是 4 个字节,有时是 32 个字节?

一旦可执行文件被加载到内存中,它就会通过进程虚拟地址进行寻址。对齐约束是由于虚拟地址寻址。例如,如果您查看elf的手册页,请查看 sh_addralign 的描述。这就是为什么不同的精灵对象指定不同的对齐要求的原因。您可以通过更改 a.out 的源以包含双精度并查看对齐方式是否更改来进行试验。

注意:这仅适用于内存对齐。实际磁盘文件也有对齐限制。为什么?我认为这将有助于在读取文件后轻松将文件数据映射到核心结构。如果我在这里错了,其他人可以纠正我。

更新:想澄清一个问题。仅由于芯片组强制执行的底层内存访问粒度,虚拟地址对齐是必需的。因此,为不同架构编译的相同程序可能会导致差异对齐限制。

于 2013-08-12T13:47:39.507 回答
0

有一本非常好的书,它不仅能让你很好地理解你的问题,还可以很好地理解与之相关的一切。

这本书的网站在这里

第 n 章。7 是你要找的那个。

我不知道您是否想要一个直接的答案,或更复杂的答案,但我希望它有所帮助。

于 2015-12-18T13:39:43.350 回答
0

对于 bss,对齐是使用数据类型的大小来决定的,如果它没有对齐,那么链接器首先对齐可以放置 bss 开始的变量地址。

于 2017-07-23T21:56:18.663 回答