在《计算机系统:程序员的视角》(CSAPP)中,书中提到“未初始化的全局变量会得到弱符号”。经过一番实验,我发现这个描述似乎与实际发生的情况不一致。 这就是我所做的:
创建一个C文件
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
,这是合理的,因为我明确将其声明为 WEAK
。var3
GLOBAL
,这也是合理的,因为它是初始化的。
var2
是
GLOBAL
(与CSAPP的说法相反,未初始化的全局变量得到弱符号),并且它被放置在
COMMON
块中。所以我的问题是: