8-2 共享库 查找路径

共享库 查找路径

核心总结

由此可以得出共享库的查找路径的顺序是;

  • 由环境变量LD_LIBRARY_PATH指定的路径

  • 由路径缓存文件/etc/ld.so.cache指定的路径

  • 默认共享库目录,先/usr/lib,然后/lib


共享库的系统路径

根据FHS标准规定,Linux系统中共享库的存放位置:

  • /lib:最关键和基础的库,比如动态链接器,C语言运行库,数学库等。主要是/bin/sbin下的程序需要用到的库。

  • /usr/lib:开发时用到的共享库,不会被用户的程序或脚本直接用到。

  • /usr/local/lib:第三方程序的库,比如python解释器相关的共享库就会在/usr/local/lib/python下。

共享库查找过程

路径存放位置 | 查找路径

应用程序中,依赖的共享库的路径存放在.dynamic中的DT_NEED里。

如果是绝对路径,动态链接器就会按照这个路径去找;相对路径则会在/lib/usr/lib和由/etc/ld.so.conf配置文件中指定的目录中查找共享库。

缓存优先文件

ldconfig在共享库更新时会更新SO-NAME软链接,同时也会更新SO-NAME缓存,用于给动态链接器快速查找共享库文件。缓存集中存放在/etc/ld.so.cache中。

LD_LIBRARY_PATH环境变量

Linux系统还提供了特殊的环境变量用于局部修改共享库的查找路径,从而让用户能实现共享库的测试和调试、应用程序级别的虚拟等功能。

改变共享库查找路径最简单的方式就是使用LD_LIBRARY_PATH环境变量。该变量默认为空,通过在进程启动时设置该变量即可做到修改共享库查找路径:

LD_LIBRARY_PATH=/home/user myexe

或者通过直接运行动态链接器启动程序也能做到类似的功能:

/lib/ld-linux.so.2 -library-path /home/user myexe