链接 —符号解析
我想就编译器向汇编器输出的全局符号强弱问题进行一定的深度探讨,目前我们知道的是,函数和已初始化的全局变量是强符号,未初始化的全局变量是若符号。进行一定的实验,看看链接时强弱符号重名时看看是怎么定义的。
代码
1.两强函数
2两.强全局变量 3.一强全局变量与一弱全局变量 4两弱全局变量
实验结果
1.当foo1.c和bar1.c中有相同的函数名(强符号)main()时,编译运行的结果为: 分析:会产生一条错误信息,因为强符号main()已被定义过一次 2.当foo2.c和bar2.c中有两个同名的已赋值的全局变量(强符号)时,编译运行的结果为: 分析:会产生一条错误信息,因为强符号x已被定义过一次 3.当foo3.c中已赋值的x(强符号)遇上bar3.c中未赋值的x(弱符号)时,编译的结果为: 分析:强符号x的值被定义,但是弱符号模块中的f()将x的值改变为15212 4.当foo4.c和bar4.c中有两个未赋值的全局变量x时,编译的结果为: 分析:两次链接的地址不同,说明调用了不同模块的的x。
结论
规则1:不允许有多个重名的强符号 规则2:如果有一个强符号和一个弱符号同名时,选择强符号 规则3:如果有多个弱符号同名,那么从这些弱符号中任意选一个