从开发者面对的动态库,对linux发行版兼容性差的缺点和痛点出发,本文梳理问题、探讨并分享3种解决思路 。
Linux系统如何知道哪些路径下有动态链接库可供链接加载?可借助ldconfig缓存的信息 。
ldconfig 是一个工具程序,用于更新动态链接器的缓存 。动态链接器在加载动态库时,会先查找缓存,如果缓存中已经存在对应的动态库的记录,则直接使用缓存中的信息,否则再根据环境变量LD_LIBRARY_PATH从对应的目录内找动态库文件 。
那么ldconfig的缓存,究竟存储在哪里?在内存吗?还是在文件系统?
ldconfg 对动态库路径信息的缓存 , 存储在哪里?可以通过命令查询当前系统已缓存了哪些动态库:
1.命令 ldconfig -p 查询当前系统已缓存的动态库以下通过命令 ldconfig -p 查询当前系统已缓存的动态库,包含库文件名称、版本信息、体系结构、库文件所在路径 。以下查询结果仅展示常用的动态库,比如 libstdc++,libMySQLclient等动态库,
user@linuxlibs:~$ ldconfig -p785 libs found in cache `/etc/ld.so.cache'…… # std-c++ 动态库libstdc++.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libstdc++.so.6libssl3.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl3.solibssl.so.3 (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.so.3libssl.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libssl.solibssh.so.4 (libc6,x86-64) => /lib/x86_64-linux-gnu/libssh.so.4…… # Python/ target=_blank class=infotextkey>Python核心动态库libpython3.10.so.1.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpython3.10.so.1.0…… # 线程相关的动态库libpthread.so.0 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libpthread.so.0……libodbc.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libodbc.so.2libodbc.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libodbc.so…… # mysql 客户端动态库libmysqlclient.so.21 (libc6,x86-64) => /lib/x86_64-linux-gnu/libmysqlclient.so.21libmysqlclient.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libmysqlclient.so……# 维护链接信息的动态库ld-linux-x86-64.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2Cache generated by: ldconfig (Ubuntu GLIBC 2.35-0ubuntu3.4) stable release version 2.352.介绍一个大多数可执行文件都会链接的动态库ld-linux-x86-64.so.2上面最后的 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 是 Linux 系统的一部分 。这个库主要用于加载和运行其他动态链接库 。
当一个程序需要使用其他动态链接库中的函数时,它会通过调用 ld-linux-x86-64.so.2 来加载所需的动态链接库,并解析其中的符号(函数、变量等) 。这样,程序就可以在运行时动态地使用其他库中的功能,而不需要在编译时将这些库静态链接到程序中 。
3.ldconfig的缓存文件,在这里我们注意到输出信息第一行为785 libs found in cache /etc/ld.so.cache (在缓存文件中找到785个库文件记录),说明 /etc/ld.so.cache 是 ldconfig 搜索动态库时依据的缓存文件,该缓存文件记录了785个动态库文件的信息,每条信息记录了 key=>value 的这样的键值对形式,例如libmysqlclient.so.21 (libc6,x86-64) => /lib/x86_64-linux-gnu/libmysqlclient.so.21 。用 ls -lht 命令查看该缓存文件的属性:
user@linuxlibs:~$ ls -lht/etc/ld.so.cache-rw-r--r-- 1 root root 48K Dec 11 10:45 /etc/ld.so.cacheuser@linuxlibs:~$ file /etc/ld.so.cache/etc/ld.so.cache: data#类型是二进制数据文件,有内部格式无法直接查看内容从中,我们第一可以明确的是,缓存文件存储在磁盘 。
第二可以推断 , 磁盘的缓存文件,可能有通过mmap()方式映射内到存中,以满足系统各类软件频繁获取动态库信息的效率要求 。这个猜测后续会进一步验证 。
这些动态库的版本如何被linux系统安装管理的呢?首先 , Ubuntu linux的动态库文件,需要通过apt安装后才会出现在系统库目录内 。例如C++ 程序在运行时需要链接的动态库libstdc++.so.6.0.30,可通过apt install 安装包 libstdc++6 获得 。
#可通过 dpkg -L 查询软件包 libstdc++6 安装后新增了哪些文件:user@linuxlibs:~$ dpkg -L libstdc++6 /. /usr /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/share/doc/libstdc++6 …… 略安装后 , 允许存在多个不同版本的libstdc++动态库包,但系统启用的只是其中一个:
user@linuxlibs:~$ ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6…… /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.30
推荐阅读
- win10打开软件老是询问是否运行怎么办
- 这5部电影,让你真正感受女性的魅力与坚韧
- ps如何让字体变成弧线,ps要如何才能使用钢笔工具画出弧线
- dat是什么文件 dwg格式用什么软件打开
- 安卓软件怎么传给苹果,安卓手机怎么传文件到苹果手机
- 6种方法让你减重更减脂!三个月的成果,你会感谢当初的自己
- 制作mv用什么软件,明星们制作mv用什么软件
- 能让肌肤发光发亮的精华有哪些?这6款精华真的可以考虑一下
- 中年妇女用什么护肤品好?让你肌肤变年轻 中年妇女护肤品排行榜
- 一战德国如何“从空气中制造炸药和粮食”,消除饥饿也让无数人亡
