关于/etc/ld.so.conf.d/和环境变量设置

2023-05-16

关于/etc/ld.so.conf/和环境变量LD_LIBRARY_PATH

    • 1. 动态可执行程序和静态可执行程序
    • 2.动态链接库的搜索
      • 2.1 查询程序依赖的动态链接库
      • 2.2 动态装入器(dynamic loader)
      • 2.3 /etc/ ld.so.conf文件
      • 2.4 ldconfig命令
      • 2.5 /etc/ld.so.conf.d目录
    • 3. 环境变量LD_LIBRARY_PATH
    • 参考链接:

1. 动态可执行程序和静态可执行程序

Linux 系统上有两类根本不同的 Linux 可执行程序。

  • 第一类是静态链接的可执行程序。它们是“完整的”,静态可执行程序不依赖任何外部库就可以运行
  • 第二类则是动态链接的可执行程序,他们在执行时还需要动态地调用其他库,对其他库存在依赖,这样做的好处就是减小了自己程序的大小。而我们要关注的ld.so.conf 文件就是一个包含要搜索的动态链接库目录的清单

2.动态链接库的搜索

2.1 查询程序依赖的动态链接库

ln命令为例,我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的,查看 ln 依赖的所有共享库的列表:

ldd /bin/ln

在这里插入图片描述

如上图所示,ln 依赖外部共享库 libc.so.6 ld-linux.so.2
通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。
例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常我们会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。

2.2 动态装入器(dynamic loader)

那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它实际上是在 lnldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们看一下动态装入器如何在系统上找到适当的共享库。

动态装入器找到共享库要依靠两个文件:/etc/ld.so.conf /etc/ld.so.cache

2.3 /etc/ ld.so.conf文件

我们可以在ld.so.conf 文件中指定很多目录(/lib 和 /usr/lib 除外,它们会自动包含在其中),动态装入器将在其中查找共享库。
在默认的/etc/ld.so.conf文件中,可以看到有如下内容:

include /etc/ld.so.conf.d/*.conf

说明/etc/ld.so.conf.d/目录下所有的.conf文件都被包含,文件中所有的路径都会被搜索到。

2.4 ldconfig命令

但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过在shell里执行 ldconfig 命令做到这一点:

ldconfig

当 ldconfig 操作结束时,就会生成一个最新的 /etc/ld.so.cache 文件,它反映了我们对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看我们在 /etc/ld.so.conf 中指定的所有新目录。

ldconfig命令参数:

-v或–verbose:ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字
-f CONF:此选项指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf
-p或–print-cache:此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字。
-V:此选项打印出ldconfig的版本信息,而后退出。

2.5 /etc/ld.so.conf.d目录

另外,我们还可以在/etc/ld.so.conf.d/目录下创建.conf文件来添加库路径。

3. 环境变量LD_LIBRARY_PATH

若在/lib/usr/lib之外的目录中添加库文件,而又不在/etc/ld.so.conf中写入路径,此时可以用添加环境变量LD_LIBRARY_PATH的做法让系统识别到库文件。
  
  同时LD_LIBRARY_PATH 变量可以指示动态装入器首先检查某个目录,可以按照我们希望的优先级进行搜索,多个路径之间用冒号分隔;例如:

export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

LInux中的export命令用于设置环境变量(但仅在当前shell中起作用),所以执行完上面这个命令以后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old/opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。

参考链接:

https://blog.csdn.net/wojiuguowei/article/details/50977089
https://www.cnblogs.com/alix-1988/p/12564011.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于/etc/ld.so.conf.d/和环境变量设置 的相关文章

随机推荐