簡體   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