1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
linux 动态加载dll技术.md 3.34 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2021-07-04 18:17 . 大量本地更新

[TOC]

linux 动态加载dll技术

前言

在windows中叫dll的技术,同样在linux也有类似的技术。相比 windows 而言,linux 对动态加载可以更加轻易的管理(当然也包括更容易出错)。在 linux 中,很多人都会遇到更新 libc 出现系统崩溃,完全无法用的情况。这是因为 libc 库是几乎所有程序共享的程序库。

工具

ldd 查看共享库

# 查看程序依赖的共享库
ldd /bin/ln
# 显示:
        linux-vdso.so.1 (0x00007ffca95e9000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f76c4b18000)
        /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f76c4d36000)

## 替代方案
objdump -p /bin/ln |grep NEEDED

小括号的十六进制数是共享库在当前程序加载的内存位置(因此是会变化的)。

其中, linux-vdso 是个系统虚拟库,它只存在运行的程序中,目的是虚拟调用接口的实现(中断或者高速系统调用)。

libc 是 c 语言的运行库,而 c 语言是很多程序的开发语言,或者间接调用的基本库。

/lib64/ld-linux 是动态加载器(实际是一个程序,而不是一个库),也就是通过这个来管理共享库的加载,这是一个绝对路径。而其他是名字,就是程序在链接的时候只会绑定名字,而管理器就提供配置的机制,让名字和具体的路径绑定起来。

共享库命名是有讲究的,linux 约定库应该用以下命名规则:

  1. libxxx.so.1.2.3
    1. lib : 以lib开始
    2. xxx : 名字
    3. .so : 动态库后缀
    4. .1 : 主版本
    5. .2 : 次版本
    6. .3 : 发行版本

这种命名叫“soname”,其他程序链接使用的时候,只需要给出名字部分即可。

在编译共享库时可以设定 soname,soname 会匹配一个 libxxx.so 的链接(或 ld 脚本),指向真实的文件名。

如: soname(libc.so.6) --> link(libc.so) --> file(libc-2.31.so)。

ldconfig 配置共享库

# 直接使用 加载器
# 该用法和 ldd 效果类似
/lib64/ld-linux-x86-64.so.2 --list /bin/ln

共享库的配置文件:

  1. /etc/ld.so.conf
  2. /etc/ld.so.cache

其中 ld.so.cache 由 ldconfig 程序对 ld.so.conf 配置的路径进行预处理的结果。也就是当用 ld.so.conf 配置完新的路径,由管理员账户执行 ldconfig 才可以让路径生效。

# 查找 ld.so.conf 配置路径下所有的共享库,生成缓存 ld.so.cache
sudo ldconfig 
# 打印当前缓存的共享库路径信息 
ldconfig -p

临时增加搜索路径:

# 使用环境变量 LD_LIBRARY_PATH
LD_LIBRARY_PATH=/opt/lib ldd /lib/ln

修复动态加载器

版本兼容的概念

向上兼容(向前兼容,前指未来),低版本兼容高版本。当新版没有增加新接口,或者减少接口时,老版本可以向上兼容新版本。

向下兼容(向后兼容,后指落后),高版本兼容低版本。比如新版本提供旧版本所有的 api,并增加一些新的接口。这样就可以用新版本共享库替代旧版本共享库来使用。这是比较常见的。

兼容是精心设计的结果。比较理想的升级方案是大版本不提供向下兼容,小版本提供向下兼容,修订版本支持上下兼容。

参考

  1. IBM 管理共享库: https://www.ibm.com/developerworks/cn/linux/l-lpic1-102-3/
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助