linux动态库加载相关

news/2024/9/8 9:19:04

linux下动态库搜索规则

(1)编译目标代码时指定的动态库搜索路径,也就是RPATH;

(2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

(3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;配置完毕后需运行ldconfig命令生效;

(4)默认的动态库搜索路径/lib;

(5)默认的动态库搜索路径/usr/lib;

即从(1)到(5)依次搜索。

如果程序运行时存在找不到库的问题,自然也可根据上述库的搜索规则做出应对方案。

首先是通过指定环境变量LD_LIBRARY_PATH和修改配置文件/etc/ld.so.conf的方式,这两种方式的作用域是全局的,弊端在于使用太多会污染系统环境且会影响到其他程序的执行,因此常用于调试。

其次是把需要的库放到系统默认的动态库搜索路径下,这种方式的作用域也是全局的。倘若需要的动态库是某个特定的库,放到系统路径下也无妨,但若是某个开源库且其他程序可能会用到,如OpenSSL库等,这样做就可能会导致其他程序发生问题。

最后,最优解还是在程序编译链接时加入-rpath 参数,指明可执行文件在寻找.so文件时的第一优先位置。其中库的路径信息保存在可执行文件中,运行时会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。这种方式既不会污染系统环境也非常方便。

当然,该最佳解决方式是需要重新编译链接程序的,如果不想这么做或者条件不允许怎么办呢?有没有什么办法可以让程序优先加载当前目录的动态库?答案是设置环境变量LD_LIBRARY_PATH,设置方法有三种:

(1)临时修改,在终端输入export LD_LIBRARY_PATH=./,终端关掉就失效;

(2) 修改~/.bash_profile或~/.bashrc文件,在文件末尾输入LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH,注此方式仅对当前登录用户有效;

(3)修改/etc/profile文件,在末尾输入LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH,此方式对所有用户有效。

方法1:

        让/etc/profile文件修改后立即生效 ,可以使用如下命令:

        # .  /etc/profile

        注意: . 和 /etc/profile 有空格

方法2:

        使用source命令
         source /etc/profile

       

        


http://wed.xjx100/news/1186663.html

相关文章

使用.NET 升级助手工具将.net framework4.8 MVC项目升级到net6

1 新建.net framework4.8 MVC项目 随便添加一个可以访问的界面用于测试 2 对当前项目进行升级 注意:若要进行升级,首先确保本地已安装相应的sdk,例如:dotnet-sdk-6.0.402-win-x64.exe1.运行cmd命令窗口,进入项目所在…

用户运营是什么?怎么做好用户运营?

一、用户运营概述 用户运营是通过一系列策略和活动来管理和提升企业与用户之间的关系。其核心重点包括: 吸引用户 留住用户 与用户进行有效的互动 提升用户体验 增加用户的参与度 二、用户运营所需技能 数据分析能力:收集、处理、分析和解读用户…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 :递归链表 简直是好题啊好题多做做 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 :递归链表 简直是好题啊好题多做做 >>>…

abc136

文章目录 A TransferB Uneven NumbersC Build StairsD Gathering ChildrenE Max GCDF Enclosed Points A Transfer 我们有两个装水的瓶子。 瓶子1 最多可以装 A毫升水,现在里面有B 毫升水。 瓶子2 里有 C 毫升水 我们将尽可能多地从瓶子2 中转移到瓶子1 中。 瓶子…

在docker中运行 pip 报错 Can‘t start new thread

原因源头 stackoverflowhis is because the default seccomp profile of Docker 20.10.9 is not adjusted to support the clone() syscall wrapper of glibc 2.34 adopted in Ubuntu 21.10 and Fedora 35.由于docker 版本与最新版 python 容器冲突导致 解决方案 以下三种方…

mini-spring|向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

目标 当我们的类创建的 Bean 对象,交给 Spring 容器管理以后,这个类对象就可以被赋予更多的使用能力。我们还希望可以在 Bean 初始化过程,执行一些操作。比如帮我们做一些数据的加载执行,链接注册中心暴漏RPC接口以及在Web程序关…

二进制代码保护和混淆(抵御静态分析)

为了防止自己编写的二进制程序被逆向分析,许多软件会采取各种手段,为程序加上重重壁垒 二进制代码的保护手段种类繁多,并且运用及其灵活 Ag:对汇编指令进行一定程度的混淆变换,可以干扰静态分析中的反汇编过程 在程…

Vue2:路由组件的两个生命周期方法

一、情景说明 在上一篇中,我们知道 被keep-alive缓存的组件,它的beforeDestroy不会被执行。 那么,如何弥补这个不足了? 这里,就要学习到两个新的生命周期方法 activated:路由组件激活(切换到该组件时&…