![](/img/trans.png)
[英]Why does GCC generates Fxxx instead of Vxxx floating point assembly instructions for 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.