读书笔记(chapter7)
第七章 链接
链接是将各种代码和数据部分收集起来并且组合成为一个单一文件的过程。1.这个文件可被加载到存储器并执行;2.也可以执行于加载时,也就是在程序被加载器加载到存储器并执行;3.甚至可以执行于运行时,由应用程序来执行;在早期的计算机系统,链接是手动执行的。在现代系统中,链接是由叫做链接器的程序自动执行的
7.1编译器驱动程序
大部分编译器驱动程序,它代表用户在需要时调用语言预处理器,编译器,汇编器,和链接器.
1.驱动程序首先运行C预处理器cpp,将C源程序main.c翻译成一个ASCII码的中间文件main.i;
2.驱动程序运行C编译器cc1,将main.i翻译成ASCII汇编语言文件main.s;
3.驱动程序运行汇编器as,将main.s翻译成一个可重定位目标文件main.o;
4.运行链接器1d,将.o文件和一些必要的系统目标文件组合起来,创建一个可执行目标文件p;
7.2静态链接
输入的可重定位目标文件由各种不同的代码和数据节组成。指令在一个节中,初始化的全局变量在另一个节,未初始化的变量在另一个节;
构造可执行文件,链接器必须完成:
1.符号解析(目的是将每个符号引用刚好和一个符号定义联系起来)
2.重定位(把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得他们指向这个存储器位置)
*目标文件纯粹是字节块的集合
7.3目标文件
目标文件有三种形式:
1.可重定位目标文件
2.可执行目标文件
3.共享目标文件(特殊的可重定位目标文件)
*一个目标模块就是一个字节序列;而一个目标文件就是存放在磁盘文件中的目标模块
7.4可重定位目标文件
使用的是unix可执行和可链接格式ELF目标文件格式
ELF头以一个16字节的序列开始,生成该文件的系统的字的的大小和字节顺序;头部剩下的部分 .....有节头部表,,,,,,
夹在ELF头和节头部表之间的都是节;
.text
.bss(未初始化的数据)
7.5符号和符号表
每个可重定位目标模块m都有一个符号表,包含m所定义和引用的符号的信息,在链接器的上下文中,有三种不同的符号:
1.由m定义并能被其他模块引用的全局符号
2.由其他模块定义并被模块m引用的全局符号
3.只被模块m定义和引用的本地符号
*定义带有C static 属性的本地过程变量是不在栈中管理的;
符号表由汇编器构造。name是字节串表的字节偏移;value是距定义目标的节的起始位置的偏移;size是目标的大小;每个符号都和目标文件的某一个节相关联,section字段表示,该字段也是一个到节头部表的索引:
1.ABS代表不该被重定位的符号;
2.UNDEF代表未定义的符号;
3.COMMON表示还未被分配位置的未初始化的数据目标;
7.6符号解析
链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。编译器还确保静态本地变量,它们也会有本地链接器符号,拥有唯一的名字
1.如何解析多重定义的全局符号
编译器向汇编器输出每个全局符号,或者强或者弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表里,函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号,有三个规则:
规则1、不允许有多个强符号;
规则2、如果有一个强符号和多个弱符号,那么选择强符号;
规则3、如果有多个弱符号,那么随机选择一个;
2.与静态库链接
将所有相关的目标模块打包成一个单独的文件称作静态库,可以用作链接器的输入。当链接器构造一个输出的的可执行文件,只需要拷贝静态库里被应用程序引用的模块。
特点:减少了可执行文件在磁盘和存储器中的大小;
*静态库以一种称为存档的的特殊文件格式存放的磁盘中;存档文件由后缀.a标识
3.如何使用静态库来解析引用
链接器维持一个可重定位的目标文件E,一个未解析的符号U,和一个在前面输入文件中已定义的符号集合D;
链接器会判断F是一个目标文件还是一个存档文件
7.7重定位
1.重定位节和符号定义;重定位节中的符号引用(依赖于重定位条目);
2.ELF中两个基本的重定位类型:R_386_PC32;R_386_32
3.重定义符号引用分为PC相对引用和绝对引用
7.8可执行目标文件
1.ELF包括程序的入口点,也就是当程序运行时的第一条指令的地址
2.ELF可执行文件被设计得很容易加载到存储器,可执行文件的连续的片被映射到连续的存储器段。段头部表描述了这种映射关系
7.9加载可执行的目标文件
7.10动态链接共享库
共享库是一个目标模块, 在运行时,可以加载到任意的存储器地址,并且和一个在存储器中的程序链接起来,这个过程就是动态链接
7.11从应用程序中加载和链接共享库
7.12与位置无关的代码PIC(引用、函数调用)
7.13处理目标文件的工具
读书笔记(chapter7)的更多相关文章
- 读书笔记-Coding faster(英文版)
读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...
- 读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit
读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit Author: Andrew Hunt ,David Thomas with Matt ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
- LOMA280保险原理读书笔记
LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记2
<3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...
随机推荐
- el-table-column v-if条件渲染报错h.$scopedSlots.default is not a function
我们在实际项目中经常会遇到el-table-column条件渲染出现报错的情况 报错内容: h.$scopedSlots.default is not a function 究其原因,是因为表格是el ...
- swift class的虚函数表、扩展、@objc修饰、虚函数的派发方式研究
swift class的虚函数表.扩展.@objc修饰的研究 工具: swiftc -emit-sil BaseClass.swift | xcrun swift-demangle > Clas ...
- CF1045G:AI robots(CDQ分治)
Description 火星上有$n$个机器人排成一行,第$i$个机器人的位置为$x_i$,视野为$r_i$,智商为$q_i$.我们认为第$i$个机器人可以看到的位置是$[x_i−r_i,x_i+ ...
- lamp环境安装
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code lamp环境安装 1.查看mysql是否安装 service mysql status 2.查 ...
- 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础
20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...
- Database hang and Row Cache Lock concurrency troubleshooting
http://www.dadbm.com/database-hang-row-cache-lock-concurrency-troubleshooting/ Issue backgroundThis ...
- Drool实战系列(一)之入门程序
Drools官网地址为:https://www.drools.org/ maven环境 入门程序例子如下: 项目结构截图: 一.导入pom文件 <project xmlns="http ...
- [转]系统架构演变--集中式架构-垂直拆分-分布式服务-SOA(服务治理)-微服务
一.系统架构演变 1.1. 集中式架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键. 存在的 ...
- DIYer最担心的事来了!CPU降价彻底无望
12月27日,IDC发布2019年中国PC市场十大预测.IDC指出,2018年全年中国PC市场预计最终销售为5200万台左右,下滑了3.4%.2019年中国PC市场会处于一种习惯性艰难期,但是市场也不 ...
- 个人向 - vscode插件记录
现在用的编译器的是vscode,本身这个编译器很小,很多功能都没有,需要自己下载一些插件来完善功能,不知不觉下载的插件也有三十多个了,感觉需要记录一下. tips:1. vscode插件的安装位置:’ ...