001 Linux中找不到动态库问题分析

在安装 openssl 到unbuntu的时候遇到问题。将前因后果和自己的分析记录一下。

前提:安装openssl到unbuntu,使用源码方式完成。

  1. 下载安装包 [ Downloads ] - /source/index.html

  1. 将安装包放在unbuntu的目录下,习惯将用的开发相关工具放在Desktop/tool下

  1. 新建文件夹: /home/hunandede/Desktop/tool/openssl

  1. 通过fileZilla 工具将 openssl-1.1.1c.tar.gzip放在 /home/hunandede/Desktop/tool/openssl下

c. 进入到openssl目录

d.源码安装包解压缩

tar zxvf openssl-1.1.1c.tar.gzip

# 加压完成得到目录: openssl-1.1.1c

e. 运行openssl-1.1.1c下的 ./configure

configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生相应的makefile文件,Makefile 规定了用什么编译器、编译参数等信息。从而可以使你的源代码能在不同的操作系统平台上被编译出来。比如它会检测你是不是有CC或GCC。

可以通过在 configure 后加上参数来对安装进行控制,比如代码:

./configure --prefix=/usr

可以简单的认为运行configure的目的是为了生成makfile文件

#如果正常完成,则会生成makefile文件

f. 使用sudo make install (使用管理员权限执行该命令)

g. 完成后,使用 openssl version -a 查看是否安装成功

结果有问题,提示:

openssl: symbol lookup error: openssl: undefined symbol: EVP_mdc2, version OPENSSL_1_1_0

分析原因:

有的程序执行需要链接动态库,但是自己安装的openssl的动态库并不在/usr/lib下。

可以认为是找不到动态库问题导致的。

解决找不到动态库.so的问题---有两种方法

一 使用环境变量LD_LIBRARY_PATH,

  1. 将动态库的绝对路径添加到该环境变量中

  1. LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)

               2.export LD_LIBRARY_PATH

注意该方法:此时文件生效只是在当前端口,关闭端口后就不起作用了

二 永久改变,写入配置文件中 需要两步

1. 配置文件/etc/ld.so.conf/etc/ld.so.conf.d/*.conf

需要root 权限,在 ubuutun22上,切换root 命令为 sudo -i

2. 将库文件的路径添加到这些配置文件中,然后运行

sudo ldconfig

将动态库加入到LD_LIBRARY_PATH中,这和windows中的环境变量是一样的,那么加入到这个/etc/ld.so.conf 里面是什么原因呢?

baidu了一下。

转摘至:关于/etc/ld.so.conf.d/和环境变量设置-CSDN博客

  1. 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),它实际上是在 ln 的 ldd 清单中看到的作为共享库相关性列出的 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文件来添加库路径。


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值