C C++ Java中链接器对全局符号的解析

来源:互联网 发布:python 创建日志文件 编辑:程序博客网 时间:2024/05/18 02:26

链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。

//C语言中处理方式

在C语言中,对全局符号的符号解析很棘手,因为相同的符号会被多个目标文件定义。在这种情况中,链接器必须要么标志一个错误,要么以某种方法选出一个定义并抛弃其他定义。

在链接时,编译器输出每个全局符号给汇编器,或者是强,或者是弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表中。函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。

根据强弱符号的定义,Unix链接器使用下面的规则来处理多处定义的符号;
规则1:不允许有多个强符号。
规则2:如果有一个强符号和多个弱符号,那么选择强符号。
规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个。

//对C++和Java中链接器符号的毁坏

C++和Java中都允许重载方法,这些方法在源代码中有相同的名字,且有着不同的参数列表。那么链接器是如何区别这些不同的重载函数之间的差异呢?C++和Java中能使用重载函数,是因为编译器将每个唯一的方法和参数列表组合编码成一个对链接器来说唯一的名字。这种编码过程叫做毁坏,而相反的过程叫做恢复。
幸运的是,C++和Java使用兼容的毁坏策略,一个已毁坏的名字是由名字中字符的整数数量,后面跟原始名字组成的。比如,类Foo被编码成3Foo。方法被编码成原始方法名,后面加上__,加上已毁坏的类名,再加上每个参数的一个字母。比如,Foo::bar(int,long)被编码为bar__3Fooil。毁坏全局变量和模板名字的策略是相似的。

0 0
原创粉丝点击