Linux动态链接库

news2024/9/22 9:55:48

一、背景

        我们使用Linux的过程中,例如安装程序或者部署一些如Python等,可能会遇到过如下动态链接库(共享库)报错:

        ImportError: libcrypto.so.10: cannot open shared object file: No such file or directory

$"./lib/python3.8/lib/python3.8/ssl.py", line 98, in <module> import _ssl 
# if we can't import it, let the error propagate ImportError: 
libcrypto.so.10: cannot open shared object file: No such file or directory

        例如这里的是报错,libcrypto.so.10 动态库没找到.

        那我们来分析一下,Linux动态链接库的一个查找过程是怎么样的。为什么说没找到这个文件呢? 寻找的过程是怎么样的

二、动态链接库、共享库

1、定义

        在 Linux 系统中,动态链接库(Dynamic Link Library)和共享库(Shared Library)是指同一概念的不同称谓,通常指的是 .so(shared object)文件。这类库在 Linux 和其他类 Unix 操作系统中非常常见,用于实现程序的模块化和资源的共享。

        动态链接库/共享库 是一种二进制文件,其中包含了一组预先编译好的函数和数据结构,可以被多个不同的程序共享。这些库通常在程序运行时被加载,并且可以被多个进程同时使用。

        在 Linux 中,动态链接库通常以 .so 扩展名命名,例如 libfoo.so。这个扩展名表明这是一个共享对象文件,它可以被动态链接器加载。

        Redhat系列一般存放于:  /usr/lib/、/usr/lib64/ ,  同时 / 下存在lib和lib64的软链接到/usr/lib、/usb/lib64/

  

        Linux中命名系统中共享库的规则:

        

        如文章开头缺失的共享库的名称就是crypto

2、寻找so动态链接库的过程

        1、首先查找当前环境中,环境变量LD_LIBRARY_PATH路径(多路径使用:分隔,和定义PATH环境变量路径一样),依次遍历,查找是否存在libcrypto.10.so这个文件,存在则读取,停止搜索,否则继续往下执行

        2、查找/etc/ld.so.cache已经缓存好的所有so动态库的路径,查看是否存在里面。存在则加载,否则查找so文件失败,程序报错.  我看可以看看/etc/ld.so.cache是什么东西?  这个是ldconfig根据/etc/ld.so.conf配置文件配置的共享库查找路径,预先查找到所有的so,记录了这些so的绝对路径形成的一个列表二进制文件(不能直接用cat打开, 使用strings打开查看内容).例如我们使用strings查看/etc/ld.so.cache文件内容:

      

        ld.so.cache文件缓存好了查找/etc/ld.so.conf配置好的搜索动态库路径搜索到所有so的绝对路径。

        这样应用程序查找的时候就没必要再次全量扫描/etc/ld.so.conf的路径下有没有对应的so了,直接从/etc/ld.so.cache匹配一下,效率更高、查找速度更快。

3、ldconfig、LD_LIBRARY_PATH、ldd命令的用处

1、ldconfig命令,重新生成/etc/ld.so.cache缓存

 1、直接执行ldconfig会重新生成/etc/ld.so.cache缓存文件,一般用于,新添加了/etc/ld.so.conf搜索so的路径,需要重新生成缓存

 2、ldconfig -p 查看当前缓存so路径内容, 类似strings /etc/ld.so.cache的效果

 2、LD_LIBRARY_PATH 环境变量

         ldconfig适用于全局的so查找路径。  但是因为作为全局,一般兼容性高,很少存在版本冲突问题。  如果我们应对的是相同的共享库,但是是这个共享库的不同版本。 例如我的A程序依赖于ssl的v1版本,但是系统依赖的是ssl的v2版本等等。 这就蛋疼了, 那这个ssl库保留哪个版本呢? 单独保留某一个版本,都无法满足需求。 要操作系统依赖的存在问题、要么应用程序存在问题。

        所以,Linux提供给我们这个LD_LIBRARY_PATH环境变量,就是解决这种多版本问题。 可以作为临时设置so查找的路径,这样可以避免版本冲突以及查找优先级.

        例如设置export LD_LIBRARY_PATH=/my/v1/:$LD_LIBRARY_PATH,  先把自己A程序查找共享库的路径放到前面,其它放在后面,那么一旦从我们的v1找到,就停止搜索了,后面v2的ssl.so就不会被搜索到了.

        1、提高so共享库查找的优先级

        2、可以解决版本冲突问题

