您的位置:首页 > 其它

静态链接之符号解析(待完善)

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的全局变量和函数)的解析,如果发生同名的现象链接器又会做出什么样子的反应呢?

首先说明一下强弱符号,强弱符号的概念是针对全局符号的概念:
强符号:函数名、已初始化的全局变量
弱符号:未初始化的全局符号

由此在强弱符号概念的基础之上,链接器在链接时对于同名全局符号有以下规则:

  1. 链接器不允许多个同名的强符号
  2. 当强符号和弱符号同名时,选择强符号作符号解析
  3. 当弱符号之间同名时,随机选择其中一个作符号解析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