2009-04-13 17 views
1

I以下の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 
    }; 

Iは、(PS3用)GCC 4.1.1でコンパイル、私は警告を取得:

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

アセンブリコード警告ポイントであるとします以下の「.SECTION」句は:.INIT中のものは、可能なすべての場所で 『constの』読み取り専用であるため、

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

それはフラグの 『W』(書き込み可能な)部分を好きではないのdoesn強要しないコンパイラは "w"を吐き出さないようにします。私はどのようにしてコンパイラに "いいえ、本当にconst、私は冗談ではない"と言うことができますか?

+0

どのGCCのバージョンを使用していますか?これにより、gcc-3.4.5 –

+0

4.1.1(PS3用)の警告が表示され、それを反映するOPが更新されました。よかった、ありがとう。 –

答えて

0

おそらく、それが間違って設定されている属性は、 "aw"です。これは、私に "書き込み可能"であることを示唆しています。あなたの構造体のすべてがconstの場合は、これを実行しますか?

編集:ランダムなグーグルでは、「w」が「弱い」ことにもなることが示唆されているようです。

+0

私はconstをどこにでも置くようにOPを変更しましたが、同じ結果が得られます。ええ、.initが読み取り専用であるため、 "w" ritableフラグが好きではありません。なぜgccが最初に "w"を吐き出すのですか?どうすればそれを防ぐことができますか? ( "a"は割り振り可能ですが、ここで問題ありません) –

+0

うーん、私は "弱い"とは見ていませんでしたが、ここでは "書き込み可能"です(ELFセクションの下):http://sourceware.org/binutils/docs/as /Section.html –

0

GCC 4.3.3のGNU/Linux PCでは、.initは書き込み可能になっていません。マニュアルでセクション属性を手動で設定する方法が見つかりませんでした。

多分それは多くを助けるが、ここではいくつかの提案されません。何をしたいことはmain()前にいくつかのコードを実行している場合は、C++オブジェクトを使用することができます

  • 。そのコンストラクタはmain()の前に呼び出され、そのデストラクタは後に呼び出されます。
  • オブジェクトファイルを手動で修正する小さなツールを書くことができます。私はこれがすでに存在していると確信しています。おそらくここに:http://www.eresi-project.org/
  • GCC開発者に連絡することができます。多分それはバグです。
+0

応答いただきありがとうございます。残念ながら、C++はオプションではありません。私は実際に.initを書き込み可能にしたくありません。私はコードからすべての警告を削除しようとしています。この構造体は読み取り専用の場合は問題ありませんが、gccのバグのように見えますが、どこでもconstを持つデータのために "w"が吐出されます。 –

0

神様のために、gccをアセンブラとして使用しないでください!私はこのことが.initセクション(コードではありません)にある理由は見当たりませんが、そこに持っていなければならない場合は、あなたが望むアセンブリコードを書いてください。各プラットフォームの適切な場所にソース管理下に置き、それを使って完了させてください!

3

これはGCCの自動指定.SECTIONディレクティブのパラメータを持つ問題です。幸いにも、セクション名のパラメータはアセンブリ出力に直接コピーされ、この問題を回避することができます。

このディレクティブ:

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

は、このアセンブリを生成します

.section .init,"aw",@progbits 

警告を削除するには、次のように属性を指定することができます。

生成します
__attribute__ ((section(".init,\"ar\",@progbits ;"))) 

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

セミコロンは、残りの行をコメントとしてマークします。そのため、アセンブラは無視します。

関連する問題