计算机 · 2021年12月19日 0

Linux动态共享库

共享库命名

libname.so.x.y.z

lib:共享库
name:共享库名称
so:固定后缀
x:主版本号,不同的版本号之间不兼容
y:次版本号,增量升级,向后兼容
z:发行版本号,对应版本的错误修正和性能提升,不影响兼容性

Linux中的共享库并不都是这样的格式:

  • Glibc的共享库命名为:libc-x.y.z.so
  • 动态链接器也是Glibc的一部分,使用ld-x.y.z.so命名
  • libm(数学库)等

动态链接

ELF文件中用SO-NAME字段指定动态链接库。

ldconfig

当系统中安装或者更新一个共享库的时候需要更新软链接和动态链接器查找文件,此时就应该执行ldconfig
ldconfig的作用就是遍历所有的保存共享库的目录/lib /usr/lib等,根据实际的共享库的版本更新软链接。

使用共享库

在用GCC编译的时候通过-lname的方式即可指定要链接的动态库:

gcc -o hello hello.c -lNAME

动态链接器按照下列顺序依次装载或者查找共享对象:

  1. 由环境变量LD_LIBRARY_PATH指定的路径
  2. 由路径缓存文件/etc/ld.so.cache指定的路径
  3. 默认共享目录 先/usr/lib再/lib

查看so库的具体版本

readelf -d  /path/to/library.so |grep SONAME

链接时的-Lxxx指定的库的路径是放在标准的链接搜索路径之后的,所以如果系统上已经装了相关的库,链接时会优先使用系统上已经装了的库,自己设置的-Lxxx就相当于失效了

在较新版本的gcc中,会默认把最终的可执行程序编译为shared object,如果想生成以前意义上的可执行程序,需要在最终的链接flag里加上--disable-shared