Struct layout in apcs-gnu ABI

感情迁移 提交于 2020-01-15 10:35:06

问题


For this code:

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

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

using GCC (various versions) for ARM with the ABI apcs-gnu (aka. OABI, or EABI version 0), I get the assertion fails. It turns out the size of the struct is 4.

I can work around this by using __attribute__((packed)); but my questions are:

  • What is the rationale for making this struct size 4?
  • Is there any documentation specifying the layout of structs in this ABI?

On the ARM website I found documentation for aapcs (EABI version 5) which does specify this struct as having a size of 2; but I could not find anything about apcs-gnu.


回答1:


This is a GCC-specific decision to trade-off size for performance. It can be overridden with -mstructure-size-boundary=8.

An excerpt from 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


来源:https://stackoverflow.com/questions/43786747/struct-layout-in-apcs-gnu-abi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!