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

linux so依赖so

在Linux系统中,.so文件是共享对象(Shared Object)文件的缩写,类似于Windows系统中的.dll文件。共享对象文件通常包含可由多个程序同时使用的代码和数据。当一个程序需要使用某个库的功能时,它并不需要将整个库复制到自己的可执行文件中,而是可以通过加载共享对象文件(.so文件)来访问所需的功能,这种方式可以节省内存和磁盘空间。

基础概念

  • 动态链接:程序在运行时才加载所需的库文件,而不是在编译时就确定。
  • 静态链接:程序在编译时就加载了所需的库文件,生成的可执行文件会包含所有必要的代码。

优势

  1. 节省资源:多个程序可以共享同一个.so文件,减少内存占用和磁盘空间。
  2. 易于更新:库文件的更新不会影响已经编译好的程序,只需替换.so文件即可。
  3. 模块化:程序可以按需加载不同的库,提高灵活性。

类型

  • 系统库:如libc.so,提供基本的C语言运行时功能。
  • 第三方库:如libpng.so,提供特定功能,如图像处理。
  • 自定义库:开发者自己编写的库文件。

应用场景

  • 插件系统:程序可以通过加载不同的.so文件来实现插件功能。
  • 模块化设计:大型项目中,不同模块可以编译成独立的.so文件,便于管理和维护。
  • 跨平台开发:通过共享库,可以更容易地在不同平台上复用代码。

常见问题及解决方法

1. 找不到依赖的.so文件

现象:运行程序时出现error while loading shared libraries: libxxx.so.x: cannot open shared object file: No such file or directory

原因:系统中缺少所需的.so文件,或者库文件的路径没有包含在LD_LIBRARY_PATH环境变量中。

解决方法

  • 安装缺少的库文件,例如使用包管理器:
  • 安装缺少的库文件,例如使用包管理器:
  • 将库文件路径添加到LD_LIBRARY_PATH环境变量中:
  • 将库文件路径添加到LD_LIBRARY_PATH环境变量中:
  • 更新系统的库缓存:
  • 更新系统的库缓存:

2. 版本冲突

现象:程序运行时出现版本不兼容的错误。

原因:系统中存在多个版本的.so文件,程序加载了错误的版本。

解决方法

  • 确保程序链接的是正确版本的库文件。
  • 使用ldd命令查看程序依赖的库文件及其路径:
  • 使用ldd命令查看程序依赖的库文件及其路径:
  • 如果需要,可以创建符号链接或复制正确版本的库文件到程序期望的路径。

3. 性能问题

现象:程序启动慢或运行时性能下降。

原因:动态链接可能导致额外的开销,特别是在频繁加载和卸载库文件的情况下。

解决方法

  • 对于性能关键的应用,可以考虑使用静态链接。
  • 优化库文件的加载顺序,减少不必要的库文件加载。

示例代码

假设有一个简单的C程序main.c,它依赖于一个自定义库libexample.so

main.c

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

int main() {
    printf("Calling example_function...\n");
    example_function();
    return 0;
}

example.h

代码语言:txt
复制
void example_function();

example.c

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

void example_function() {
    printf("Hello from example_function!\n");
}

编译共享库:

代码语言:txt
复制
gcc -fPIC -c example.c -o example.o
gcc -shared -o libexample.so example.o

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

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

运行程序时,需要指定库文件路径:

代码语言:txt
复制
export LD_LIBRARY_PATH=.
./main

通过这种方式,可以确保程序正确加载所需的共享库文件。

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

