《深入理解计算机系统》第七章学习笔记
《深入理解计算机系统》第七章学习笔记
20135109 高艺桐
一、关于链接
1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程。
这个文件可被加载或拷贝到存储器并执行。
2.连接可以执行于编译时,也就是在源代码被翻译成机器代码。
也可以执行于加载时,也就是程序被加载器加载到存储器并执行时
执行于运行时,有应用程序来执行。
3.连接是由链接器的程序自动执行的。
4.连接使分离编译成为可能。
1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
(1)C预处理器:源程序main.c->ASCII码中间文件main.i
(2)C编译器:main.i->ASCII码汇编语言文件main.s
(3)C汇编器:main.s->可重定位目标文件
2.运行链接器程序ld,将各种.o文件以及必要的系统目标文件组合起来,创建可执行文件
3.运行可执行文件:./可执行文件名字
4.外壳调用操作系统中加载器函数,拷贝可执行文件中的代码和数据到存储器,将控制转移到这个程序的开头
三、静态链接
1.以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
2.输入的可重定位的目标文件由各种不同的代码和数据节组成。
3.指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量又在另外一个节中。
-符号解析
目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。
-重定位
编译器和汇编器生成从地址0开始的饿代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
四、目标文件
目标文件的三种形式
- 可重定位目标文件(编译器和汇编器可生成)
- 可执行目标文件(链接器可生成)
- 共享目标文件(编译器和汇编器可生成)
五、可重定位目标文件
- .text:已编译程序的机器代码。
- .rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。
- .data:已初始化的全局C变量。
- .bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。
- .symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。
- .rel.text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件结合时,需要修改这些位置。
- .rel.data:被模块引用或定义的任何全局变量的重定位信息。
- .debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。只有以-g选项调用编译驱动程序时才会得到这张表。
- .line:原始C源程序中的行号和.text节中机器指令之间的映射。
- .strtab:一个字符串表,其内容包括:.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。
六、符号和符号表
每个可重定位目标模块m都有一个符号表,包含m所定义和引用的符号的信息。
在链接器的上下文中,三种不同的符号:
1.有m定义并能被其他模块引用的全局符号。全局链接器对应于非静态的C函数以及被定义为Cstatic 属性的全局变量。
2.有其他模块定义并被模块m以引用的全局符号——外部符号,对应于定义在其他模块中的C函数和变量
3.只被模块m定义和引用的本地符号。
- 规则1:不允许有多个强符号。
- 规则2:如果有一个强符号和多个弱符号,那么选择强符号。
- 规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个。
在符号解析的阶段,链接器从左到右按照它们在编译器驱动程序命令行上出现的相同顺序来扫描可重定位目标文件和存档文件。在这次扫描中,链接器维持一个可重定位目标文件的集合E(这个集合中的文件会被合并起来形成可执行文件),一个未解析的符号(即引用了但是尚未定义的符号)集合U,以及一个在前面输入文件中已定义的符号集合D。初始时,E、U和D都是空的。
八、重定位
重定位有两步组成:1.重定位节和符号定义。在这一步中,链接器将所有相同类型的节合并为同一类型的新的聚合节。然后,链接器将运行时存储器地址赋给新的聚合节,赋给输入模块定义的每个节,以及赋给输入模块定义的每个符号。当这一步完成时,程序中的每个指令和全局变量都有唯一的运行时存储器地址了。2.重定位节中的符号引用。在这一步中,链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址。为了执行这一步,链接器依赖于称为重定位条目的可重定位目标模块中的数据结构。
九、可执行目标文件
十、加载可执行目标文件
加载器将可执行目标文件中的执行代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令或入口点来运行该程序。这个将程序拷贝到存储器并运行的过程叫做加载。
- 在32位Linux系统中,代码段总是从地址0x08048000处开始。
- 数据段是在接下来的下一个4KB对齐的地址处。
- 运行时堆在读/写段之后接下来的第一个4KB对齐的地址处,并通过调用malloc库往上增长。
- 有一个段是为共享库保留的。
- 用户栈总是最大的合法用户地址开始,向下增长的(向低存储器地址方向增长)。从栈的上部开始的段是为操作系统驻留存储器的部分(也就是内核)的代码和数据保留的。
十一、动态链接共享库
1、静态库的缺点:
- 静态库在更新时,使用该库的程序需要与更新的库进行重新链接。
- 由于使用静态库的程序在链接时都会拷贝静态库里被应用程序引用的目标模块,像printf和scanf这样的函数的代码在运行时都会被复制到每个运行进程的文本段中,这造成了冗余,浪费了稀缺的存储器资源。
2、共享库
- 共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器的程序来执行的。
- 共享库也称为共享目标,在Unix系统中通常用.so后缀来表示。微软的操作系统大量地利用了共享库,它们称为DLL(动态链接库)。
- 共享库是以两种不同的方式来“共享”的(在Windows中分别称为“隐式链接”和“显示链接”)。
十二、处理目标文件的工具
转载于:https://www.cnblogs.com/gyt0520/p/5374569.html
《深入理解计算机系统》第七章学习笔记相关推荐
- 深入理解计算机系统-第七章(链接)笔记
深入理解计算机系统-第七章(链接)笔记 背景 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程 这个文件可被加载(拷贝)到存储器中并执行: 链接可以执行于编译时,也就是源代码翻译成机器码 ...
- 描述性物理海洋学--第七章学习笔记
第七章学习笔记--海洋环流的动力过程 不稳定理论 判别方法: 大尺度不稳定 中尺度不稳定 控制方程 地流动力学参数 近似简化 正斜压海洋 基本洋流 地转流 风生Ekman 环流 上升流 朗缪尔环流 惯 ...
- java第七章学习笔记:访问控制---java世界的卫兵
[因为每一章都篇幅比较长(10多页,难免有的地方会写错字,如发现请指正,本人不胜感激)] [今天看到我居然有一名粉丝,内心还是有点小激动的,之间我是一枚不是很喜欢技术的妹纸,但是从现在开始,我从被动学 ...
- 鸟哥Linux私房菜_基础篇(第二版)_第七章学习笔记
第七章 Linux文件和目录管理 绝对路径:以"/"开始 相对路径:以非"/"开始 其中,"."代表当前目录,".."代 ...
- Computer Systems A Programmer's Perspective(深入理解计算机系统)第一章读书笔记
第一章 计算机系统漫游 1.1信息就是位+上下文 源程序实际上就是一个由0和1组成的位(又称比特位)序列,这些位被组织成8个一组,称为字节.每个字节都表示程序中某个文本字符. 系统中的所有信息都 ...
- Python基础教程第七章学习笔记——更加抽象
7 更加抽象-创建自己的对象 前面讲了: Python主要的内建对象类型(数字.字符串.列表.元组和字典) 内建函数和标准库的用法 自定义函数的方式 本章主讲: 创建自己的对象(尤其是类型或者被称为类 ...
- java从入门到精通第8章_《Java从入门到精通》第七章学习笔记
第7章 类和对象 一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存 ...
- dx12 龙书第七章学习笔记 -- 利用Direct3D绘制几何体(续)
1.帧资源 之前,我们在处理CPU和GPU的同步问题时,采取以下方法:在每帧绘制的结尾调用D3DApp::FlushCommandQueue函数,以确保GPU在每一帧都能正确完成所有命令的执行 这样做 ...
- 《社会心理学》第七章学习笔记
说服 说服本身并没有好坏之分,而是传递信息的目的及信息的内容决定了我们的价值观判断. 感觉这章内容对如何说服别人有强大的指导意义. 说服的途径 中心路径 人们积极主动,能全面系统地思考问题时,就可能接 ...
- 《深入理解计算机系统》第七章读书笔记
<深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...
最新文章
- hadoop问题小结
- 汇编语言--转移指令
- GNU make manual 翻译(六十一)
- HDU-3280 Equal Sum Partitions
- 445端口关闭后目录文件共享怎么办
- 两个数组合成一个json对象_两个jsonarray合并
- automake linux,Linux下automake软件编译与发布快速入门
- mysqlfor循环中出错继续_运维大佬教你“打僵尸”——处理Linux系统中大量的僵尸进程(2)...
- .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)
- 吴恩达机器学习课程资源(笔记、中英文字幕视频、课后作业,提供百度云镜像!)
- 修改XMAPP中Apache的默认访问的主页
- 苹果手机上网很慢_手机4G信号满格,上网速度却很慢?原来都是它们在“搞鬼”...
- aspose 插入图片的方法
- 数据结构资源视频地址
- APC PowerChute Business Edition 安装中的vmware问题
- linux 虚拟机
- python使用ffmpeg去掉视频片头和片尾
- 第十二章:项目采购管理 - (12.0 什么是项目采购管理)
- python 的取模问题
- 转换 JSON API 用 Chopper 和 JsonSerializable
热门文章
- Linux系统时钟同步
- 新手购买基金的买入策略
- 30个Eclipse键盘快捷键大全,让你工作效率翻倍
- 微信朋友圈会在服务器上保留多久,微信朋友圈有没有草稿?可以存多久?
- 转:谦逊不是罕见的美德,而是人人可习得的能力
- 微信开放平台申请方法与用途
- RuntimeError: latex was not able to process the following string: b‘lp‘
- 分布式任务调度平台201902
- 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第5-6章
- JPG如何免费压缩大小并且保证清晰度