重定位 静态连接 动态连接 动态加载


总结:并无找到动态连接与动态加载的明显区别,但动态连接与静态连接的区别是明显的:
一个是编译时就连接进可执行文件,一个是执行时才连接。html


静态重定位

  • 重定位时,取重定位项,加上重定位因子获得欲修改位置的实际地址。
  • 优势:无须硬件支持
  • 缺点:程序重定位之后就不能在内存中移动。要求程序的存储空间连续的,不能把程序存储到若干个不连续的区域中。

动态重定位

  • 当CPU取一条访问内存的指令时,地址变换硬件将指令中的相对地址重定位寄存器中的值 相加,再根据和值去访问该单元的数据。
  • 装配模块不加任何修改就装入内存
  • 须要硬件(重定位寄存器)的支持

静态连接、动态连接

  • 静态连接
  • 动态连接(dll)
    • 装入时连接
    • 运行时连接

装入时连接:linux

  • 用一个动态导入表保存须要使用的dll文件和dll中的函数。
  • 装入时检根据动态导入表依次装入每一个动态库。

运行时连接:函数

  • 用API函数LoadLibrary或LoadLibraryEx函数来装入动态库(共享引用计数增长1)
  • 经过GetProcAddress函数来得到函数的地址,而且传递给函数相应的参数,调用这个函数。
  • 在动态库用完后,可经过FreeLibrary函数来释放动态库资源(共享引用计数减1)。