《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 ...
随机推荐
- js 四舍五入保留二位小数
1. 最笨的办法....... [我就怎么干的.........] function get() { var s = 22.127456 + ""; var str = s.sub ...
- BZOJ 1013 & 高斯消元
题意: 告诉你一个K维球体球面上的K+1个点问球心坐标. sol: 乍一看还以为是K维的二分答案然后判断距离...真是傻逼了...你看乱七八糟的题目做多了然后就会忘记最有用的基本计算... 我们可以看 ...
- hdu 1312 Red and Black
Problem Description There is a rectangular room, covered with square tiles. Each tile is colored eit ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- SDL 五子棋游戏
http://www.jb51.net/article/79271.htm 1.定义窗口大小,棋盘大小 SDL_GetWindowSize()读取窗口大小, 由于棋盘是15*15格局,上下留白一行,在 ...
- osg实例介绍
osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...
- Nodejs中cluster模块的多进程共享数据问题
Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...
- Jquery的优势
(1)轻量级.jQuery非常轻巧,采用Dean Edwards的Packer(http://dean.edwards.name/packer/)压缩后,只有不到30KB的大小,如果服务器端启用gzi ...
- 打造移动终端的 WebApp(一):搭建一个舞台
最近随着 Apple iOS 和 Android 平台的盛行,一个新的名词 WebApp 也逐渐火了起来,这里我也趁着热潮做一个关于 WebApp 系列的学习笔记,分享平时的一些研究以及项目中的经验, ...
- artdialog4.1.7 中父页面给子页面传值
artdialog4.1.7中父页面给子页面传值时看了一些网友的解决方法: 在父页面声明全局变量 var returnValue=“ ”,子页面用art.dialog.opener.returnVal ...