为什么GCC会为ARM Cortex-A9产生非法的非对齐访问

时间:2016-01-22 16:28:56

标签: c gcc arm abort

目标:ARM Cortex-A9
GCC版本:4.9.2

大家好,

我遇到GCC生成核心的问题,因为未对齐的访问导致数据中止。我隔离了一段显示问题的代码。我不知道如何让GCC正确处理这个问题。帮助将不胜感激!

struct B
{
    char c1;
    char c2;
    char c3;
    char c4;
};

struct A
{
    char c;
    struct B b;
    char c2;
};

int main(int argc, char** argv)
{
    struct A a;
    a.c2 = 42;    // Works fine
    a.b.c1 = 42   // Works fine, too
    struct B b;
    b = a.b;      // Crashes because of unaligned access
    return 0;
}

内存布局如下所示:

a           struct A    48  S:0x3FFFFFE0    R/W
  c         char        8   S:0x3FFFFFE0    R/W
  b         struct B    32  S:0x3FFFFFE1    R/W
    c1      char        8   S:0x3FFFFFE1    R/W
    c2      char        8   S:0x3FFFFFE2    R/W
    c3      char        8   S:0x3FFFFFE3    R/W
    c4      char        8   S:0x3FFFFFE4    R/W
  c2        char        8   S:0x3FFFFFE5    R/W

现在为前两个分配命令,如

a.c2 = 42;     : STRB     r3,[r11,#-7]       with r11 = 0x3FFFFFEC

生产出来并且工作正常。

但是,对于最后一次作业,

b = a.b;       : LDR      r0,[r2,#0]         with r2 = 0x3FFFFFE1
由于未对齐访问,导致数据中止的原因是

。 海湾合作委员会没有发出任何警告或任何相关信息。

有谁知道如何解决这个问题?

顺便说一句,所有结构声明中的对齐属性都不是我项目中的选项。

1 个答案:

答案 0 :(得分:1)

如果您使用-mno-unaligned-access,则会获得correct result

令我惊讶的是,默认情况下它并没有这样做,因为手臂上的未对齐内存访问通常是错误的。