这个问题就是要解决当多个源文件中都定义了相同名称的全局符号或函数时,链接器如何处理。流程如下:
(1)在编译的时候,编译器会将每个全局符号输出给汇编器。其中,每个全局符号都有强弱之分,函数和已经初始化了的全局变量是强符号,未初始化的变量是弱符号。
(2)汇编器将这些符号的强弱信息隐含的编码在可重定位的目标文件的符号表里。
(3)根据全局符号的强弱,链接器按以下规则处理多处定义的全局符号:
(a)不允许有多个强符号。
(b)如果有一个强符号 和 多个弱符号,则选择强符号。
(c)如果没有强符号,有多个弱符号,则从这些弱符号中任意选择一个。
简单的说就是强者 优先弱者平等的原则。
示例说明,有两个源文件foo3.c 和bar3.c,都定义了全局变量x,但一个是初始化了的强符号,一个是未初始化的若符号。如下:
/*foo3.c*/
#include<stdio.h>
void f(void)
int x=15213;
int main()
{
f();
printf("x=%d",x);
return 0;
}
/*bar3.c*/
int x;
void f()
{
x=15212;
}
按照上面的原则,编译器不会检测到错误。
gcc -o foobar3 foo3.c bar3.c
运行foobar3后,输出x=15212;
但是,上面的链接器处理多处定义全局符号的原则仅是unix/linux系统下的,在vc 6中,上述代码就会出现链接错误。
文章评论(0条评论)
登录后参与讨论