本文介绍了apcs-gnu ABI 中的结构布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于此代码:

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.

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.

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

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

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

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

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.

推荐答案

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

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

摘自 :

/* 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

这篇关于apcs-gnu ABI 中的结构布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-11 09:41