3、ldd命令,查看一个二进制命令依赖共享库的信息

        有时候我们关于共享库报错,那么我们想看下这个二进制是缺的什么共享库,用到了哪些共享库。 可以使用 ldd $程序二进制绝对路径查看,例如查看ssh命令的共享库依赖:

        

        从ldd结果,如果某些库找不到,那么我们需要通过yum或者其他方式安装对应这个库依赖即可解决问题

4、回到案例,排查结果

        我们知道了动态库的原理,那么针对文章开头的地方,我们去看了一下确实存在问题。 libcrypto.so.10软连接指向的源文件,路径搞错了,导致找不到文件:

        

        源文件路径多了空格,并且源文件路径不存在。 导致应用程序查找到了.so,但是无效的软链接,所以报错。

三、总结

        下次遇到动态链接库报错、多版本的so共享库不必慌张,原理就是如此。希望对大家有所帮助!

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同三维TM6-6 有线6级联会议麦克风详情介绍

同三维TM6-6 有线6级联会议麦克风 信息通讯类智能阵列麦克风 有线传输&#xff0c;强抗干扰、可级联、长续航、低延时 6个麦克风级联&#xff0c;通过3.5音频线级联, 可以同时使用3.5mm LINE IN/OUT、USB有线连接PC端&#xff0c;每条音频线是3米&#xff0c;可应用在视频会…

使用vscode编辑matlab完美解决方法

vscode里面的matlab插件都不好用&#xff0c;需要搭配互补一下 1先安装MATLAB 这个插件可以进行代码高亮、格式化、跳转&#xff0c;F5运行所有代码&#xff0c;或者选中要运行的代码&#xff0c;右键单独运行&#xff0c; 优点&#xff1a;运行速度很快&#xff0c;和matlab里…

idea新建父工程和添加导入新模块的步骤

如何在idea中新建一个父工程&#xff0c;然后在父工程下新建多个微服务模块&#xff1f; 一、新建父工程 1.1 新建New Project 1.2 删掉多余文件 创建好后&#xff0c;把多余的文件删掉&#xff0c;变成这样 1.3 修改pom文件 添加<packaging>pom</packaging>…

【Webpack】基本使用方法

参考视频&#xff1a; 30 分钟掌握 Webpack_哔哩哔哩_bilibili 什么是webpack 简单来说就是一个 打包工具&#xff0c; 可以将互相依赖的html、css、js以及图片字体等资源文件&#xff0c;经过处理打包成一个可执行的项目文件 &#x1f330;看例子 环境初始化 在需要使用…

ai智能写作助手批量生成文章,提升工作效率!

在当今快节奏的工作环境中&#xff0c;时间就是金钱&#xff0c;效率就是生命。对于需要大量产出文章的工作者来说&#xff0c;如何在有限的时间内创作出高质量的内容&#xff0c;成为了一个亟待解决的问题。而AI智能写作助手的出现&#xff0c;为这一问题提供了解决方案。本文…

godot开发初体验

点击加号可以创建一个新的场景 点击其它节点可以添加节点 想对某个节点添加子节点可以右键这个节点,然后点击添加子节点 在左下角的文件系统中,可以右键某个场景,并将其设置为主场景,主场景作为程序的入口 点击项目->项目设置-> 输入映射,可以添加一个新的动作,在添加新动…

游戏应用|空地模型实景融合,还原《黑神话:悟空》游戏场景

古色斑驳&#xff0c;巍峨险峻&#xff0c;是历史的低语&#xff0c;诉说着千百年的沧桑与辉煌&#xff1b;飞檐翘角&#xff0c;雕梁画栋&#xff0c;凝聚着时代的文明与智慧。在数字化浪潮下&#xff0c;我们利用实景三维技术&#xff0c;翻开了中华古建筑这本伟大的史诗。 P…

快速入门Go:Go + gin + MongoDB

Go 进阶:Go + gin + MongDB 极速搭建EcommerceSys电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 本文章持续更新中,请关注… 项目结构 项目流程图 技术栈(待补充)项目结构项目路由 (待补充) …

