《程序员的自我修养》阅读笔记(二):装载与动态链接

第3部分 装载与动态链接

第6章 可执行文件的装载与进程

PAE(Physical Address Extension)物理地址扩展,36位物理地址。

进程创建做的一些事情:创建一个独立的虚拟地址空间;读取可执行文件头,并建立虚拟空间与可执行文件的映射关系;将CPU的指令寄存器设置成可执行文件的入口地址,启动运行。

 一个Segment包含一个或多个属性类似的Section。

VMA(Virtual Memory Area,虚拟内存区域):

第7章 动态链接

把链接推迟到运行时才进行。

链接时重定位。装载时重定位,也称基址重置。

参数shared和-fPIC(PIC,Position-independent Code,地址无关代码)。

模块内部函数调用、跳转:相对地址

模块内部数据访问:偏移量

模块间数据访问:把跟地址相关的部分放到数据段,并在数据段建立指向变量的指针数组,也被称为全局偏移表,GOT(Global Offset Table),然后通过GOT间接引用。

模块间调用、跳转:与数据访问类似,不过GOT中相应保存的是函数地址。

延迟绑定,使用PLT(Procedure Linkage Table)。

动态链接步骤:启动动态链接器(本身也是共享对象);装载共享对象;重定位和初始化。

动态链接器,自举(Bootstrap),自举代码。动态链接器本身是静态链接的。

显示运行时链接,也叫运行时加载。

第8章 Linux共享库的组织

共享库的SO_NAME,只保留主版本号,建立它到实际共享库的软连接。Linux 提供一个ldconfig,用于更新软连接。

符号版本机制。

环境变量LD_PRELOAD,可指定预先装载的共享库甚至模板文件。

第9章 Windows下的动态链接

Windows下的DLL文件和EXE文件实际上是一个概念,它们都是有PE格式的二进制文件,稍不同的是PE有个符号位表示文件是EXE还是DLL,而DLL扩展名不一定是.dll,也可能是别的如.ocx(OCX控件)或.CPL(控制面板程序)。

DLL符号默认不导出,要导出可使用_declspec关键字来修饰某个函数或者变量,_declspec(dllexport)表示从本DLL导出的符号;从其他DLL导入符号,则使用_declspec(dllimport)。

创建DLL时会产生一个.lib文件,不真正包含源代码和数据,只描述.dll的导出符号,这样的文件被称为导入库。

另一种声明某函数为导出函数的方法为采用模块定义文件(.def)声明。

原文地址:https://www.cnblogs.com/ph829/p/4322832.html