2009-04-13 23 views
1

我有下面的C代碼:如何擺脫gcc彙編程序警告「在C代碼中爲.init設置不正確的段屬性」?

struct myStruct_t 
{ 
    const char  m_name[60]; 
    const uint32_t m_data; 
}; 

const struct myStruct_t myStruct 
    __attribute__((__aligned__(64), section(".init"))) = 
    { 
     "myName", 
     (uint32_t)&someOtherStruct 
    }; 

當我在GCC 4.1.1(用於PS3)編譯,我得到警告:

1>c:/t/ccy6.s: Assembler messages: 
1>c:/t/ccy6.s(106): Warning: setting incorrect section attributes for .init 

彙編代碼的預警點是「.section僞」的條款:

  .section    .init,"aw",@progbits 
      .align 6 
      .type     myStruct , @object 
      .size     myStruct , 64 
myStruct : 
      .ascii    "myName" 
      .long     someOtherStruct 

它不喜歡的標誌的‘W’(寫的)一部分,因爲在的.init的東西是,在所有可能的地方‘常量’只讀沒有按不要強迫編譯器不要吐出「w」。我怎麼能告訴編譯器「不,真的,這是const,我不是在開玩笑」?

+0

您使用的是哪個版本的GCC?這給我沒有警告與海灣合作委員會3.4.5 – 2009-04-13 21:30:35

+0

4.1.1(對於PS3)..更新OP來反映這一點。好的電話,謝謝。 – 2009-04-13 21:48:22

回答

0

瘋狂的猜測,但也許它設置錯誤的屬性是「aw」,這表明「可寫」給我。如果你的結構中的所有東西都是const,它仍然會這樣做嗎?

編輯:隨機谷歌搜索似乎表明,「W」也可以代表「弱」?

+0

我改變了OP把const放到每個地方,我得到了相同的結果。是的,由於.init是隻讀的,它不喜歡「w」可用標誌。爲什麼gcc首先吐出「w」,我該如何防止它? (「a」意思是可分配的,這裏很好) – 2009-04-13 22:52:38

0

在具有GCC 4.3.3的GNU/Linux PC上,.init不能寫入。我沒有在文檔中找到如何手動設置節屬性。

也許這將幫助不大,但這裏有一些建議:

  • 如果你想要的是main()之前執行一些代碼,你可以使用C++對象。它的構造函數將在main()之前調用,其後的析構函數會被調用。
  • 您可以編寫一個小工具來手動修補目標文件。我很確定這已經存在。也許在這裏:http://www.eresi-project.org/
  • 您可以聯繫GCC開發人員。也許這是一個錯誤。
0

看在上帝的份上,不要試圖用gcc作爲彙編程序!我沒有看到任何理由爲什麼這個東西應該在.init部分(它不是代碼),但是如果你必須在那裏,寫下你想要的彙編代碼(你有一個很好的開始,只需編輯),把它放在源代碼控制下,放在每個平臺的適當位置,然後完成它!

3

這是GCC自動指定爲.section僞指令的參數有問題。幸運的是,部分名稱參數直接複製到程序集輸出中,允許您解決此問題。

該指令:

__attribute__ ((section(".init"))) 

生成此組件:

.section .init,"aw",@progbits 

要刪除的警告,你可以指定這樣的屬性:

__attribute__ ((section(".init,\"ar\",@progbits ;"))) 

這將產生:

.section .init,"ar",@progbits ;"aw",@progbits 

分號將該行的其餘部分標記爲註釋,因此彙編程序會忽略它。

相關問題