《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 ...
随机推荐
- Universal JS module loader
With dependency ;(function (root, factory) { if (typeof define === 'function' && define.amd) ...
- POJ3469 & 最小割(最大流)模板
就是一个求最小割. sol: 数据比较大,n有20000,内部相连的边有20w,这么算算就要存八九十万的边,空间显然降不下来...然而打了dinic并不觉得快很多...最快跑到3800+ms 然后跪一 ...
- Android入门第八篇之GridView(九宫图)
本文来自http://blog.csdn.net/hellogv/ GridView跟ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选!本文就是介绍如何使用GridVi ...
- Motion images compression and restoration based on computer vision
This technique should apply to both normal video (consequtive sequences of pictures of real world) a ...
- Codeforces Round #247 (Div. 2) B - Shower Line
模拟即可 #include <iostream> #include <vector> #include <algorithm> using namespace st ...
- ACM: HDU 2563 统计问题-DFS+打表
HDU 2563 统计问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u HDU 2 ...
- 洛谷 P1414 又是毕业季II Label:None
题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...
- SRM 594 DIV1 250
可能开始宿舍比较乱,思绪静不下来...想了大半个小时,终于确定了应该暴力+DP,然后写了枚举除数,和被除的版本..这样,还敲错了个字母,第一次提交还100多,修改提交还有75.多,最后想到,貌似不打对 ...
- 状压dp题目总结
这块比较薄弱.. 来几道水题: BZOJ1231: [Usaco2008 Nov]mixup2 混乱的奶牛 f[i][j]状态i结尾j的个数 ;i<=tot;i++) ;j<=n;j++) ...
- iOS 让启动页面延迟的方法
<1> 利用多线程的方法:[NSThread sleepForTimeInterval:300];