相关·内容

  • linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...———————————————————————- 链接:得到输出文件libs.so gcc -g -shared -Wl,-soname,libs.so -o libs.so libs.o -lc...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。

    5.8K20

    【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )

    文章目录 一、Android 虚拟机涉及的 libdvm.so 动态库 和 libart.so 动态库 二、Android 运行时相关 libandroid_runtime.so 动态库 三、Android...Framework 层 Native 实现相关 libandroidfw.so 动态库 一、Android 虚拟机涉及的 libdvm.so 动态库 和 libart.so 动态库 ---- libdvm.so...; 执行 cp /system/lib/libart.so /sdcard/Pictures 命令 , 将 libart.so 动态库拷贝到 /sdcard/Pictures 目录 , 之后可以将其拷贝到文件系统..., 使用 64 位 IDA 分析该动态库 ; 二、Android 运行时相关 libandroid_runtime.so 动态库 ---- libandroid_runtime.so 是 Android...层的 Native 实现部分的动态库 , 执行 cp /system/lib/libandroidfw.so /sdcard/Pictures 命令 , 将 libandroidfw.so 动态库拷贝到

    3K20

    反编译so库破解so

    所以想破解so,将对i2c num 的大小改大点。...from=sec (2)实战预热 https://blog.csdn.net/m0_37766442/article/details/72903385 一、反编译so 使用IDA打开so 根据log信息或猜测查找需要破解的大致位置...我们看到上方有一个 loc_82036,这代表一段代码的标签处,类似C里面goto 的标签,那肯定其他地方会向这个标签做跳转 选中这个标签,右击 点击红框选项,就会列出所有向此处跳转的地方,这个so,...点中CMP R0,#6的地址处,然后切换到HEX View Hex VIEW 可以切换数据格式,64位so用4字节格式,32位so用2字节格式 我们需要将CMP R0,#6 改成CMP R0,#8...,跳转到这一地址 我们将06改成08保存 替换so,不再打印那个错误log,读正常了,但是写还有问题,同样的方法修改I2C写操作里的值,问题解决 发布者:全栈程序员栈长,转载请注明出处:https:

    4.7K30

    什么是.so文件_安卓so文件作用

    so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据 linux下何谓.so文件: 用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟....dll文件差不多 一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。...与Java比较就是:它通常是用的Class文件(字节码) Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库 那么.so文件是怎么用的呢?...for example:  (1) 动态库的编译 这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so...-ltest -o test 注:测试是否动态连接,如果列出libtest.so,那么应该是连接正常了  -L.

    3.6K30

    so文件在线加固加密_安卓so文件解密

    大家好,又见面了,我是你们的朋友全栈君 这篇是一系列的关于SO文件保护的自我理解,SO文件保护分为加固,混淆以及最近炒的比较火的虚拟机...加固就是将真正的so代码保护起来,不让攻击者那么轻易的发现,至于混淆,由于ART机制的介入,使得O-LLVM越来越火,这以后有机会再分析,这次主要是基于有源码的so文件保护,下次介绍无源码的so文件保护...} _error: fclose(fp); return ret; } 在这里重点解释这个解密函数: 首先看到的是getLibAddr()这个函数:在介绍这个函数之前首先了解一个内存映射问题: 和Linux...ok,以上编写完以后就编译生成.so文件。...2.对得到的.so文件进行加密:这一块也是一个重点,大致上逻辑我们可以这么认为:先找到那个我们自己所定义的节,然后找到对应的offset和size,最后进行加密,加密完以后重新的写到另一个新的.so文件中

    3.1K40

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

    文章目录 一、拷贝并分析 Android 中的 /system/lib/libc.so 动态库 二、拷贝并分析 Android 中的 /system/lib/libc++.so 动态库 三、拷贝并分析...Android 中的 /system/lib/libstdc++.so 动态库 总结 一、拷贝并分析 Android 中的 /system/lib/libc.so 动态库 ---- /system/lib.../libc.so 是 C 函数标准库 ; 执行 cp /system/lib/libc.so /sdcard/Pictures 命令 , 将 libc.so 拷贝到手机的 SD 卡中 , 从 SD 卡可以将该动态库拷贝到...Windows 文件中 ; 使用 64 位的 IDA 打开上述动态库 ; libc.so 中有以下几个导入库 , dlopen , dlerror , dlclose ; 加载 libc.so 库之前.../libc++.so 动态库 和 /system/lib/libstdc++.so 动态库 都依赖于 libc.so 动态库 ;

    2.6K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券