【问题标题】:How is the alignment of .data and .bss determined.data和.bss的对齐方式是如何确定的
【发布时间】: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


【解决方案1】:

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

  • 对于libmodel.sosection .data align=16, section .bss align=16
  • 对于a.outsection .data align=4, section .bss align=4

【讨论】:

  • 由于libmodel.so 数据在最后一列中明确指出“Al 32”,因此指定的对齐方式似乎被指定为 32 而不是 16,
  • libmodel.so 中的 .data 和 .bss 部分均已对齐为 32 字节。例如,对于 .data 部分,地址是 01e221e0 ,这意味着最后五个 LSB 位已设置为零。换句话说,它与 32 字节对齐。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    本书的网址是here

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 2018-01-12
        相关资源
        最近更新 更多