课本学习笔记5:第七章 20135115臧文君
第七章 链接
注:作者:臧文君,原创作品转载请注明出处。
一、概述
1、链接(linking):是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载或被拷贝到存储器并执行。
2、链接可以执行于编译时、加载时和运行时。
3、链接器(linker):分离编译。
链接通常是由链接器执行。
二、编译器驱动程序
1、大多数编译系统提供编译驱动程序(compiler driver),它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
例:ASCII码源文件-->可执行目标文件
三、静态链接
1、静态链接器(static linker):ld,以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
2、构造可执行文件,链接器必须完成两个主要任务:
四、目标文件
1、三种形式:
2、编译器和汇编器生成可重定位目标文件(包括共享目标文件)。
3、链接器生成可执行目标文件。
4、目标文件格式:ELF可执行和可链接格式。
五、可重定位目标文件
1、ELF头以一个16字节的序列开始,描述了生成该文件的系统的字的大小和字节顺序。
2、ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。
3、一个典型的ELF可重定位目标文件包含下面几个节:
.text:已编译程序的机器代码。
.rodata:只读数据。
.data:已初始化的全局C变量。
.bss:未初始化的全局C变量。
.symtab:一个符号表。
.rel.text:一个.text节中位置的列表。
.rel.data:被模块引用或定义的任何全局变量的重定位信息。
.debug:一个调试符号表。
.line:原始C源程序中的行号和.text节中机器指令之间的映射。
.strtab:一个字符串表。
六、符号和符号表
1、每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。
2、三种不同的符号:
.symtab中的符号表不包含对应于本地非静态程序变量的任何符号。
3、定义为带有C static属性的本地过程变量是不在栈中管理的。相反,编译器在.data和.bss中为每个定义分配空间,并在符号表中创建一个有唯一名字的本地链接器符号。
4、符号表是由汇编器构造的,使用编译器输出到汇编语言.s文件中的符号。
.symtab节中包含ELF符号表。
每个符号都和目标文件的某个节相关联,由section字段表示。有三个特殊的伪节:ABS,UNDEF,COMMON。
七、符号解析
1、函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号。
2、所以的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,它可以用做链接器的输入。
3、在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。
4、-static参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,它可以加载到存储器并运行,在加载时无需更进一步的链接。
八、重定位
1、链接器完成符号解析后,就可以开始重定位了。
重定位由两步组成:
2、汇编器遇到对最终位置未知的目标引用,就会生成一个重定位条目。
代码的重定位条目放在.rel.text中,已初始化数据的重定位条目放在.rel.data中。
3、ELF定义了11中不同的重定位类型,最基本的两种是:R_386_PC32和R_386_32。
4、重定位符号引用:重定位PC相对引用和重定位绝对引用。
九、可执行目标文件
1、典型的ELF可执行文件中的各类信息:
十、加载可执行目标文件
1、任何Unix程序都可以通过调用execve函数来调用加载器,加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令或入口点(entry point)来运行该程序。
2、将程序拷贝到存储器并运行的过程叫做加载。
3、在32位Linux系统中,代码段总是从地址0x08048000处开始。
十一、动态链接共享库
1、共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器的程序来执行的。
2、共享库也称为共享目标,通常用.so后缀来表示。
3、共享库是以两种不同的方式来“共享”的。
十二、从应用程序中加载和链接共享库
1、dlopen函数加载和链接共享库filename。
2、dlsym函数的输入是一个指向前面已经打开共享库的句柄和一个符号名字。
3、dlclose函数卸载共享库。
4、dlerror函数返回调用时发生的最近的错误。
十三、与位置无关的代码(PIC)
1、多个进程是如何共享程序的一个拷贝?
一种是给每个共享库分配一个事先预备的专用的地址空间片,然后要求加载器总是在这个地址加载共享库;另一种是编译库代码,使得不需要链接器修改库代码就可以在任何地址加载和执行这些代码。
2、PIC:位置无关的代码。
十四、处理目标文件的工具
转载于:https://www.cnblogs.com/CatherineZang/p/5366266.html
课本学习笔记5:第七章 20135115臧文君相关推荐
- PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》
系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...
- 20135115臧文君---实验2
北京电子科技学院(BESTI) 实 验 报 告 课程:Java 班级:1351班 姓名:臧文君 学号:20135115 成绩: 指导 ...
- 20135115臧文君---实验3
北京电子科技学院(BESTI) 实 验 报 告 课程:Java 班级:1351班 姓名:臧文君 学号:20135115 成绩: 指导 ...
- 作业4:扒开系统调用的三层皮(上) 20135115臧文君
扒开系统调用的三层皮(上) 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000 ...
- 《自然语言处理(哈工大 关毅 64集视频)》学习笔记:第七章 句法分析技术
视频列表: 43 句法分析技术(一) 44 句法分析技术(二) 45 句法分析技术(三) 46 句法分析技术(四) 47 句法分析技术(五) 43 句法分析技术(一) 第七章 句法分析技术 什么是句法 ...
- 【OpenCV 学习笔记】第七章: 图像平滑处理
第七章: 图像平滑处理 1.什么是图像平滑处理 图像平滑处理就是,将图像中与 周围像素点的像素值差异较大的像素点 调整成 和周围像素点像素值 相近的值. 例如: 2.为什么要进行平滑处理? 因为图像在 ...
- CS231n 计算机视觉(学习笔记)第七章(0809)
第七章 7.1 Fancier optimization SGD存在问题: 在不同方向上抖动 局部极小值/鞍点 随机梯度,时间成本 Nesterov优化: 在SGD中加入一个动量(一个速度) 将梯度加 ...
- 【EasyRL学习笔记】第七章 深度Q网络进阶技巧(Double-DQN、Dueling-DQN、Noisy-DQN、Distributional-DQN、Rainbow-DQN)
文章目录 一.双深度Q网络(DDQN) 二.竞争深度Q网络(Dueling DQN) 三.优先级经验回放 四.在蒙特卡洛方法和时序差分方法中取得平衡 五.噪声深度Q网络(Noisy DQN) 六.分布 ...
- 深度学习Bible学习笔记:第七章 深度学习中的正则化
一.正则化介绍 问题:为什么要正则化? NFL(没有免费的午餐)定理: 没有一种ML算法总是比别的好 好算法和坏算法的期望值相同,甚至最优算法跟随机猜测一样 前提:所有问题等概率出现且同等重要 实际并 ...
最新文章
- 最全面的homogeneous单应性坐标的定义,以及不同投影,仿射,相似,刚体变换矩阵的关系和自由度分析
- sql 怎样 得到 的客户端的ip地址_怎样用卷发棒?正确用法大揭密-装修攻略
- 实易智能DNS单台设备QPS高达28万
- 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles
- 大学课程重新学习-操作系统
- dyaddown matlab,matlab 采样函数
- dz自动开起html,discuz论坛开启markdown 允许html代码嵌入js
- 读《构建之法》1-5章
- 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)
- 自学python在家怎么上班_【经验分享】转行如何自学Python并且找到工作,分享自己心得...
- 安卓学习笔记33:实现逐帧动画
- JavaEE 13个核心技术规范
- python可以给你干什么-你最想用python做什么?python到底能用来做什么?
- alexa全攻略(转)
- 基于国产处理器架构的高能物理数据处理系统
- LeetCode 01:有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
- Paper Notes: Cross-Domain Image Translation Based on GAN
- 秃顶程序员跑马拉松历程
- 单点登录SSO(single sign on)模式(单点登录+权限认证)
- JSF是什么?JSF的优点
热门文章
- 终于知道移动比联通牛的原因了(绝对真实绝对有趣)不看后悔
- lovely desktop
- Appium自动化测试-iOS真机运行
- Visual Studio 2019更新到16.2.1
- XamarinAndroid组件教程RecylerView自定义适配器动画
- Xamarin XAML语言教程使用方法设置进度条进度
- Xamarin Android SDK无法更新的解决办法
- python多线程同步与互斥_Python之多线程:线程互斥与线程同步
- c++ swap函数头文件_C++函数模板(泛型编程)
- 马斯克遭“天劫”:40颗星链卫星葬身地磁风暴,数千万美元打了水漂