CSAPP-链接
主要任务:
1.符号解析
在声明变量和函数之后,所有的符号声明都被保存到符号表。
而符号解析阶段会给每个符号一个定义。
2.重定位:
把每个符号的定义与一个内存位置关联起来,然后修改所有对这些符号的引用,让他们
指向内存位置。
符号解析:
会将符号引用和可重定位目标文件的符号表中的确定符号定义关联起来。
对于相同模块的局部符号(static属性),可以简单解决。
对于全局符号的引用,如果不是在当前模块定义的,会假设在其它模块中,然后通过链接器去查找,找不到则报错。
重载函数:
对于重载函数,会将每个函数和参数列表组合成一个对链接器来说唯一的名字。
多重定义的全局符号:
函数和已初始化的全局符号是强符号,未初始化的全局变量是弱符号。
如果有一个强和多个弱,那么选择强符号;若是多个弱符号,则随机选一个;不允许多个强符号。
/*foo1.c*/
int x = 15151;
int main
{}
/*foo2.c*/
int x = 15151;
void f(){}
如上面的代码会报错,x被多次定义。
/*foo1.c*/
int x = 15151;
int y = 111;
void f();
int main
{}
/*foo2.c*/
double x ;
void f()
{
x = 0.0;
}
double是8字节,int是4字节。因为强弱符号的关系,x=0.0中的x是foo的,于是双精度浮点会覆盖掉x,y的位置。
静态库:
相关的函数会被编译成独立的目标模块,然后封装成一个独立的静态库文件。
在链接的时候,连接器只会复制被程序引用的目标模块,以减小可执行文件的大小。
--
如何解析静态库:
链接器在根据命令行中输入的可重定位目标文件和静态库的顺序从左到右的扫描这些文件。然后维护三个集合:
E:会被合并的文件
U:未解析的符号集合
D:已经定义的文件集合
根据命令行的输入,判断f是目标文件还是存档文件
- 目标文件:链接器会把f加入E,然后修改U,D。
- 存档文件:在U中进行匹配,如果匹配到了,将存档文件成员 添加到E,然后修改UD。
--
如果不使用静态库:
1.将所有标程放到一个目标模块中
但是这样会导致每个可执行文件都包含所有的函数副本,浪费空间。而且任何函数被修改了,都要
重新编译库整个源文件。
2.将所有标程放到一个目录下
可以解决空间浪费的问题,但是这样需要我们显示地链接合适的目标模块,如果函数过多,容易出现错误,而且
浪费时间。
重定位:
1.重定位会将所有同一类型的合并为聚合节。然后将运行时地址赋予它们

2.修改代码节和数据节中对每个符号的引用,使它们指向正确的地址(相对引用 or 绝对引用重定位 等等)。
共享库:
静态库也有一定缺陷,需要定期维护更新。
几乎每个C都会使用IO,那么printf和scanf会被复制到每个运行进程的文本。那么在一个运行了上百个进程的系统上,无疑是一种浪费。
共享库不是像静态库那样将代码和数据嵌入到执行文件中,而是在内存中有一个共享库的.text节的副本,可以被不同的正在运行
的进程共享。
--
在共享库下,创建一个可执行程序:
会先静态执行一些链接,然后在程序加载的时候,动态地完成链接过程。
在加载运行的时候,会主要到.interp节(有动态链接器的路径)。然后加载这个动态链接器
- 重定位共享库的数据文本到某个内存段
- 重定位执行文件中所有对由 共享库定义的符号的引用也可以通过dlopen在应用程序中加载和链接共享库
参考资料:
不周山之读薄CSAPP
《深入理解计算机系统 》
多个进程间共享动态链接库原理
CSAPP-链接的更多相关文章
- 链接器(linker)的作用——CSAPP第7章读书笔记
首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...
- CSAPP CH7链接的应用:静动态库制作与神奇的库打桩机制
目录 创建静态库 创建动态库 库打桩机制 编译时打桩: 链接时打桩 运行时打桩 运行时打桩的printf与malloc循环调用debug 使用LD_PRELOAD对任意可执行程序调用运行时打桩 总结 ...
- 【CSAPP笔记】13. 链接
下面就要进入本书的第二部分--在系统上运行程序.书的第一部分,主要是研究单个应用程序,关注的是数据类型.机器指令.程序性能.存储器系统等话题.在书的第二部分,我们继续对计算机系统的探索.现代操作系统与 ...
- CSAPP阅读笔记-链接-第七章-P464-P500
链接概述 经预处理器->编译器->汇编器处理后,源文件可被转化为一组可重定位目标文件,链接器将它们组合起来形成可执行文件. 每个可重定位目标文件由不同的“代码节”和“数据节”组成,每一个节 ...
- 菜鸟在C语言编译,链接时可能遇到的两个问题
最近在看 CSAPP (Computer Systems A Programmers Perspective 2nd) 的第七章 链接.学到了点东西,跟大家分享.下文中的例子都是出自CSAPP第七章. ...
- 在Ubuntu下使用 csapp.h 和 csapp.c
它山之石可以攻玉. 对于<深入理解计算机系统>这本神人写就的神书, 我等凡人就不评论什么啦. 这本书的 第二,三 部分, 真的真的对我理解操作系统有很大的帮助. (当然, 如果你不看第一部 ...
- CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
1 平台 转http://blog.csdn.net/misskissc/article/details/43063419 1.1 硬件 Table 1. 硬件(lscpu) Architecture ...
- [CSAPP笔记][第九章虚拟存储器][吐血1500行]
9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
随机推荐
- 项目Beta冲刺第一天
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:企业自查风险模块仍旧存在部分问题,没有什么大的困难,主要是需求问题,企业人员什么条件之下可以添加风险点,第三方评估人员是否可以上报风险, ...
- Ubuntu下安装gsoap
昨天在ubuntu下进行安装gSOAP,费了很多时间,没成功,今天又来找了大量教程资料,终于一次成功,这里写下自己的安装步骤和方法,供大家参考. 首先下载gsoap,我下载的是gsoap-2.8.1. ...
- django的模板(二)
模板(二) 实验简介 本节继续介绍模板的常用标签,for.if.ifequal和注释标签. 一.基本的模板标签和过滤器 1. 标签 if/else {% if %} 标签检查(evaluate)一个变 ...
- IOS UITextView自适应高度
LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ...
- Java语言基础组成
写完才发现,这个博客不提供目录这个功能,真是想骂爹了...... 目录 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 1.关键字 描述:刚刚开始学这个的时候,真是傻傻分不清楚,不过没关系 ...
- Struts2之Struts2的下载与安装
Struts2的下载 登陆struts的官网 下载Full Distribution这个选项的struts2的包. 这是Struts2的完整版,里面包括Struts2的实例应用,空实例应用,核心库,源 ...
- Network in Network
 论文要点: 用更有效的非线性函数逼近器(MLP,multilayer perceptron)代替 GLM 以增强局部模型的抽象能力.抽象能力指的模型中特征是对于同一概念的变体的不变形. 使用 gl ...
- Python内置函数(33)——any
英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...
- ibatis的优缺点及可行性分析
1.优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了DAO框架,可以使我 ...
- Mac 中配置Apache
使用的mac版本是10.10.1,mac自带的Apache环境 分为两部分: 1.启动Apache 2.设置虚拟主机 启动Apache 打开终端, >>sudo apachectl -v, ...