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

linux动态加载so

基础概念

Linux 动态加载(Dynamic Loading)是指在程序运行时动态地加载共享库(Shared Libraries),而不是在编译时静态链接。共享库通常以 .so 文件结尾,代表 Shared Object。动态加载允许程序在运行时根据需要加载特定的库,从而提高程序的灵活性和可维护性。

优势

  1. 节省内存:多个程序可以共享同一个共享库的内存副本,减少内存占用。
  2. 更新方便:可以在不重新编译程序的情况下更新共享库,提高软件的维护性和升级效率。
  3. 模块化设计:程序可以按需加载不同的模块,便于功能扩展和代码复用。

类型

  1. 静态链接:在编译时将所有依赖库链接到可执行文件中。
  2. 动态链接:在运行时通过动态加载器(如 ld-linux.so)加载共享库。

应用场景

  1. 插件系统:允许程序在运行时加载和卸载插件,如 Web 服务器的插件系统。
  2. 跨平台兼容性:通过动态加载不同平台的库,实现跨平台兼容。
  3. 性能优化:根据需要加载特定的库,避免不必要的资源占用。

常见问题及解决方法

问题:找不到共享库

原因:可能是库文件不存在,或者库文件的路径没有正确配置。

解决方法

  1. 确保库文件存在,并且路径正确。
  2. 将库文件路径添加到 /etc/ld.so.conf 文件中,然后运行 ldconfig 命令更新库缓存。
代码语言:txt
复制
sudo echo "/path/to/library" >> /etc/ld.so.conf
sudo ldconfig
  1. 使用 LD_LIBRARY_PATH 环境变量指定库路径。
代码语言:txt
复制
export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH

问题:版本冲突

原因:不同版本的共享库可能存在冲突,导致程序无法正常运行。

解决方法

  1. 确保系统中只安装了一个版本的共享库。
  2. 使用 ldd 命令检查程序依赖的库版本。
代码语言:txt
复制
ldd your_program
  1. 如果需要使用特定版本的库,可以手动指定库路径或使用版本管理工具(如 patchelf)修改程序的库依赖。

示例代码

以下是一个简单的示例,展示如何在 C 程序中动态加载共享库:

代码语言:txt
复制
#include <stdio.h>
#include <dlfcn.h>

