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
- C C++ Java中链接器对全局符号的解析
- 链接器如何解析多处定义的全局符号
- 链接器对符号的管理和解析
- c/c++中#和##链接符号的用法
- [C语言] 从C++中链接时的C符号的处理
- 如何解决VS2010 MySql Connect C 链接mysql:error LNK2019: 无法解析外部符号的问题
- C中“##”符号的用法
- C语言中有符号数和无符号数类型转换的用法深度解析
- C++, Java和C#的编译、链接过程解析
- C++, Java和C#的编译、链接过程解析
- 对无符号类型的建议(C/C++)
- c语言中的符号解析
- C++——错误error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- C语言中符号常量的用法
- C语言中符号的优先级-摘录
- c语言中 符号的优先级
- C/C++中#符号的使用
- C/C++中##符号的使用
- 如何才能成为真正的程序员
- 总线设备驱动模型
- html校验
- Silverlight中利用EF处理多对多关系的增删改查的解决办法
- NSDate的计算问题,日期计算,时区问题,NSTimer
- C C++ Java中链接器对全局符号的解析
- linux下安装gcc以及红帽注册RHN
- JAVA排序list
- OutOfMemoryError
- Spring Security 3 基于角色访问控制过程详解 .
- 谈大集中系统的性能优化策略
- FreeType 2 Tutorial - managing glyphs
- linux平台添加usb 3g的流程 (usb 接口中兴AC580)
- js 金额格式化,来回转换