合宙LuatOS开发板Core_Air780EP使用说明

Core-Air780EP 开发板是合宙通信推出的基于 Air780EP 模组所开发的&#xff0c; 包含电源&#xff0c;SIM卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。 以方便用户在设计前期对 Air780EP模块进行性能评估&#xff0c;功能调试&#xff0c;软…

zeus病毒应急响应

目录 介绍步骤 介绍 Zeus病毒&#xff0c;也叫Zbot病毒&#xff0c;是一种具有高潜伏性的木马病毒&#xff0c;受影响系统为微软Windows&#xff0c;主要被用来盗窃用户银行信息。 Zeus最早于2007年被发现&#xff0c;当时它被用来盗取美国某公司的资料信息。到2009年&#x…

科技赋能,览尽千年:高科技解锁博物馆沉浸式探索!

近日&#xff0c;第十届中国博物馆及相关产品与技术博览会&#xff08;简称“博博会”&#xff09;在呼和浩特市敕勒川国际会展中心圆满落幕。 “博博会”上&#xff0c;智能化、数字化技术成为了展览的一大亮点。虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR…

计算机电脑共享文件和打印机共享问题:“计算机无法访问!您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。”解决办法

在Win10系统中&#xff0c;我们在访问局域网共享文件或计算机共享打印机的时候会出现“你可能没有权限使用网络资源 ”。请与这台服务器的管理员联系以查明你是的提示&#xff0c;很多用户不知道如何解决&#xff0c;下面就把正确的解决方法分享给大家&#xff0c;你可能没有权…

【数据结构篇】~链表算法题2

链表算法题2 1.返回倒数第k个节点思路解析 2.链表的回文结构​思路解析1&#xff08;空间复杂度不符合&#xff09;解析2 3.相交链表​思路解析 1.返回倒数第k个节点 OJ链接 思路 有点像高中学的相对位移 利用快慢指针&#xff0c;开始时都指向头节点&#xff0c;然后让快指…

redis之地理空间geo实战以及选项详解

redis之地理空间geo实战以及选项详解 Redis GEO Redis GEO 主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作&#xff0c;该功能在 Redis 3.2 版本新增。 Redis GEO 操作方法有&#xff1a; geoadd&#xff1a;添加地理位置的坐标。 geopos&#xff1a;获取地理…

【时时三省】(C语言基础)指针进阶6

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 例题1&#xff1a; sizeof(数组名)&#xff0d;数组名表示整个数组的&#xff0d;计算的是整个数组的大小 &数组名&#xff0d;数组名表示整个数组&#xff0c;取出的是整个数组的地址 …

SprinBoot+Vue宠物领养救助微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Windows如何恢复已删除文件?电脑数据恢复完整指南!

无论你是要释放磁盘空间还是因为其他原因删除或误删重要文件或文件夹后&#xff0c;现在一定想知道怎么还原。其实不用担心&#xff0c;在你删除文件时&#xff0c;你的电脑并没有完全删除它们&#xff0c;只是将它们标记为已删除&#xff0c;等待新数据覆盖。所以你还有很多方…

论文速读|BiGym:一款基于演示的移动双手操作机器人基准

项目地址&#xff1a;BiGym: A Demo-Driven Mobile Bi-Manual Manipulation Benchmark BiGym 是一个针对移动双手操作的机器人学习基准&#xff0c;包含 40 个在家庭环境中进行的任务&#xff0c;如简单的目标接近到复杂的厨房清洁。这些任务涵盖了从固定的目标接近到需要与各种…

监控平台之rollup打包

设计思路 1.根据模块&#xff0c;通过index.js去调用执行调用 2.WebEyeSDK.js暴露方法&#xff0c;同时定义init方法&#xff0c;去初始化config里的上报参数 3.rollup/build里入口文件为WebEyeSDK.js进行打包 4.打包编译用babel&#xff0c;同时安装babel/preset-env智能预…

SQL 编程基础

SQL&#xff08;结构化查询语言&#xff09;广泛应用于数据库操作&#xff0c;是每个程序员都需要掌握的技能之一。这篇文章将带你从基础入门&#xff0c;了解SQL编程中的常量、变量及流程控制语句。我们将采用简单易懂的语言&#xff0c;结合实际示例&#xff0c;帮助你轻松理…