普通目标文件的符号解析与重定义处理策略
来源:互联网 发布:阿里云视频服务器 编辑:程序博客网 时间:2024/05/20 03:41
一、什么是普通目标文件
静态链接器ld可以将一组可重定位目标文件链接成一个可执行目标文件。
其中可重定位目标文件有三种,分别是目标文件(.o)、静态链接库(.a)和动态链接库(.so)。
本文所指的普通目标文件特殊“目标文件(.a)”
二、什么是符号
1.符号是指代码中的变量与函数。代码中的关键字不属于符号。
2.符号分为以下4种:
(1)可引出符号
由本模块定义,且能被本模块和其它模块引用的符号
非Static全局函数,非static全局变量都是可引出符号
(2)外部符号
由其它模块定义,但被本模块引用了的符号。
其它模块的可引出符号,如果被本模块使用了,就是本模块的外部符号
外部符号变量由extern修饰
(3)静态符号
由本模块定义,且只能被本模块引用的符号
带static的全局变量和全局函数都是静态符号
(4)局部符号
在函数内部定义的非static变量
3.举例
extern int buf[];static int *bufp0 = &buf[0];int *bufp1;void swap(){ int temp; bufp1 = &buf[1]; temp = *bufp0; *bufp0 = *bufp1; *bufp1 = temp;}
运用上面的内容,对这段代码中的符号分类
符号名符号类型buf外部符号bufp0静态符号bufp1可引出符号swap可引出符号temp局部符号三、符号解析
符号解析是指,把符号的定义和引用联系起来。
不同的符号类型,解析的策略不同。为了方便理解,这里打乱次序,从最简单的说起。
4.局部符号
链接器对局部符号一点都不关心,因为局部符号是在栈里管理的。
3.静态符号
链接器对静态符号的处理比较简单,因为静态符号的定义和引用肯定是在同一个模块中的,只要保证模块中一个符号只有一个定义就好了。
2.外部符号
编译器发现模块中的符号没有定义时,就会把它放到一个符号表中,链接器从其它模块中找出这些符号的定义。
1.可引出符号
可引出符号的处理比较复杂,要从所有模块中搜索这个符号的定义,还要处理重定义的问题。
四、符号重定义的处理策略
外部符号和可引出符号的解析过程中,都有可能遇到符号重定义的问题。当链接器发现符号重定义时会怎么处理吗?它会报错吗?
答案是“不一定”。有些情况下,链接器发现重定义后会提示链接错误,让我们及时地发现问题。可有些情况,链接器会悄悄地选择其中一个定义而忽略其它定义,这样就产生了难以定义的BUG。
1.强弱符号规则
链接器使用强弱符号规则来决定怎么处理符号重定义的问题。
(1)至多有一个强符号存在,若出现多个强符号,链接器就会报错
(2)如果有一个强符号和多个弱符号,那么选择强符号
(3)如果有多个弱符号,会从弱符号中任意选择一个,不报错
由此可见,为了及时地发现重定义引入的问题,尽量把符号都定义成强符号。
2.什么是强符号,什么是弱符号
(2)已经初始化的全局变量弱符号未初始化的全局变量
- 普通目标文件的符号解析与重定义处理策略
- 静态库的符号解析和重定义处理策略
- C++普通成员函数的重定义
- 异常处理策略与重构
- 目标文件中符号表的符号类型
- 文件重定义冲突的分析与解决
- mybatis.xml文件中#与$符号的区别以及数学符号的处理
- LNK2005符号重定义问题
- <climits>头文件定义的符号常量
- <climits>头文件定义的符号常量
- <climits>头文件定义的符号常量
- <climits>头文件定义的符号常量
- #nm 命令 列出目标文件的符号清单
- nm命用于显示二进制目标文件的符号表
- 编译中重定义错误的处理--头文件的写法
- 【静态链接】第2章---------------------目标文件(弱符号与强符号)
- QTCreater编程错误:LNK2019: 无法解析的外部符号 __imp__ShellExecuteW@24,该符号在函数 _main 中被引用 的 错误处理 及 添加外部库与头文件 的方法
- 对于带命名空间定义的XML目标的处理
- cocos2d-x (三) :场景、动作、动画特效
- android UI用ViewPager实现引导页面
- 银行家算法
- js闭包执行结束后的那些事
- onMeasure(),onLayout(),onDraw
- 普通目标文件的符号解析与重定义处理策略
- 在Azure 环境里安装 Sharepoint 2013 系统(一)创建网络、app和DB
- 关于adb连接手机offline的问题解决
- Oracle命令实践(1)
- 算法篇-高精度-阶乘的精确值
- 让动画活过来---Robound
- c++MAP
- Warn : Hadoop No job jar file set.
- 遍历磁盘下的所有目录