【问题标题】:Struct layout in apcs-gnu ABIapcs-gnu ABI 中的结构布局
【发布时间】:2017-05-04 15:12:00
【问题描述】:

对于this code

struct S {     unsigned char ch[2]; };

int main(void)
{
    _Static_assert( sizeof(struct S) == 2, "size was not 2");
}

使用带有 ABI apcs-gnu(又名 OABI 或 EABI 版本 0)的 ARM 的 GCC(各种版本),我得到断言失败。原来结构的大小是4

我可以使用__attribute__((packed)) 解决这个问题;但我的问题是:

  • 使这个结构大小4 的基本原理是什么?
  • 是否有任何文档指定此 ABI 中结构的布局?

在 ARM 网站上,我找到了 aapcs(EABI 版本 5)的文档,该文档确实将此结构指定为大小为 2;但我找不到任何关于 apcs-gnu 的信息。

【问题讨论】:

  • 填充不是 ABI 的一部分。由于现代总线架构,让每条数据都与 4 字节地址对齐可能非常有意义。
  • 不确定您的具体平台,但通常以 4 个字节访问内存会生成更快的代码,所以也许这就是原因。
  • 为什么你的代码要求这个结构的大小为 2 个字节?
  • @EugeneSh。结构对齐规则总是在 ABI 中定义,否则将无法在 asm 中开发兼容的程序。
  • @BrianSidebotham 这是根据APCS ABI的结构大小。

标签: c gcc struct arm elf


【解决方案1】:

这是一个 GCC 特定的决定,用于权衡性能大小。它可以被-mstructure-size-boundary=8覆盖。

摘自source code

/* Setting STRUCTURE_SIZE_BOUNDARY to 32 produces more efficient code, but the
value set in previous versions of this toolchain was 8, which produces more
compact structures.  The command line option -mstructure_size_boundary=<n>
can be used to change this value.  For compatibility with the ARM SDK
however the value should be left at 32.  ARM SDT Reference Manual (ARM DUI
0020D) page 2-20 says "Structures are aligned on word boundaries".
The AAPCS specifies a value of 8.  */
#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多