
链接、装载与库
文章平均质量分 50
43118
JonyChan技术学习过程中的总结
展开
-
CSAPP[8]异常控制流
1.回收子进程–Zombie态当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除,而是被保持在一种已终止的状态中,直到被它的父进程回收。这个过程(已终止但未被回收)的进程称为僵死进程(zombie)。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程。若父进程终止,内核会将其子进程“过继”给init进程,init进程的PID为1,它不会终止,是所有进程的祖先。2.加载并运行程序execve函数在当前进程的上下文中加载并运行一个新程序:包括可执行目原创 2021-02-21 16:11:13 · 158 阅读 · 0 评论 -
链接、装载与库[11]运行库
1.FILE结构struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; //通过_file访问内部文件句柄表的数据 int _charbuf; int _bufsize; char *_tmpfname;};typedef struct _iobuf FILE;2.C语言运行库CRT任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这样的一原创 2021-02-20 14:09:16 · 123 阅读 · 0 评论 -
链接、装载与库[10]内存
1.堆与内存管理内核管理进程的地址空间,它可以提供一个系统调用给进程,这个系统调用申请内存.但是由于系统调用开销很大,我们不能每次申请内存都调用一次。好的做法:程序向OS申请一块适当大小的堆空间,这块空间由程序的运行库管理。...原创 2021-02-20 12:17:36 · 73 阅读 · 0 评论 -
链接、装载与库[9]Windows下的动态链接
1.DLL的简单例子__declspec(dllexport) 关键字修饰某函数时或变量时,表示该符号是从本DLL导出的符号;__declspec(dllimport) 关键字修饰某函数时或变量时,表示该符号是从别的DLL导入的符号。原创 2021-02-20 10:38:39 · 89 阅读 · 0 评论 -
链接、装载与库[8]Linux共享库的组织
1.共享库版本命名共享库的文件命名规则如下:libname.so.x.y.z其中x表示主版本号,y表示次版本号,z表示发布版本号。发布版本号表示库的一些错误的修正、性能的改进等,并不添加新的接口。2.共享库系统路径/lib: 存放系统最关键和基础的共享库,如动态链接器、C语言运行库、数学库等;**/usr/lib:**存放非系统运行时所需要的关键性的共享库,主要是一些开发时用到的共享库(静态库、目标文件),这些共享库一般不会被用户的程序或shell脚本直接用到。**/usr/local/原创 2021-02-20 09:56:53 · 136 阅读 · 0 评论 -
链接、装载与库[7]动态链接
1.动态共享对象与动态链接库在Linux系统中,ELF动态链接文件被称为动态共享对象(DSO, Dynamic Shared Object),一般以 .so 为扩展名;在Windows中,动态链接文件被称为动态链接库DLL,以**.dll**为扩展名。2.动态链接程序运行时地址空间分布共享对象.so的最终装载地址在编译时时不确定的,而是在装载时,装载器根据当前地址空间的空闲情况,动态分配一块足够大小的虚拟地址空间给相应的共享对象。可执行文件 往往是第一个被加载的文件,它可以选择一个固定空闲的原创 2021-02-20 09:33:00 · 511 阅读 · 0 评论 -
链接、装载与库[6]可执行文件的装载与进程
1.虚拟内存区域(VMA)操作系统创建进程后,会在进程相应的数据结构中设置一个.text段的VMA。VMA对于理解程序的装载执行和操作系统如何管理进程的虚拟空间有非常重要的帮助。2.进程栈初始化进程启动的时候需知道进程运行的系统环境变量和运行参数,常见做法是将其保存到进程的虚拟空间的栈中(Stack VMA)。假设系统中有两个环境变量:1)HOME = /home/user;2)PATH = /usr/bin;有两个参数1)prog;2)123;栈顶地址为0xBF801FBC进程在启动以原创 2021-02-19 10:41:19 · 115 阅读 · 0 评论 -
链接、装载与库[5]Windows PE/COFF
1.COFF目标文件格式COFF文件的文件头包括两部分:映像头Image Header: 描述文件总体结构和属性;(注:因为PE文件在装载时被直接映射到进程的虚拟空间中运行,它是进程的虚拟空间的映像。所以PE可执行文件很多时候被叫做映像文件)段表Section Table: 描述该文件中包含的段属性;PE(Protable Executable )跟ELF这两种可执行文件格式都是COFF(Common Object File Format)的扩展。2.链接指示信息.drectv原创 2021-02-18 21:15:29 · 173 阅读 · 0 评论 -
链接、装载与库[4]静态链接
1.链接器空间分配策略:两步链接法1)空间与地址分配:扫描所有的输入目标文件,获得它们各个段的长度、属性、位置,且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表。链接器获得所有输入目标文件的段长度,并合并它们,计算出输出文件中各个段合并后的长度与位置,并建立映射关系。2)符号解析与重定位。读取输入目标文件中段的数据、重定位信息,并且进行符号解析与重定位等。举例子:$ld a.o b.o -e main -o ab-e mian 表示将main函数作为程序原创 2021-02-18 20:36:11 · 113 阅读 · 0 评论 -
链接、装载与库[3]目标文件的结构内容
1.可执行文件的格式Windows平台:Portable Executable(PE)Linux平台:Executable Linkable Format(ELF)它们都是COFF(Common File Format)的变种2.目标文件的内容File Header:文件头。描述了整个文件的文件属性,包括文件是否可执行、是静态链接还是动态链接、入口地址、目标硬件、目标操作系统等信息.text / .code:代码段。.data:数据段。存储全局变量和局部静态变量。.bss:(Block原创 2021-02-18 16:05:39 · 177 阅读 · 0 评论 -
链接、装载与库[2]编译和链接
1.GCC编译源程序的4个步骤1)预处理主要的处理规则如下:将所有的“#define”删除,并且展开所有的宏定义;处理所有条件预编译指令,例如“#if”、“#ifdef”、"#elif"…处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;删除所有的注释“//”和“/**/”;添加行号和文件名标识,以便于编译时产生调用的行号信息及用于编译时产生编译错误或警告时能够显示行号;gcc -E hello.c -o hello.i //-E表示只进行预编译2)编译原创 2021-02-18 09:35:12 · 89 阅读 · 1 评论 -
链接、装载与库[1]温故知新
1.计算机体系架构的演变1.0 早期的计算机硬件结构早期计算机硬件采用的是总线型结构CPU的核心频率不高,与内存的频率一致由于I/O设备的速度与CPU、内存相比慢很多。为了协调I/O设备与总线之间的速度,也为了让CPU能够与I/O设备进行通信,一般每个设备配有一个I/O控制器。2.0 CPU倍频随着CPU核心频率的提升,导致内存跟不上CPU的速度,于是产生了与内存频率一致的系统总线,而CPU采用倍频的方式与系统总线进行通信。3.0 北桥与南桥北桥(PCI Bridge):协调CPU原创 2021-02-17 18:59:32 · 122 阅读 · 3 评论