zoukankan      html  css  js  c++  java
  • 《程序员的自我修养》阅读笔记(二):装载与动态链接

    第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)声明。

  • 相关阅读:
    侯捷STL课程及源码剖析学习1
    路边拾遗之其他模块(struct/csv/xlwt/smtp)
    面向对象之内置方法(简单)、组合。以及接口归一化设计与抽象类
    面向对象之继承与派生
    面向对象之类属性实例属性及其增删改查
    python中常用模块详解二
    函数之命名空间、作用域、闭包、装饰器四剑客。
    文件操作之1,2,3
    python中常用模块详解一
    python内置常用内置方法详解
  • 原文地址:https://www.cnblogs.com/ph829/p/4322832.html
Copyright © 2011-2022 走看看