程序员的自我修养-链接、封装与库(读书笔记)
程序员的自我修养-链接、封装与库
Hani_97
Stay hungry,stay foolish。
展开
-
读书-程序员的自我修养-链接、封装与库(24:第十章:内存(1)程序的内存布局,栈与调用惯例
读书-程序员的自我修养-链接、封装与库(24:第十章:内存(1)程序的内存布局,栈与调用惯例)1. 程序的内存布局1.1 内核空间和用户空间1.2 Linux 进程地址空间布局1.3 段错误 segment fault2. 栈与调用惯例2.1 栈的特点2.2 堆栈帧2.2.1 堆栈帧(活动记录)定义2.2.2 堆栈帧内容2.2.3 foo.o 的反汇编2.2.4 windows 下的 烫 屯 分析2.3 栈的调用惯例2.3.1 调用惯例定义2.3.2 调用惯例内容2.3.3 默认调用惯例: cdecl内存原创 2020-08-17 09:03:20 · 204 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(23:第九章:windows下的动态链接)
读书-程序员的自我修养-链接、封装与库(23:第九章:windows下的动态链接)以后再写windows的原创 2020-07-30 11:06:52 · 108 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(22:第八章:Linux共享库的组织)
读书-程序员的自我修养-链接、封装与库(22:第八章:Linux共享库的组织)1. 共享库版本1.1 为什么需要共享库管理?1.2 共享库和共享对象关系1.3 共享库的兼容性1.4 共享库命名方式1.5 SO-NAME1.6 链接名2. 符号版本2.1 基于符号的版本机制3. 共享库系统路径4. 共享库查找过程5. 环境变量5.1 LD_LIBRARY_PATH6. 共享库的创建和安装6.1 共享库的创建6.2 共享库的安装: ldconfig6.3 共享库构造和析构函数7. 总结1. 共享库版本1.1原创 2020-07-28 20:46:26 · 199 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(21:第七章:动态链接(5)dlopen、dlsym、dlclose和动态链接总结
读书-程序员的自我修养-链接、封装与库(21:第七章:动态链接(5)dlopen、dlsym、dlclose和动态链接总结)1. dlopen、dlsym、dlclose2. 动态链接总结1. dlopen、dlsym、dlclose通俗易懂说:dlopen、dlsym、dlclose动态链接库的加载参考: https://blog.csdn.net/lqy971966/article/details/909422192. 动态链接总结...原创 2020-07-28 16:38:05 · 182 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(20:第七章:动态链接(4)动态链接的步骤和实现
读书-程序员的自我修养-链接、封装与库(20:第七章:动态链接(4)动态链接的步骤和实现)1. 动态连接器自举1.1 动态链接器本身也是一个共享对象1.2 动态连接器特点:不依赖,自己玩,不调用1.3 自举:具有一定限制条件的启动代码往往被称作自举2. 装载共享对象2.1 全局符号表2.2 装载过程步骤2.3 装载顺序:广度优先和深度优先2.4 符号的优先级2.4.1 问题:多个共享对象定义同一个符号怎么处理?2.4.2 例子说明2.4.3 全局符号介入:符号覆盖2.4.4 linux处理规则:后面的同名符原创 2020-07-21 23:48:57 · 214 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(19:第七章:动态链接(3)动态链接相关结构
读书-程序员的自我修养-链接、封装与库(19:第七章:动态链接(3)动态链接相关结构)1. 静态链接和动态链接的可执行文件执行过程对比1.1 静态链接的可执行文件执行过程回顾1.2 动态链接的可执行文件执行过程1.2.1 ld.so 也是一个共享对象2. .interp 字段2.1 objdump -s a.out 查看 interp 段3. .dynamic 段3.1 readelf -d a.out // -d dynamic 显示动态段的信息3.2 ldd a.out //查看程序依赖哪些共享库4原创 2020-07-21 17:49:44 · 260 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(18:第七章:动态链接(2)延迟绑定 PLT)
读书-程序员的自我修养-链接、封装与库(18:第七章:动态链接(2)延迟绑定 PLT)1. 动态链接性能低的两个原因2. 延迟绑定的实现2.1 延迟绑定出现原因2.2 延迟绑定思想-第一次用到时才进行绑定2.3 延迟绑定的优点2.4 延迟绑定原理2.4.1 增加中间层间接跳转2.4.2 例子说明PLT原理2.5 .plt 段1. 动态链接性能低的两个原因对于全局和静态地数据访问都要进行复杂的GOT定位,然后间接寻址;对于模块间的调用也要先进行GOT,然后再进行间接跳转;动态链接的链接工作在运行时完原创 2020-07-03 17:35:20 · 221 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(17:第七章:动态链接(1)动态链接和地址无关代码
读书-程序员的自我修养-链接、封装与库(17:第七章:动态链接(1)动态链接和地址无关代码)一、 动态链接二、 地址无关代码2. 固定装载地址的困扰2.1 静态共享库2.1.1 静态共享库和静态库2.2 解决-共享对象在任意地址加载3. 装载时重定位3.1 静态链接中重定位的基本思想3.1.1 例子说明3.2 几个重定位的概念3.3 装载时重定位不能解决共享对象中的问题3.3.1 原因3.4 -shared 支持装载时重定位4. 地址无关代码4.1 -fPIC 作用4.2 装载时重定位不能解决共享对象中的问原创 2020-07-03 15:18:07 · 277 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(16: 第六章:可执行文件的装载与进程(4)Linux 内核装载ELF过程简介 和 windows PE的装载
读书-程序员的自我修养-链接、封装与库(16: 第六章:可执行文件的装载与进程(4)Linux 内核装载ELF过程简介 和 windows PE的装载)1. Linux 内核装载ELF过程简介1.1 ./a.out 背后的逻辑2. windows PE的装载2.1 PE 和 ELF 有所不同2.2 RAV 相对虚拟地址 基地址1. Linux 内核装载ELF过程简介当我们在linux系统的bash下输入一个命令执行某个elf程序时,linux系统是怎么装载这个elf文件并执行它的呢?我们以hello原创 2020-06-30 20:51:37 · 206 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(15: 第六章:可执行文件的装载与进程(3)进程虚存空间分布
读书-程序员的自我修养-链接、封装与库(15: 第六章:可执行文件的装载与进程(3)进程虚存空间分布)1. ELF 文件链接视图和执行视图1.1 问题出现--多段不整页映射浪费空间1.2 解决问题--同权限的段合并Segment映射1.2.1 ELF段的三种权限1.2.2 解决方案1.2.3 Segment1.2.4 sectionMap.elf 例子说明2. 堆和栈2.1 VMA 的作用2.2 例子-查看进程虚拟空间分布2.3 总结-进程虚拟地址空间2.4 进程虚拟空间映射关系图3. 堆的最大申请数量3.原创 2020-06-29 22:38:07 · 332 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(14: 第六章:可执行文件的装载与进程(2)从操作系统角度看可执行文件的装载:进程建立的3个步骤,虚拟地址空间,页错误
读书-程序员的自我修养-链接、封装与库(14: 第六章:可执行文件的装载与进程(2)从操作系统角度看可执行文件的装载)1. 从操作系统角度看可执行文件的装载1.1 进程建立的三个步骤1.1.1 创建一个独立的虚拟地址空间1.1.2 建立虚拟空间和可执行文件的映射关系1.1.3 将cpu的指令寄存器设置为可执行文件的入口地址,执行它1.2 为什么需要虚拟地址空间?1.3 页错误1.3.1 页错误定义1.3.2 页错误的处理1. 从操作系统角度看可执行文件的装载1.1 进程建立的三个步骤从操作系统角度看,原创 2020-06-22 21:53:46 · 670 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(13: 第六章:可执行文件的装载与进程(1)进程虚拟地址空间,4GB,和 装载方式,局部性原理,页映射
读书-程序员的自我修养-链接、封装与库(13: 第六章:可执行文件的装载与进程(1)进程虚拟地址空间 和 装载方式)1. 进程虚拟地址空间1.1 4GB虚拟地址空间1.2 4GB虚拟地址空间不能任意使用1.2.1 4GB虚拟地址空间分配1.2.2 3GB空间不够用怎么办? PAE出现2. 装载的方式2.1 局部性原理的出现2.1.1 局部性原理(动态装入的基本原理)2.2 两种动态装入方法2.2.1 覆盖装入/overlay2.2.2 页映射/paging2.2.3 页映射例子:1. 进程虚拟地址空间1原创 2020-06-21 18:29:54 · 259 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(12: 第五章:windows PE/COFF
读书-程序员的自我修养-链接、封装与库(12: 第五章:windows PE/COFF)windows PE/COFF1. windows的二进制文件格式PE/COFF2 PE的前身-COFF3. 链接指示信息4. 调试信息5. 大家都有符号表6. windows下的ELF-PEwindows PE/COFF1. windows的二进制文件格式PE/COFF在32位windows平台下,微软引入了一种叫做PE(Protable E蟹醋他爸了)的可执行格式。它源自于DEC公司的VAX,其实就是C原创 2020-06-21 16:22:11 · 243 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(11: 第四章:静态链接(4)--链接控制过程、ld默认链接脚本,TinyHelloWorld.c 和BFD库
读书-程序员的自我修养-链接、封装与库(11: 第四章:静态链接(4)--链接控制过程、链接脚本和BFD库)1. 链接控制过程1.1 操作系统内核是啥?1.2 链接控制脚本1.2.1 ld 链接1.3 最小的程序1.3.1 TinyHelloWorld.c 代码,编译链接,执行1.3.2 TinyHelloWorld.c 解释:1.4 ld 链接脚本-TinyHelloWorld.lds2. BFD库1. 链接控制过程绝大部分情况下,我们使用链接器提供的默认链接器规则对目标文件进行链接。但是对于一些特原创 2020-06-20 17:27:43 · 357 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(10: 第四章:静态链接(3)--C++问题,ABI,静态库libc.a,printf .o,hello.c 整个编译链接过程
读书-程序员的自我修养-链接、封装与库(10: 第四章:静态链接(3)--C++问题和静态库链接)1. C++相关问题1.1 C++的两个问题1.2 c++ 与 ABI1.2.1 ABI 定义1.2.2 ABI 和 API 的区别2. 静态库链接2.1 语言库概念2.2 ar -t libc.a //查看静态库 libc.a 包含哪些文件2.2.1 objdump -t libc.a grep -w printf //查找 printf 在 libc.a 库的哪个目标文件2.2.2 why 一个目标文件只包原创 2020-06-20 16:04:40 · 811 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(9: 第四章:静态链接(2)符号解析,重定位,COMMON块
读书-程序员的自我修养-链接、封装与库(9: 第四章:静态链接(2)--符号解析与重定位)1. 符号解析与重定位1.1 重定位1.2 重定位表1.2.1 什么是重定位表?1.2.2 查看重定位表 objdump -r a.o1.3 符号解析1.3.1 常见链接失败例子1.3.2 readelf -s a.o1.4 指令修正方式1. 符号解析与重定位在完成空间和地址的分配步骤之后,链接器就进行符号解析与重定位。1.1 重定位先看a.o里面是怎么使用这两个外部符号的(iShared swap)。也就原创 2020-06-20 12:17:10 · 483 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(8: 第四章:静态链接(1)空间与地址分配:静态链接,地址空间,链接步骤
读书-程序员的自我修养-链接、封装与库(8: 第四章:静态链接(1))原创 2020-06-20 08:18:45 · 275 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(7: 第三章:目标文件里有什么(2)readelf,链接的本质,符号/表,extern “C“,强/弱符号
读书-程序员的自我修养-链接、封装与库(7: 第三章:目标文件里有什么(2)readelf,各个段信息,符号)1. ELF文件结构描述1.1 readelf -h simple.o1.1.1 ELF头文件说明1.2 readelf 命令1.3 readelf -S simple.o 查看各个段1.3.1 simple.o 各个段位置图1.3.2 .rel.text 重定位表1.3.3 .strtab/.shstrtab 字符串表2. 链接的接口-符号2.1 链接的本质2.2 符号2.3 .symtab 符号原创 2020-06-17 17:37:54 · 324 阅读 · 0 评论 -
万历十五年 - 读书
万历十五年 - 读书1. 序参考1. 序本书的英文版书名为 “1587, A Year of No Significance” (无意义的一年)万历皇帝朱翊钧([zhū yì jūn]),大学士张居正、申时行,南京都察院都御史 海瑞,蓟(jì)州总兵官戚继光,以知府身分挂冠而去的名士李蛰,他们或身败,或名裂,没有一个人功德圆满。即便是侧面提及的人物,如冯保、高拱、张鲸、郑贵妃、福王常洵、俞大猷[yóu]、卢镗、刘廷,也统统没有好结果。这种情形,断非个人的原因所得以解释,而是当日的制度已至原创 2020-06-02 19:39:26 · 357 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(2: 第一章:温故而知新 [一些基础概念]计算机硬件结构,操作系统历史)
读书-程序员的自我修养-链接、封装与库(2: 第一章:温故而知新 [一些基础概念])1. 计算机硬件基本结构的演进1.1 早期计算机硬件结构1.2 如今的计算机硬件结构框架2. 中间层2.1. 计算机分层结构:2.2. 接口、API、系统调用接口:3. 操作系统历史演进3.1 早期:多道程序3.2 改进:分时系统3.3 多任务系统4. 驱动4.1 定义:4.2 抽象5. 硬盘/磁盘结构6. 内存分...原创 2019-04-28 21:38:40 · 263 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(3: 第一章:温故而知新 [一些基础概念(2)]内存分配,分段,分页,多线程)
读书-程序员的自我修养-链接、封装与库(2: 第一章:温故而知新 [一些基础概念(2)])1. 内存分配策略1.1 早期的简单内存分配策略1.2 简单分配内存策略问题1.3 解决1.4 名词解释:地址空间2. 分段、分页2.1 分段的思想和优缺点2.1.1 分段的思想:2.1.2 优点:2.1.3 缺点:2.2 分页的思想和优点2.2.1 局部性原理2.2.2 分页3. 多线程3.1 线程定义3....原创 2019-08-14 07:48:58 · 721 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(4: 第一章:温故而知新 [一些基础概念(3)]同步,锁,信号量,Volatile)
读书-程序员的自我修养-链接、封装与库(2: 第一章:温故而知新 [一些基础概念(3)])1. 同步与锁1.1 同步1.1.1 为什么同步?1.1.2 同步的定义1.2 锁1.2.1 同步的最常见的方法就是锁。1.2.2 定义1.2.3 作用11. Volatile 关键字1. 同步与锁1.1 同步1.1.1 为什么同步?为了避免多个线程同时读写同一个数据而产生不可预料的结果,我们要将...原创 2019-08-14 07:57:20 · 175 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(5: 第二章:静态链接 预处理,编译,汇编,链接)
读书-程序员的自我修养-链接、封装与库(5: 第二章:静态链接)1. Hello四个步骤2. 预处理的工作内容3. 编译的工作内容4. 连接器的工作内容1. Hello四个步骤2. 预处理的工作内容3. 编译的工作内容4. 连接器的工作内容...原创 2019-08-19 22:16:06 · 196 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(6: 第三章:目标文件里有什么(1)目标文件,objdump,file,size等命令)
读书-程序员的自我修养-链接、封装与库(6: 第三章:目标文件里有什么)1. 什么是目标文件?1.1 目标文件1.2 PE、ELF、COFF2. 目标文件是什么样?3. ELF文件结构描述4. 链接的接口-符号4.1 链接的本质4.2 符号4.3 符号修饰5. 相关的linux命令5.1 file5.2 objdump5.3 size6 句子1. 什么是目标文件?1.1 目标文件目标文件: ...原创 2019-08-25 21:40:35 · 260 阅读 · 0 评论 -
读书-程序员的自我修养-链接、封装与库(1: 作为程序员,这些问题你都知道吗?)
读书-程序员的自我修养-链接、封装与库(1)作为程序员,这些问题你都知道吗?1. 程序为什么需要编译了以后才可以运行?2. 编译器在把c代码编译成机器代码过程中做了什么?怎么做的?3. 最后编译出来的可执行文件里面是什么?除了机器代码还有什么?它们是怎么存放的?怎么组织的?4. #include作为程序员,这些问题你都知道吗?1. 程序为什么需要编译了以后才可以运行?2. 编译器在把c代码编译...原创 2019-04-13 14:25:34 · 261 阅读 · 0 评论