为什么 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
,您会得到 correct result。
令我惊讶的是它默认情况下没有这样做,因为在 arm 上进行未对齐的内存访问通常是错误的。
目标: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
,您会得到 correct result。
令我惊讶的是它默认情况下没有这样做,因为在 arm 上进行未对齐的内存访问通常是错误的。