私は常に、GCCがELFまたはそのようなファイルのセグメント(または最適化のためのセグメント)にstatic const
変数を配置すると信じていました。しかし、そうではないようです。.rodata
.text
私は現在gcc (GCC) 4.7.0 20120505 (prerelease)
、GNU/Linuxを搭載したラップトップで使用しています。そして、静的定数変数を.bss
セグメントに配置します。
/*
* this is a.c, and in its generated asm file a.s, the following line gives:
* .comm a,4,4
* which would place variable a in .bss but not .rodata(or .text)
*/
static const int a;
int main()
{
int *p = (int*)&a;
*p = 0; /* since a is in .data, write access to that region */
/* won't trigger an exception */
return 0;
}
それで、これはバグですか、それとも機能ですか?これをbugzillaのバグとして提出することにしましたが、最初に助けを求める方がよいかもしれません。
GCCがconst変数を配置できない理由はあります.rodata
か?
更新しました:
テストされたように、明示的な初期化(のような)を持つ定数変数はGCCによってconst int a = 0;
配置されますが、変数は初期化されません。.rodata
したがって、この質問は後で閉じられる可能性があります-私はおそらく正しい質問を提示しませんでした。
また、前の言葉で、変数aが「.data」セクションに配置されていると書きましたが、これは正しくありません。初期化されていないため、実際には.bss
セクションに配置されます。上記のテキストが修正されました。