动态链接和加载

动态链接很多链接过程推迟到了程序启动时候但是提供一系列其他方法无法获得优点

动态链接共享库要比静态链接共享库更容易创建

动态链接共享库要比静态链接共享库更容易升级

动态链接共享库语义接近于共享库

动态链接允许程序运行加载卸载例程这是其他途径难以提供功能

当然也有一定弊端由于每次程序启动时候进行大量的链接操作动态链接运行性能要比静态链接不少程序使用每一个动态链接符号都必须符号表进行查找解析(Windows 的DLL某种程度上有所改善,下面将会讲到)增加运行时代价由于动态链接库还要包括符号表因此占据磁盘空间也比静态

在解决了过程调用兼容性问题之后另一个非常头疼问题函数语义变化共享库静态共享相比动态链接库更新要容易很多就可以很容易修改已经存在程序正在使用动态链接库这意味着即使程序没有任何改变程序运行也可能会改变windows系统中这是一个常见问题因为wwindows程序大量使用共享这些通常会有多个不同版本之间版本控制复杂多数程序交付带有版本

10.1 ELF动态链接

20世纪80年代晚期SUN Microsystems 产品SunOS 首次引入动态库技术这是Unix 系列产品第一次使用这一技术SUN合作开发Unix systeV, Release V引入ELF目标文件格式并采用SUNELF方案明显ELF之前目标文件格式改进20 世纪90 年代 成为UNixBSD 以及Linux Unix衍生版本标准

10.2 ELF文件内容

正如3提到那样ELF文件链接器眼中一系列区段section,加载器严重一系列sectionELF程序共享库基本结构是一样具体segment 或者区段section 所有区别

ELF 共享库可以加载任何地址因此他们总是使用位置无关代码PIC 形式链接这样文件代码无须重定位即可多个程序之间共享正如8描述那样ELF链接通过全局偏移GOT支持PIC代码每个共享库都有GOT其中包含程序引用静态数据指针如图10-1所示动态链接器解析重定位GOT所有指针这会引起性能问题但是实际除了非常巨大之外GOT都不通常使用标准C包含超过350k代码GOT只有180表项

你可能感兴趣的:(开发语言)