![](/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.