int main() {
    void *handle;
    char *(*say_hello)(void);

    // 动态加载共享库
    handle = dlopen("./libhello.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }

    // 获取共享库中的函数
    say_hello = dlsym(handle, "say_hello");
    const char *dlsym_error = dlerror();
    if (dlsym_error) {
        fprintf(stderr, "%s\n", dlsym_error);
        dlclose(handle);
        return 1;
    }

    // 调用共享库中的函数
    printf("%s\n", say_hello());

    // 关闭共享库
    dlclose(handle);
    return 0;
}

对应的共享库代码(libhello.c):

代码语言:txt
复制
#include <stdio.h>

char *say_hello() {
    return "Hello, World!";
}

编译共享库:

代码语言:txt
复制
gcc -shared -o libhello.so libhello.c

编译主程序并链接共享库:

代码语言:txt
复制
gcc -o main main.c -ldl

运行程序:

代码语言:txt
复制
./main

参考链接

希望这些信息对你有所帮助!

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

相关·内容

LiteAVSDK集成,动态加载so库

二、动态加载so 随着项目业务越来越多,对APK 体积大小要求尽可能的瘦身,通常可以考虑采用在线加载的方式减少最终 apk 安装包的大小。...image.png 1、这三个so库必需要在本地加载。 image.png 2、这些so库需要按照如下顺序动态加载。...//sdk接口动态加载so TXLiveBase.setLibraryPath(newFilePath); //系统接口动态加载so loadLibrary(newFilePath, "YTCommon...解决办法就是:先把一个32位的so文件打进安装包,其它so库在运行时动态加载,这样App启动的是32位进程,动态加载的so库也是32位版本,运行时就不再闪退。...五、资源 相关文章: LiteAVSDK商业版6.6+,安卓集成动态加载so 动态加载so库的实现方法与问题处理 Android 的 so 文件加载机制提问源码总结参考资料 demo下载

8.7K3510
  • 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库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载....在 Android 开发中调用动态链接库文件*.so都是通过 jni 的加载方式,一般的开发方式往往是在 apk 或 jar 包中调用so文件时,都要将对应 so 文件打包进 apk 或 jar 包。...如果项目native库很多,还支持各种平台,为了减少apk size,so库动态下发,按需加载是不错的选择。比如x86库服务器下发,动态加载,瘦身效果将非常可观。...的加载流程 So热修复技术介绍及如何动态加载So 这里先做下准备工作 Android源码在线浏览:http://androidxref.com Android源码下载:https://source.android.com...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,起始还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件.

    6.1K64

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

    背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载....在 Android 开发中调用动态链接库文件*.so都是通过 jni 的加载方式,一般的开发方式往往是在 apk 或 jar 包中调用so文件时,都要将对应 so 文件打包进 apk 或 jar 包。...如果项目native库很多,还支持各种平台,为了减少apk size,so库动态下发,按需加载是不错的选择。比如x86库服务器下发,动态加载,瘦身效果将非常可观。...的加载流程 So热修复技术介绍及如何动态加载So 这里先做下准备工作 Android源码在线浏览:http://androidxref.com Android源码下载:https://source.android.com...总结: 到此处,那么so文件的动态加载(也可以叫做So文件的热修复)已经介绍完了,其实还是比较简单的,只是修改了so文件列表的数组映射,加载了需要使用的真实的so文件.

    2K20

    Android 开发中如何动态加载 so 库文件

    在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静态加载往往是在 apk 或 jar 包中调用so文件时,都要将对应 so 文件打包进 apk 或 jar 包。...动态加载的优点 静态加载,不灵活,apk 包有可能大。所以采用动态加载 so 库文件,有以下几点好处: 灵活,so 文件可以动态加载,不是绑定死的,修改方便,so 库有问题,我们可以动态更新。...so 库文件很大的话,采用动态加载可以减少 apk 的包,变小。 其实我们常用第三方 so 库,单个可能没问题,如果多个第三方 so 库文件,同时加载可能会出现冲突,而动态加载就能够解决这一问题。...注意路径陷阱 动态加载 so 库文件,并不是说可以把文件随便存放到某个 sdcard 文件目录下,这样做既不安全,系统也加载不了。...那基本思路如下: 网络下载 so 文件到指定目录 从指定下载的目录复制 copy so文件到可动态加载的文件目录下,比如:/data/data/packagename/… 配置 gradle ,指定 cpu

    5.2K101

    【Android 逆向】Android 中常用的 so 动态库 ( systemliblibc.so 动态库 | libc++.so 动态库 | libstdc++.so 动态库 )

    Windows 文件中 ; 使用 64 位的 IDA 打开上述动态库 ; libc.so 中有以下几个导入库 , dlopen , dlerror , dlclose ; 加载 libc.so 库之前..., 要先加载 /system/bin/linker 库 , 这是 so 动态库的加载模块 , 该动态库中 , 主要是实现了 dlopen 方法 ; 二、拷贝并分析 Android 中的 /system.../lib/libc++.so 动态库 ---- /system/lib/libc++.so 动态库是 C++ 程序中使用的动态库 ; 使用下面的命令拷贝该动态库 ; cp /system/lib/libc...lib/libstdc++.so 动态库 ---- /system/lib/libstdc++.so 动态库是 C++ 程序中使用的动态库 ; 使用下面的命令拷贝该动态库 ; cp /system/lib.../libc++.so 动态库 和 /system/lib/libstdc++.so 动态库 都依赖于 libc.so 动态库 ;

    2.6K30

    LiteAVSDK商业版6.6+,安卓集成动态加载so

    一、简介 本篇文章主要介绍集成LiteAVSDK商业版、6.6以上的版本,安卓端采用动态加载so的方式时的写法。 安卓端非商业版aar集成、jar集成,可以参考官方集成文档 。...6.6之前的商业版,如何动态加载so,请参考上一篇文章《LiteAVSDK集成,动态加载so库》。...6.6版本前后动态加载so的差异: 版本 部分so必需在本地 P图的so必需按顺序加载 assets资源文件可否动态加载 6.5- Y Y N 6.6+ N N Y 二、动态加载so 1、下载sdk...点击setLibraryPath条目,调用sdk接口动态加载so。 点击setLicence条目,设置动效Licence。这一步会下载校验licence,请保持网络通畅、给读写权限。..."*/x86/libYTCommon.so" doNotStrip "*/arm64-v8a/libYTCommon.so" } //so没有加载成功,运行会报这个crash,请校验so完整性

    3.5K96

    android 加载so过程分析

    在实现android插件化过程中,在插件代码中加载so时出现了一些问题,因此特地研究了一下android系统中加载so的过程,记录下来,整理成文。...在android系统中,加载so一般会调用System.loadLibrary(name)或者是System.load(path),这两个函数都可以用来加载so文件,区别在于System.loadLibrary...这两个函数本质上都是一样的,只是搜索so的搜索目录略有差别。下面以System.loadLibrary函数为例来分析加载so的实现原理。...的真正的文件路径;2:调用nativeLoad函数去实现真正的so加载;这里会牵扯到一个问题,如何通过so的名称去ClassLoader拿到so真正的文件路径?...so(findSharedLibEntry),如果已经加载过了,那么直接返回即可;如果没有加载,那么重新加载一遍,加载的过程可以用下面的流程来描述:调用dlopen() 打开一个so文件,取得该so的文件句柄

    1.2K21

    Android so 加载原理分析

    会先以一个Linux的例子描述native层加载动态链接库的过程, 再从Java层由浅入深分析System.loadLibrary 首先我们知道在Android(Java)中加载一个动态链接库非常简单...# Linux 系统加载动态库过程分析 Android是基于Linux系统的,那么在Linux系统下是如何加载动态链接库的呢?...可以通过下述命令可以查看上述函数的具体使用方法: man dlopen 如何在Linux环境下生成动态链接库,如何加载并使用动态链接库中的函数?...上面就是Linux环境下创建动态库,加载并使用动态库的全部过程。 由于Android基于Linux系统,所以我们有理由猜测Android系统底层也是通过这种方式加载并使用动态库的。...我们一般使用JNI_VERSION_1_4即可 Android动态库的加载与Linux一致使用dlopen系列函数,通过动态库的句柄和函数名称来调用动态库的函数

    8K31

    Linux下动态库(.so)和静态库(.a) 的区别

    静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。....6 => /lib/libc.so.6 (0xb7ce3000)         /lib/ld-linux.so.2 (0xb7f1b000) 二: 动态库 这类库的名字一般是libxxx.so...)         libc.so.6 => /lib/libc.so.6 (0xb7cd8000)         /lib/ld-linux.so.2 (0xb7f12000) 在上例中,动态库...例如将libd2.so换成libd.so 显式调用动态库 显式调用动态库,编译时无需库文件,执行时动态可存储于任意位置,库里共享对象必须先申请后使用,不同动态库版本,只要其共享对象接口相同,就可以直接动态加载...总结: 编译静态库时先使用-c选项,再利用ar工具产生.编译动态库的方式依不同版本的UNXI而定。隐式调用动态库与静态库的用法相一致,而显示调用动态库则需要借助动态加载共享库函数族。

    17.3K21

    Linux静态库与动态库加载

    在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。 在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。 认识了动态库,那静态库,又是什么呢?...注意上面我打包了两个库,虽然看后缀一个静态库,一个动态库,但是其实上述的库都是静态库,linux不是单单通过后缀来判断一个库的类型,下面就来看看如何真正打包一个动态库吧。...gcc -fPIC -c test2.c test3.c -fPIC作用于编译阶段,告诉编译器产生与位置无关的代码,此时产生的代码中没有绝对地址,全部都使用相对地址,从而代码可以被加载器加载到内存的任意位置都可以正确的执行...这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。  ...gcc -shared -o libmyc.so test2.o test3.o  像之前一样将头文件和动态库组合进一个文件夹: 该动态库和刚才的静态库使用方法一样: gcc main.c -o a.out

    18410

    【Android 逆向】Android 中常用的 so 动态库 ( libm.so 数学函数动态库 | liblog.so 日志模块动态库 | libselinux.so 安全模块动态库 )

    文章目录 一、libm.so 数学函数动态库 二、liblog.so 日志模块动态库 三、libselinux.so 安全模块动态库 一、libm.so 数学函数动态库 ---- libm.so 是数学相关函数库..., 该动态库是 libc.so 动态库的依赖库 , 是最基础的函数库 ; 执行 cp /system/lib/libm.so /sdcard/Pictures 命令 , 将 libm.so 动态库拷贝到...对数函数 , 等 ; 二、liblog.so 日志模块动态库 ---- liblog.so 是日志模块的动态库 , 所有的日志打印 , 都使用的这个库 ; 执行 cp /system/lib/liblog.so.../sdcard/Pictures 命令 , 将 liblog.so 动态库拷贝到 /sdcard/Pictures 目录 , 之后可以将其拷贝到文件系统 ; 三、libselinux.so 安全模块动态库...---- libselinux.so 是安全模块的动态库 ; 执行 cp /system/lib/libselinux.so /sdcard/Pictures 命令 , 将 libselinux.so

    1.3K10
    领券