background image

3. 

 

《计算机组成结构化方法》 Andrew S. Tanenbaum 

 

机械工业出版社

4. 

 

《计算机组成与设计 硬件/

 

软件接口》 David A. Patterson John L. Hennessy 机械工业出版

 

 

附件:链接器的使用

 

许多 Visual C++ 

 

的使用者都碰到过 LNK2005:symbol already defined 

 

和 LNK1169:one or 

more multiply defined symbols found 这样的链接错误,而且通常是在使用第三方库时遇到
的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那

 

 

么本文就试图为大家彻 底解开关于它的种种疑惑。

 

大家都知道,从 C/C++ 

 

源程序到可执行文件要经历两个阶段 : 

(1) 

 

编译器将源文件编译成汇编代码,然后由汇编器 (assembler) 

 

翻译成机器指令 ( 再加上

 

其它相关信息 ) 

 

后输出到一个个目标文件 (object file, VC 的编译器编译出的目标文件默认

 

的后缀名是 .obj) 

 

中;

(2) 

 

链接器 (linker) 

 

将一个个的目标文件 ( 

 

或许还会有若干程序库 ) 链接在一起生成一个

 

完整的可执行文件。

    

 

编译器编译源文件时会把源文件的全局符号

(global symbol) 

 

分成强 (strong) 和弱 

(weak) 两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。

 

那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化 的全

 

局变量则成了弱符号。比如有这么个源文件 : 

extern int errorno; 

int buf[2] = {1,2}; 

int *p; 

int main() 

   return 0; 

 

其中 main   

、buf 

 

是强符号, p 

 

是弱符号,而 errorno 则非强非弱,因为它只是个外部变量

 

的使用声明。

有了强弱符号的概念,我们就可以看看链接器是如何处理与选择被多次定义过的全局符

 

号 : 

 

规则 1: 

 

不允许强符号被多次定义 ( 

 

即不同的目标文件中不能有同名的强符号 )   

 

规则 2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择