C C++ Java中链接器对全局符号的解析
2014-01-13 11:34
176 查看
链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。
//C语言中处理方式
在C语言中,对全局符号的符号解析很棘手,因为相同的符号会被多个目标文件定义。在这种情况中,链接器必须要么标志一个错误,要么以某种方法选出一个定义并抛弃其他定义。
在链接时,编译器输出每个全局符号给汇编器,或者是强,或者是弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表中。函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。
根据强弱符号的定义,Unix链接器使用下面的规则来处理多处定义的符号;
规则1:不允许有多个强符号。
规则2:如果有一个强符号和多个弱符号,那么选择强符号。
规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个。
//对C++和Java中链接器符号的毁坏
C++和Java中都允许重载方法,这些方法在源代码中有相同的名字,且有着不同的参数列表。那么链接器是如何区别这些不同的重载函数之间的差异呢?C++和Java中能使用重载函数,是因为编译器将每个唯一的方法和参数列表组合编码成一个对链接器来说唯一的名字。这种编码过程叫做毁坏,而相反的过程叫做恢复。
幸运的是,C++和Java使用兼容的毁坏策略,一个已毁坏类的名字是由名字中字符的整数数量,后面跟原始名字组成的。比如,类Foo被编码成3Foo。方法被编码成原始方法名,后面加上__,加上已毁坏的类名,再加上每个参数的一个字母。比如,Foo::bar(int,long)被编码为bar__3Fooil。毁坏全局变量和模板名字的策略是相似的。
//C语言中处理方式
在C语言中,对全局符号的符号解析很棘手,因为相同的符号会被多个目标文件定义。在这种情况中,链接器必须要么标志一个错误,要么以某种方法选出一个定义并抛弃其他定义。
在链接时,编译器输出每个全局符号给汇编器,或者是强,或者是弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表中。函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。
根据强弱符号的定义,Unix链接器使用下面的规则来处理多处定义的符号;
规则1:不允许有多个强符号。
规则2:如果有一个强符号和多个弱符号,那么选择强符号。
规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个。
//对C++和Java中链接器符号的毁坏
C++和Java中都允许重载方法,这些方法在源代码中有相同的名字,且有着不同的参数列表。那么链接器是如何区别这些不同的重载函数之间的差异呢?C++和Java中能使用重载函数,是因为编译器将每个唯一的方法和参数列表组合编码成一个对链接器来说唯一的名字。这种编码过程叫做毁坏,而相反的过程叫做恢复。
幸运的是,C++和Java使用兼容的毁坏策略,一个已毁坏类的名字是由名字中字符的整数数量,后面跟原始名字组成的。比如,类Foo被编码成3Foo。方法被编码成原始方法名,后面加上__,加上已毁坏的类名,再加上每个参数的一个字母。比如,Foo::bar(int,long)被编码为bar__3Fooil。毁坏全局变量和模板名字的策略是相似的。
相关文章推荐
- 链接器如何解析多处定义的全局符号
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
- C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用
- java与C++之间进行SOCKET通讯要点简要解析
- 【VS-C++】WinSocket开发时提示无法解析的外部符号
- 有关C++模板(template)的编译错误“error LNK2019: 无法解析的外部符号”的分析
- c++模板分离式编译时无法解析外部符号
- C++模板类中声明友元函数重载输入和输出运算符时,提示无法解析的外部符号解决方案
- java与C++之间进行SOCKET通讯要点简要解析
- C++出现无法解析的外部符号的几种情况
- 2015年阿里巴巴实习生招聘笔试题详细解析(研发大类:Java研发/C++研发)
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
- C++的error LNK2019: 无法解析的外部符号编译错误
- C++ virtual 与 inline (无法解析的外部符号, 未知的#endif )
- C++:无法解析的外部符号问题 与 头文件包含注意要点
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号
- public,private,protected访问权限在Java,C++中的解析
- C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用
- java jsoup 解析字符串默认加了“/n”符号的处理
- C项目如何转C++项目——error LNK2019: 无法解析的外部符号 "unsigned int __cdecl