我试图更多地了解可执行文件的“公共”部分,我注意到在编译代码时,我可以看到仅在目标文件( )而不是可执行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”部分吗?