首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux so加载路径

基础概念

Linux系统中的共享库(Shared Libraries),通常以.so为文件扩展名,是一种允许多个程序共享同一份代码的机制。当一个程序运行时,它可能会依赖于一些库文件中的函数。这些库文件不必被直接包含在程序的可执行文件中,而是在程序运行时动态加载到内存中。

相关优势

  1. 节省磁盘空间:多个程序可以共享同一份库文件的副本,而不是每个程序都包含一份。
  2. 更新和维护方便:更新库文件后,所有依赖它的程序都会自动使用新版本,无需重新编译程序。
  3. 提高性能:动态链接库可以在运行时加载,减少了程序启动时的内存占用。

类型

  • 静态链接库:编译时链接到程序中,成为程序的一部分。
  • 动态链接库:运行时加载,程序运行时才链接到库。

应用场景

  • 系统级服务:如操作系统提供的各种服务。
  • 应用程序:大多数现代应用程序都会依赖一些共享库来提供功能。
  • 框架和库:如Web服务器、数据库客户端等。

加载路径

Linux系统中有几个环境变量和配置文件决定了共享库的加载路径:

  • LD_LIBRARY_PATH:这是一个环境变量,可以指定额外的库搜索路径。
  • /etc/ld.so.conf:这个文件包含了默认的库搜索路径,可以通过ldconfig命令更新。
  • /lib/usr/lib:这些是系统默认的库目录。

遇到的问题及解决方法

问题:找不到共享库

原因:程序运行时找不到所需的共享库文件。

解决方法

  1. 检查LD_LIBRARY_PATH环境变量是否包含库文件的路径。
  2. 确保库文件存在于/lib/usr/lib目录下。
  3. 使用ldconfig命令更新库缓存。
  4. 如果库文件在其他目录,可以在/etc/ld.so.conf中添加路径,然后运行ldconfig

示例代码

假设你有一个程序myapp依赖于一个共享库libmylib.so,但系统找不到这个库:

代码语言:txt
复制
# 检查LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH

# 如果没有包含库路径,可以临时设置
export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH

# 或者永久设置(编辑~/.bashrc或/etc/profile)
echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 更新库缓存
sudo ldconfig

参考链接

通过以上信息,你应该能够理解Linux共享库的基本概念、优势、类型、应用场景以及如何解决常见的加载问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux 动态库加载_linux默认动态库加载路径

当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不到动态库...假设我们使用tensorflow,把需要调用的libtensorflow.so和libtensorflow_framework.so两个动态库放在我们和我们的程序同一级目录下。...library version %s\n”, TF_Version()); return 0; } 程序编译及结果如下: 可见程序编译没有问题,但是当执行可执行程序时,出现如下结果: 程序提示加载动态库失败...解决办法,使用-Wl,-rpath 所需动态库的路径 告诉程序如果在默认路径下找不到所需动态库,则去当前指定的路径下找动态库。...修改gcc编译指令后,结果如下: 可见,动态库加载成功,程序运行成功,问题解决。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

11.8K20

android 加载so过程分析

在实现android插件化过程中,在插件代码中加载so时出现了一些问题,因此特地研究了一下android系统中加载so的过程,记录下来,整理成文。...的真正的文件路径;2:调用nativeLoad函数去实现真正的so加载;这里会牵扯到一个问题,如何通过so的名称去ClassLoader拿到so真正的文件路径?...文件,而DexClassLoader可以加载任意路径的apk/jar文件(此文件路径需要可执行权限),两者间的具体差别请参考developer.android.com。...so的文件路径的,因此我们也需要关注mLibPaths中搜索目录的顺序。...so(findSharedLibEntry),如果已经加载过了,那么直接返回即可;如果没有加载,那么重新加载一遍,加载的过程可以用下面的流程来描述:调用dlopen() 打开一个so文件,取得该so的文件句柄

