动态链接库原理
ELF 文件格式
ELF(Executable and Linking Format)文件是由编译器和链接器生成,用于保存二进制程序和数据,以方便处理器加载执行的文件格式。最初是由 UNIX 系统实验室(UNIX System Laboratories,USL)开发并发布作为应用程序二进制接口(Application Binary Interface,ABI)的一部分。
ELF 文件格式分为三种:
- 可重定位文件(Relocatable File),包含可以与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。
- 可执行文件(Executable File),包含可以执行的一个程序,此文件规定了 exec 函数如何创建一个程序的进程映像。
- 共享目标文件(Shared Object File),包含可以在两种上下文中链接的代码和数据。首先链接器可以将它和其他可重定位文件一起处理,生成另外一个目标文件。其次,动态链接器(Dynamic Linker)可以将它与某个可执行文件以及其他共享目标一起组合,创建进程映像。
SylixOS 中的 ELF 文件
SylixOS 中的 ELF 文件有以下几种:
- 内核模块文件 (.ko 结尾):由源文件编译得到的目标文件链接生成,属于“可重定位文件”。
- 可执行文件 :由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,应用程序文件必须指定程序入口(通常为 main 函数)。
- 动态链接库文件 (.so 结尾):由编译得到的目标文件链接生成,是一种位置无关的“共享目标文件”,但是没有程序入口。
- 静态链接库文件 (.a 结尾):根据编译得到的目标文件使用归档命令(ar)生成,用于程序链接。
SylixOS 应用程序源码编写完成后,首先要使用 gcc 将源文件编译成中间目标文件,再根据实际情况链接成内核模块、应用程序或库文件,其流程如下图所示:
SylixOS 动态加载器功能
SylixOS 动态加载器具备以下功能:
- 支持内核模块、位置无关的可执行程序以及动态库的加载。
- 支持加载应用程序时自动加载应用程序所依赖的库文件并且自动解决依赖关系。
- 支持程序运行过程中通过操作系统接口手动加载。
- 支持 C++全局对象自动构建、析构等操作并且支持 C++异常处理。