繁体   English   中英

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

[英]Why does GCC produce illegal unalign accesses for ARM Cortex-A9

目标: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

产生的数据会由于未对齐的访问而导致数据中止。 GCC不会发出任何警告或其他任何警告。

有谁知道该如何解决?

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

如果使用-mno-unaligned-access则会得到正确的结果

令我惊讶的是,它默认情况下没有执行此操作,因为经常进行不对齐的内存访问是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM