《Linux内核分析》第七周 读书笔记
《深入理解计算机系统》CHAPTER7阅读梳理
【学习时间:3hours】
【学习内容:链接需要的代码&数据;链接机制;链接生成的目标文件】
一、链接概述
1.链接
- 定义:链接是将各种数据和代码收集起来成并组合成为一个单一文件的过程(这个文件可以被拷贝到存储器并且执行)
- 场合:
- 编译时:即源代码被翻译成机器代码
- 加载时:程序被加载器加载到存储器并执行
- 运行时
- 作用:
- 使得分离编译成为可能(将大型应用程序分解为若干个小模块)
2.铺垫——编译驱动程序以及目标文件、符号表
编译驱动程序代表用户调用语言预处理器、编译器、汇编器和连接器
- 预处理器将.c文件翻译成ASCII码中间文件.i;
- 编译器将.i文件翻译成ASCII码汇编语言文件.s;
- 汇编器将.s文件翻译成可重定位目标文件.o;
- 链接器程序将.o文件以及一些必要的文件组合起来创建一个可执行目标文件;
- 加载器拷贝可执行文件代码和数据到存储器然后将控制转移到程序头
目标文件有三种形式:
- 可重定位目标文件

- 包括如下内容
- ELF头:描述文件系统的字的大小和字节顺序,ELF头的大小,目标文件类型,机器类型等
- 节:.text已编译程序的机器代码,.data&.bss分别是已初始化和未初始化的变量,.symtab一个符号表存放在程序中定义和引用的全局变量信息
- 符号表中三种不同的符号:
- 由本模块定义并被其他模块引用的全局符号(即不带static的全局变量)
- 由其他模块定义并被本模块引用的全局符号(即定义在其他模块中的C函数变量)
- 只被本模块定义和引用的本地符号
- 另外,本地程序非静态变量不在符号表中,它们在运行时在栈中被管理;编译器把初始化为0的变量放在.bss而非.data中
- 符号表中三种不同的符号:
- 节头部表:描述目标文件的节
- 可执行目标文件

- 包括如下内容:
- ELF头部:描述总体格式,包括程序的入口点也就是程序运行的时候要执行的第一条指令
- 段头部表:描述可执行文件连续片和存储器段的映射关系
- 其他
- 共享目标文件(特殊的可重定位目标文件)
3.静态链接
链接器的两个主要任务
- 符号解析:将每个符号引用刚好和一个符号定义联系起来
- 重定位:链接器通过把每个符号定义与一个存储器位置联系起来
4.符号解析
- 对于那些和引用定义在相同模块的本地符号;编译器只允许每个模块中每个本地符号有一个定义
- 对于全局符号的解析
- 当编译器遇到一个不是在当前模块中定义的符号时,它会假设该符号是在某个模块中定义的,生成一个链接器符号表条目然后交给链接器处理
- 如果在链接器的任何模块中都找不到这个被引用的符号,它就输出一条错误信息然后终止
- 对于多重定义的全局符号:
- 函数和已经初始化的全局变量是强符号,未初始化的全局变量是弱符号
- 规则:
- 不允许有多个强符号
- 如果有一个强符号和多个弱符号,那么选择强符号
- 如果有多个弱符号,那么从其中任选一个
5.重定位
重定位由两个步骤组成
- 重定位节和符号定义:链接器将所有相同类型的节合并为同一类型的新的聚合节
- 重定位节中的符号引用:链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时的地址
重定位条目:
无论何时汇编器遇到对最终位置的目标引用,它就会生成一个重定位条目,告诉链接器将目标文件合并成可执行文件的时候如何修改这个引用
6.与静态库连接
- 概述:编译系统提供一种机制,将所有相关的目标模块打包为一个单独的文件,称为静态库,它可以用做链接器的输入
- 优点:
- 相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件
- 链接器只拷贝被引用程序引用的目标模块,这就减少了可执行文件在磁盘和存储器中的大小
- 图示
7.加载可执行文件
- 加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令来运行程序
- 存储器映像
- 每个Unix程序都要加一个运行时存储器映像
《Linux内核分析》第七周 读书笔记的更多相关文章
- linux内核分析 第七周读书笔记
第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载到存储器并执行. 2.链接可以执行于编译时,加载时,运行时. 7.1编译器驱动程序 1.大多数编译系统 ...
- Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序
Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...
- Linux内核分析——第七周学习笔记20135308
第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 ...
- linux内核分析 第六周读书笔记
第三章 进程管理 3.1 进程 进程:处于执行期的程序 线程是在进程活动中的对象:内核调度的对象是线程而不是进程,在Linux系统中,并不区分线程和进程 在现代操作系统中, 进程提供两种虚拟机制:虚拟 ...
- linux内核分析 第八周读书笔记
第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...
- linux内核分析 第五周读书笔记
第18章 调试 内核调试的难度大于用户级 一.准备开始 开始之前需要的是: 一个行为可靠且定义明确的bug 一个隐匿bug的内核版本 相关内核代码的知识和运气 想要成功的调试,取决于能不能将这些bug ...
- LINUX内核分析第七周学习总结:可执行程序的装载
LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- Linux内核分析第四章 读书笔记
Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...
- Linux内核分析 第七周 可执行程序的装载
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...
- LINUX内核分析第七周学习总结
LINUX内核分析第七周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
随机推荐
- angularjs学习资料
API http://www.yiibai.com/angularjs/angularjs_scopes.html 视频 http://v.youku.com/v_show/id_XNjQ3MjA1N ...
- 【Linux程序设计】之进程间的通信
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程间通信 实验目的:熟悉进程通信中信号概念及信号处理:掌握进程间的管道通信编程 ...
- BZOJ4110 : [Wf2015]Evolution in Parallel
首先每个串都必须是$S$的子序列,否则无解. 按长度从小到大依次考虑每个串,如果它两边都不能放,那么无解. 如果能放一边,那么放进去,把待定的全部放入另一边. 如果两边都能放,那么看看能否待定,如果不 ...
- node.js的request模块
request模块让http请求变的更加简单.最简单的一个示例: 1: var request = require('request'); 2: 3: request('http://www.goo ...
- 【BZOJ】1132: [POI2008]Tro
题意 给\(n(1 \le n \le 3000)\)个点,求所有三角形的面积和. 分析 首先枚举一个点,发现把其它点按照关于这个点的极角排序后第\(i\)个点关于前面\(1\)到\(i-1\)的点组 ...
- Android -- 自定义带进度条的按钮
1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
作者:唐老师,华清远见嵌入式学院讲师. 一.Android init进程启动 还是从Linux的启动开始吧.Linux被bootloader加载到了内存之后,开始运行,在初始化完 Linux运行环境之 ...
- 20145330第六周《Java学习笔记》
20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...
- Thymeleaf基本知识
Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...
- Linux下rz命令使用的实例详解
Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,下面将通过几个实例来给大家详细介绍下Linux下rz命令的用法,一起来学习下吧. rz命令可以批量上传文件,当然也可上传单 ...