1.3K21
  • LiteAVSDK集成,动态加载so库

    二、动态加载so 随着项目业务越来越多,对APK 体积大小要求尽可能的瘦身,通常可以考虑采用在线加载的方式减少最终 apk 安装包的大小。...之后,SDK 会到这些路径下加载需要的 so 文件并启动相关功能。 二、示例demo 1、工具类的写法。 下载、解压、校验完整性的过程,由客户自己灵活完成,demo就不给出演示了。...image.png 1、这三个so库必需要在本地加载。 image.png 2、这些so库需要按照如下顺序动态加载。...解决办法就是:先把一个32位的so文件打进安装包,其它so库在运行时动态加载,这样App启动的是32位进程,动态加载的so库也是32位版本,运行时就不再闪退。...五、资源 相关文章: LiteAVSDK商业版6.6+,安卓集成动态加载so 动态加载so库的实现方法与问题处理 Android 的 so 文件加载机制提问源码总结参考资料 demo下载

    8.7K3510

    Linker加载so失败问题分析

    唯一可能的问题,就是先加载了旧的so,之后下载新的so进行了热更新。 我们先看下微视中是否有这种现象。要观察这种现象,我们可以打开linker自身的调试开关,开启so加载的日志。...那么,我们重新复现问题,可以看到如下so加载过程: ? 这个过程表明:旧的so先被加载了,然后下载了新版本的so,并进行了替换。 这个过程有什么问题呢?...我们在回去看看微视的代码,这里下载了so之后直接unzip到原来的路径,并没有先进行rm操作。...正常加载so然后执行native方法都是ok的,使用rm+mv替换或者adb push替换也都是ok的,最后再按照错误的方法操作,步骤为: 1. 启动app,点击加载so; 2. ...如果so有升级,先不加载旧的so,等新的so下载完成之后再加载; 2. 可以先加载旧的so,但是下载了新的so之后,要删除旧的so,再进行替换。

    1.8K20

    Tinker源码分析(五):加载so补丁流程

    本系列 Tinker 源码解析基于 Tinker v1.9.12 校验so补丁流程 与加载资源补丁类似,加载so补丁也要先从校验开始看起。...中获取到的 so 补丁文件路径是否真的存在并且 so 文件是可读的 //fast check whether there is any dex files missing for (String relative...so补丁流程 加载so补丁的入口:TinkerLoadLibrary.loadArmLibrary / TinkerLoadLibrary.loadArmV7Library ,区别就是前者用来加载 armeabi...如果匹配上了,就说明要加载的就是这个 so 文件,调用 System.load ,传入文件路径即可。...; 如果 classloader 中已经有 so 补丁文件夹的路径了,就先删除,再进行注入; 具体 hook 的代码根据 SDK 版本而定,这里就不展开讲了。

    1.6K30

    Java 动态加载 so 的解决方案

    业务场景有对so实现动态加载/替换的需求,但Java并没有直接动态加载so的机制。本文将深度剖析Java加载so的实现机制,并提出一套Java动态加载so的方案。...这里动态加载so,是指当前so提供服务的时候,需要动态加载另一个同名so,并对旧的so进行替换,而不影响现有服务。...跟进os::dll_load(),有三个不同实现分别对应三个平台os_linux, os_windows, os_solaris,这里只看os_linux.cpp // ... void * os::dll_load...到这里恍然,dlopen(filename, RTLD_LAZY)即是linux下Java System.load的最终实现,其实跟C++加载动态链接库是一样的。...调用libproxy.so的reload方法,并将该so对应的key及路径传入; libproxy.so完成dlopen及dlsym之后,会将新的句柄,函数等存入map,后面所有的请求都会被指向新的so

    8.9K20

    linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。.../e&连续执行两次,那么初始化函数和解析函数也会执行两次,虽然系统只加载了一次libs.so。 如果sleep时候kill 掉后台进程,那么解析函数不会被执行。.../ts 关键就在LD_PRELOAD上了,这个路径指定的so将在所有的so之前加载,并且符号会覆盖后面加载的so文件中的符号。如果可执行文件的权限不合适(SID),这个变量会被忽略。 执行:.

    5.8K20

    Android So动态加载 优雅实现与原理分析

    apk 安装目录下; System.load(String pathName) :参数为 so 库在磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so加载成功、...但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。 在应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一....反射修改so文件映射列表(关键:把自定义的native库path插入native数组最前面,即使安装包libs目录里面有同名的so,也优先加载指定路径的外部so。) 四....,也优先加载指定路径的外部so */ private static final class V25 { private static void install(ClassLoader...; 当ClassLoader不存在的时候通过getLibPaths()查找加载路径。

    6.1K64

    Android So动态加载 优雅实现与原理分析

    ,最后复制到 apk 安装目录下; System.load(String pathName) :参数为 so 库在磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so...但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。 在应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一....反射修改so文件映射列表(关键:把自定义的native库path插入native数组最前面,即使安装包libs目录里面有同名的so,也优先加载指定路径的外部so。) 四....,也优先加载指定路径的外部so */ private static final class V25 { private static void install(ClassLoader...; 当ClassLoader不存在的时候通过getLibPaths()查找加载路径。

    2K20
    领券