关于CSAPP中“未初始化全局变量为弱符号”描述的准确性及弱符号与COMMON符号的疑问
关于CSAPP中“未初始化全局变量为弱符号”描述的准确性及弱符号与COMMON符号的疑问
在《Computer Systems: A Programmer’s Perspective》(CSAPP)这本书里提到:“未初始化的全局变量会被当作弱符号”。但我自己动手做了个实验后,发现实际结果和这个描述不太一致,想在这里请教各位大佬。
我的实验过程
- 首先创建了
main.c文件,代码如下:
__attribute__((weak)) int var1; int var2; int var3 = 1; int main() { return 0; }
- 用GCC的
-fcommon选项编译生成目标文件:
gcc -fcommon -c main.c -o main.o
- 使用
readelf -s命令查看目标文件的符号表,得到的关键结果如下:
var1:标记为WEAK,存储在COMMON块中var2:标记为GLOBAL,存储在COMMON块中var3:标记为GLOBAL,存储在.data段中
实验结果分析
从符号表的结果来看:
var1是WEAK符号,这完全符合预期,因为我显式通过__attribute__((weak))指定了它的弱属性var3是GLOBAL符号,也很合理,因为它是初始化过的全局变量
但和CSAPP描述矛盾的点在于:未初始化的全局变量var2是GLOBAL符号,而非书中所说的弱符号,同时它被放在了COMMON块中。
我的疑问
我现在有两个核心问题想请教:
- 是CSAPP的这个描述存在不准确的地方,还是我误解了书中关于“强符号/弱符号”的相关表述?
- 弱符号(WEAK)和COMMON符号之间到底有什么区别、关联和优先级规则?如果在两个不同的源文件中,分别定义了同名的WEAK符号和COMMON符号,链接阶段会如何处理这种情况?
谢谢各位的关注,非常期待大家的解答和补充见解!
备注:内容来源于stack exchange,提问作者StaY_Hungry
相关产品推荐
相关产品推荐

