実行可能ファイルの「共通」セクションについてもっと理解しようとしていますがobjdump
、コンパイルされたコードで実行すると、実行可能ファイルではなくオブジェクトファイル()にのみ共通コードに配置された変数が表示されることに気付きまし*.o
た。
何故ですか?
//test.c
int i[1000];
int main(){return 0;}
ビルドコマンド:
> gcc -g0 -fcommon -c test.c
> gcc -g0 -fcommon test.c
objdump
i
シンボルテーブルの共通セクションに表示されます。
> objdump -x test.o
...
SYMBOL TABLE:
...
00000fa0 O *COM* 00000020 i
実行可能ファイルで実行しない限り、次のようになります。
> objdump -x a.out
...
SYMBOL TABLE:
...
0804a040 g O .bss 00000fa0 i
-fno-common
代わりにフラグを使用してオブジェクトファイルを再構築すると.bss
、実行可能ファイルの場合と同じようにセグメントに表示されます。最終的な実行可能ファイルには、この「COMMON」セクションがありませんか?