静态链接之符号解析(待完善)
2019-10-20 22:47
906 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zycdeCSDN/article/details/102655222
符号解析
符号解析的目的就是将各个模块(模块之中与模块之间)引用与定义联系起来
首先,什么是符号?符号包括
函数(static和非static) |
---|
全局变量 |
外部变量 |
静态局部变量 |
static属性
先简单说明一下static属性,对于全局变量和函数来说,使用static是将它们的“可见”范围限制在了本模块,即它们可以被合法引用的地方仅仅限与定义它们的这个模块(文件);
而对于函数体内部的过程变量来说,使用static修饰是延长了它的“生存周期”,即使在退出循环也不会被销毁。
具体到存放方式就是:符号都是存放在堆里面,而不是和局部变量一样放在栈里面
符号解析
在整个c语言程序之中,既有符号的定义又有符号的引用(使用)。那么,在链接过程之中,真正链接之前需要做的一件事就是将将这些引用与定义关联起来
进一步,试想如果C语言源程序中如果同一个符号名被定义了多次,链接又该如何进行呢?
首先,如果是局部符号(带static属性),由于作用范围限制在同一模块之中,所以它的引用解析是很是清晰的,只需要在同一模块之中不被重复定义即可。
麻烦的是全局符号(非static的全局变量和函数)的解析,如果发生同名的现象链接器又会做出什么样子的反应呢?
首先说明一下强弱符号,强弱符号的概念是针对全局符号的概念:
强符号:函数名、已初始化的全局变量
弱符号:未初始化的全局符号
由此在强弱符号概念的基础之上,链接器在链接时对于同名全局符号有以下规则:
- 链接器不允许多个同名的强符号
- 当强符号和弱符号同名时,选择强符号作符号解析
- 当弱符号之间同名时,随机选择其中一个作符号解析
相关文章推荐
- 非MFC工程,采用静态链接MFc时,出现无法解析的外部符号CoInitialize
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
- 【静态链接】第2章---------------------静态链接过程(符号解析与重定位)
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
- 静态库的符号解析和重定义处理策略
- 解决链接错误:error LNK2001: 无法解析的外部符号 __iob
- 忆龙2009:链接glaux.lib出现未解析的符号__ftol2错误
- 用nmake编译链接程序报错error LNK2019: 无法解析的外部符号_WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- 链接时出现无法解析的外部符号排错
- windows编程链接时遇到error LNK2001 无法解析的外部符号_imp_timeGetTime@0
- 解决链接错误:error LNK2001: 无法解析的外部符号 __iob
- 关于链接过程中出现的“找到一个或多个多重定义的符号”和“无法解析的外部符号”错误的探究
- 项目添加UNICODE支持时,出现链接错误error LNK2019: 无法解析的外部符号 _WinMain
- 使用NetCDF库时提示无法链接错误"error LNK2001: 无法解析的外部符号 nc_create"
- c++ 链接mysql:error LNK2019: 无法解析的外部符号
- 关于vs2010 C++编译链接总是出现“LNK:2019 无法解析的外部符号”的问题
- 【语言-C++】Excel “SYLK (符号链接) *.slk”或剪切板CF_SYLK格式解析
- VS2010 链接错误——无法解析的外部符号ConvertStringToBST
- 在visual studio2005中设置包含链接库lib文件(无法解析的外部符号 __imp__WSAStartup@8)
- 解决MFC COM组件开发链接错误error LNK2001: 无法解析的外部符号 _CStdStubBuffer2_Release@4