2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接
第七章——链接
0.总结
- 链接编译时可以采用静态链接或动态链接。
- 连接器主要任务:符号解析和重定位。
- 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库。
- 链接器可以生成部分链接的可执行文件
- 动态链接器通过加载共享库和重定位程序中的引用来完成链接任务。
1.编译器驱动程序
- 编译系统提供的调用预处理器、编译器、汇编器和链接器来构造目标文件的程序。
2.静态链接

3.目标文件
三种形式:
1、可重定位目标文件;
2、可执行目标文件;
3、共享目标文件;
4.可重定位目标文件
ELF格式

5.符号和符号表
- 每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。
- 有三种不同的符号:
1、m定义 & 能被其他模块引用的全局符号;
2、其他模块定义 &被模块m引用的全局符号(外部符号);
3、只被模块m定义 & 引用的本地符号;
6.符号解析
- 将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。
规则
1.不允许有多个强符号。
2.如果有一个强符号和多个弱符号,那么选择强符号。
3.如果有多个弱符号,那么从这些弱符号中任意选择一个。
与静态库链接
所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库(Linux下是存档文件,Windows下是lib),只拷贝静态库里被应用程序引用的目标模块。
链接时加上-static参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,它可以加载到存储器并执行,在加载时无需更进一步的链接。

7.重定位
- 重定位条目
- 重定位符号引用
8.可执行目标文件
- C程序开始时是一组ASCII文本文件,已经被转化为一个二进制文件,且这个二进制文件包含加载程序到存储器并运行它所需的所有信息。

9.加载可执行目标文件
- 将程序拷贝到存储器并运行的过程叫做加载。
- 在32位Linux系统中,代码段总是从地址0x08048000处开始。
- 数据段是在接下来的下一个4KB对齐的地址处。运行时堆在读/写段之后接下来的第一个4KB对齐的地址处,并通过调用malloc库往上增长。
- 还有一个段是为共享库保留的。
- 用户栈总是最大的合法用户地址开始,向下增长的(向低存储器地址方向增长)。从栈的上部开始的段是为操作系统驻留存储器的部分(内核)的代码和数据保留的。
10.动态链接共享库
- 共享库是一个目标,在运行时,可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器(dynamic linker)的程序来执行的。
- 通常用.so后缀来表示,称为DLL(动态链接库)。
共享库是以两种不同的方式来“共享”的
1.在任何给定的文件系统中,对于一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个.so文件中的代码和数据。
2.一种共享方式就是隐式链接,基本的思路:当创建可执行文件时,静态执行一些链接,然后在程序加载时,动态完成链接过程。
3.一种共享方式就是“显式链接”,应用程序被加载时,动态链接器加载和链接共享库的情景。应用程序还可能在它运行时要求动态链接器加载和链接任意共享库,而无需在编译时链接那些库到应用中。

11.从应用程序中加载和连接共享库
void *dlopen( const char *file, int mode );//将共享目标文件打开并且映射到内存中,并且返回句柄
void *dlsym( void *restrict handle, const char *restrict name );//回一个指向被请求入口点的指针
char *dlerror();//返回 NULL 或者一个指向描述最近错误的 ASCII 字符串的指针
char *dlclose( void *handle );//关闭句柄并且取消共享目标文件的映射
12.处理目标文件的工具
AR:创建静态库,插入、删除、列出和提取成员。
STRINGS:列出一个目标文件中所有可打印的字符串。
STRIP:从目标文件中删除符号的信息。
NM:列出一个目标文件的符号表中定义的符号。
SIZE:目标文件中节的名字和大小。
READELF:显示一个目标文件的完整结构,包括ELF头中的编码的所有信息。包含SIZE和NM的功能。
OBJDUMP:所有二进制工具之母,能够显示一个目标文件中所有的信息。它最大的作用是反汇编.text节中的二进制指令。
LDD:列出一个可执行文件在运行时所需要的共享库。
2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接的更多相关文章
- <深入理解计算机系统>第七章读书笔记
第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号 ...
- 20135202闫佳歆--week 7 深入理解计算机系统第七章--读书笔记
参见上学期的学习笔记: http://www.cnblogs.com/20135202yjx/p/4836058.html
- 2013337朱荟潼 Linux第五章读书笔记——系统调用
摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...
- 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介
一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...
- 2013337朱荟潼 Linux第二章读书笔记——从内核出发
1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...
- 2013337朱荟潼 Linux第十八章读书笔记——调试
第十八章 调试 0.总结 oops 内核的调试配置 用Git进行二分搜索 bug总会有,简洁描述发给LKML 1. 准备开始 在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2. 内核中的b ...
- 2013337朱荟潼 Linux第三章读书笔记——进程管理
第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...
- 2013337朱荟潼 Linux第四章读书笔记——进程调度
第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...
- 《深入理解计算机系统》 Chapter 7 读书笔记
<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是 ...
随机推荐
- 团队作业——Alpha冲刺 7/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:将编辑界面与标题栏合并.与同队成员,讨论部分功能合并的问题. 明日任务:编辑界面与另一队员完成的字体设置弹窗合并. 郭剑南 今日任务:使用 ...
- [python]通过uiautomator实现返回当前程序包名
# -*- coding: utf-8 -*- from uiautomator import device as d def getCurrentPackageName(): info = d.in ...
- vue2.0模拟锚点
在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...
- 记一次MyBatis的错误
错误信息:java.lang.StackOverflowError 关于这个错误的深度解析,大家可以参考这篇博文,比较详细:https://blog.csdn.net/zc375039901/arti ...
- DataGridView如何绑定DataRow对象集合
DataGridView对象是我们在进行Winform程序开发中经常使用的呈现数据的控件,而数据则是通过DataSource这个Property来设置的.根据MSDN的说明,DataGridView对 ...
- 本地模拟服务器CDN(静态HTML,CSS,JS)开发
本地模拟服务器CDN(静态HTML,CSS,JS)开发 所谓本地开发环境就是和线上cdn(a.longencdn.cn)一样的目录结构和功能,提供了一个本地镜像,开发者直接在本地镜像的对应目录中作开发 ...
- 数据库基本的的sql语句
数据库数据类型: 1.定义一个学生课程模式: create schma<模式名>authorization <用户名> create schema authorization ...
- 【转】常见的Web实时消息交互方式和SignalR
https://www.cnblogs.com/Wddpct/p/5650015.html 前言 1. Web消息交互技术1.1 常见技术1.2 WebSocket介绍1.3 WebSocket示例 ...
- Theano3.6-练习之消噪自动编码器
来自:http://deeplearning.net/tutorial/dA.html#daa Denoising Autoencoders (dA) note:该部分假设读者已经看过(Theano3 ...
- 《Head First 设计模式》[01] 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...