apcs-gnu ABI 中的结构布局
Struct layout in apcs-gnu ABI
对于this code:
struct S { unsigned char ch[2]; };
int main(void)
{
_Static_assert( sizeof(struct S) == 2, "size was not 2");
}
将 GCC(各种版本)用于带有 ABI apcs-gnu
(又名 OABI 或 EABI 版本 0)的 ARM,我得到断言失败。原来结构的大小是 4
.
我可以使用 __attribute__((packed))
来解决这个问题;但我的问题是:
- 使这个结构大小
4
的基本原理是什么?
- 是否有任何文档指定此 ABI 中的结构布局?
在 ARM 网站上,我找到了 aapcs
(EABI 版本 5)的文档,其中确实指定此结构的大小为 2;但我找不到任何关于 apcs-gnu
.
的信息
这是 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
对于this code:
struct S { unsigned char ch[2]; };
int main(void)
{
_Static_assert( sizeof(struct S) == 2, "size was not 2");
}
将 GCC(各种版本)用于带有 ABI apcs-gnu
(又名 OABI 或 EABI 版本 0)的 ARM,我得到断言失败。原来结构的大小是 4
.
我可以使用 __attribute__((packed))
来解决这个问题;但我的问题是:
- 使这个结构大小
4
的基本原理是什么? - 是否有任何文档指定此 ABI 中的结构布局?
在 ARM 网站上,我找到了 aapcs
(EABI 版本 5)的文档,其中确实指定此结构的大小为 2;但我找不到任何关于 apcs-gnu
.
这是 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