You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于CSAPP中“未初始化全局变量为弱符号”描述的准确性及弱符号与COMMON符号的疑问

关于CSAPP中“未初始化全局变量为弱符号”描述的准确性及弱符号与COMMON符号的疑问

在《Computer Systems: A Programmer’s Perspective》(CSAPP)这本书里提到:“未初始化的全局变量会被当作弱符号”。但我自己动手做了个实验后,发现实际结果和这个描述不太一致,想在这里请教各位大佬。

我的实验过程

  1. 首先创建了main.c文件,代码如下:
__attribute__((weak)) int var1;
int var2;
int var3 = 1;

int main()
{
    return 0;
}
  1. 用GCC的-fcommon选项编译生成目标文件:
gcc -fcommon -c main.c -o main.o
  1. 使用readelf -s命令查看目标文件的符号表,得到的关键结果如下:
  • var1:标记为WEAK,存储在COMMON块中
  • var2:标记为GLOBAL,存储在COMMON块中
  • var3:标记为GLOBAL,存储在.data段中

实验结果分析

从符号表的结果来看:

  • var1是WEAK符号,这完全符合预期,因为我显式通过__attribute__((weak))指定了它的弱属性
  • var3是GLOBAL符号,也很合理,因为它是初始化过的全局变量

但和CSAPP描述矛盾的点在于:未初始化的全局变量var2是GLOBAL符号,而非书中所说的弱符号,同时它被放在了COMMON块中。

我的疑问

我现在有两个核心问题想请教:

  1. 是CSAPP的这个描述存在不准确的地方,还是我误解了书中关于“强符号/弱符号”的相关表述?
  2. 弱符号(WEAK)和COMMON符号之间到底有什么区别、关联和优先级规则?如果在两个不同的源文件中,分别定义了同名的WEAK符号和COMMON符号,链接阶段会如何处理这种情况?

谢谢各位的关注,非常期待大家的解答和补充见解!

备注:内容来源于stack exchange,提问作者StaY_Hungry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:44:36