【发布时间】:2018-11-05 11:49:34
【问题描述】:
我的教科书上说:
“函数和初始化的全局变量得到强符号。未初始化的全局变量得到弱符号。给定一个强符号和多个弱符号,选择强符号”
所以我创建了两个文件来查看:
file1.c:
int number;
int main(int argc, char *argv[])
{
printf("%d",number);
return 0;
}
file2.c(只有一行):
int number = 2018;
我跑了gcc -Wall -o program file1.c file2.c,输出为0,在我研究链接器之前我可以理解(file1.c中的'number'已经初始化为0),但是在我研究了链接器是如何工作的之后,我开始怀疑为什么输出不是 2018,因为 file2 中的“数字”是强符号(初始化的全局变量),而 file1 中的“数字”是弱符号,所以链接器会选择值为 2018 的强符号,那么为什么链接器选择弱符号?
【问题讨论】:
-
你用的是什么工具链?我认为这是根据标准的 UB,但我很确定大多数链接器会将
int number;设为所谓的“通用”符号,在存在强符号的情况下,它将被强符号合并。我将迎来 2018 年的所有 tinycc、gcc 和 clang。
标签: c linker operating-system static-linking