启动时连接库
在 Linux 的 ELF 环境中,动态链接器寻找程序需要的共享对象,准备运行状态,再启动程序。共享库依赖还可以指向其他库,装载因而涉及一张依赖图。
库名不含路径时,查找可能涉及程序中记录的搜索目录、环境变量、系统缓存和默认目录。DT_RUNPATH 对直接依赖的适用范围与旧 DT_RPATH 不同,不能把所有目录规则视为等价。
参考:[1]
按需装载与符号绑定
程序也可以调用 dlopen 装载共享对象,并通过返回的句柄继续查找符号。这常用于按需启用的模块,和程序启动时就列出的依赖并不完全相同。
RTLD_NOW 要求返回前解析相应的未定义符号。RTLD_LAZY 可把函数引用的解析延后到使用时,但不把变量引用一并延迟;缺少符号因此可能在不同阶段暴露。
参考:[2]
依赖、卸载与安全边界
dlclose 减少装载器维护的引用计数,但成功返回不保证库立即从地址空间消失。其他已装载对象仍可能依赖它,因此必须区分释放一个句柄和卸载最后一个依赖。
动态链接也不是自动的兼容性保证。库仍须满足程序所需接口;Linux 在安全执行模式下还会忽略部分影响装载的环境变量,以避免普通环境设置任意改变受保护程序的依赖选择。