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

linux 调试动态库so

基础概念

Linux 动态库(.so 文件)是一种共享库,它包含可由多个程序同时使用的代码和数据。动态库在程序运行时被加载到内存中,而不是在程序编译时被静态链接。这样可以节省内存空间,并允许多个程序共享相同的库代码。

相关优势

  1. 节省内存:多个程序可以共享同一个动态库的内存副本。
  2. 更新方便:更新动态库不需要重新编译所有依赖它的程序。
  3. 减少文件大小:程序本身不需要包含库代码,因此文件大小更小。

类型

Linux 动态库主要有两种类型:

  1. 普通动态库:以 .so 结尾,例如 libexample.so
  2. 位置无关代码动态库:以 libexample.so.x.y.z 结尾,其中 x.y.z 是版本号。

应用场景

动态库广泛应用于各种需要共享代码的场景,例如:

  • 系统库:如 libc.so 提供基本的系统调用和函数。
  • 第三方库:如 libssl.so 提供 SSL/TLS 支持。
  • 自定义库:开发者自己编写的库,用于多个程序之间共享功能。

调试动态库

调试动态库时,可能会遇到以下问题:

  1. 找不到动态库:程序运行时提示找不到某个 .so 文件。
  2. 版本冲突:不同版本的动态库导致程序行为异常。
  3. 符号未定义:动态库中的某些符号在链接时未定义。

问题:找不到动态库

原因:可能是动态库路径未正确配置,或者库文件未安装。

解决方法

  1. 检查库路径
  2. 检查库路径
  3. 安装缺失的库
  4. 安装缺失的库

问题:版本冲突

原因:不同程序依赖不同版本的同一动态库。

解决方法

  1. 使用 ldd 检查依赖
  2. 使用 ldd 检查依赖
  3. 使用 patchelf 修改库路径
  4. 使用 patchelf 修改库路径

问题:符号未定义

原因:动态库中的某些符号在链接时未定义。

解决方法

  1. 检查库文件
  2. 检查库文件
  3. 确保所有依赖库都已安装
  4. 确保所有依赖库都已安装

示例代码

假设有一个简单的动态库 libexample.so 和一个使用该库的程序 main.c

libexample.c

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

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

编译动态库:

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

main.c

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

extern void hello();

int main() {
    hello();
    return 0;
}

编译并链接程序:

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

运行程序:

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

参考链接

通过以上步骤和示例代码,你可以更好地理解和调试 Linux 动态库。

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

相关·内容

  • linux编译curl库的动态库so

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  curl库是一个很强大的http开源库,c++里面能够很方便的和http服务器交互。...最近项目开始内测,开始接登录和充值的SDK,选择了使用curl库来和第三方http服务器交互。...在windows下还是很容易使用,如何使用的案例比比皆是,而且很容易就找到已经编译好的动态库进行测试,但是最后在linux下部署的时候,发现不好找已经编译好的so库文件,最后没办法只好自理更生。...我是使用腾讯的SDK里面附带的curl库的源码(ps,腾讯SDK的示例代码貌似没在linux测试过,我编译后使用他们的代码,发现很容易崩溃,需要修改才能运行,但是windows正常)。...包含了编译生产的库、头文件等。 然后为了能够方便的移植我们的程序,把include/lib下面的头文件和so库文件拷贝到自己的工程目录就能使用curl库了。

    6.5K10

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

    文章目录 一、拷贝并分析 Android 中的 /system/lib/libc.so 动态库 二、拷贝并分析 Android 中的 /system/lib/libc++.so 动态库 三、拷贝并分析.../lib/libc++.so 动态库 ---- /system/lib/libc++.so 动态库是 C++ 程序中使用的动态库 ; 使用下面的命令拷贝该动态库 ; cp /system/lib/libc...lib/libstdc++.so 动态库 ---- /system/lib/libstdc++.so 动态库是 C++ 程序中使用的动态库 ; 使用下面的命令拷贝该动态库 ; cp /system/lib...该动态库的内部实际上使用 malloc 实现 , malloc 来自于 libc.so 动态库 ; 总结 /system/lib/libc.so 动态库是被引用最多的函数库 , /system/lib.../libc++.so 动态库 和 /system/lib/libstdc++.so 动态库 都依赖于 libc.so 动态库 ;

    2.6K30

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

    linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。....6 => /lib/libc.so.6 (0xb7ce3000)         /lib/ld-linux.so.2 (0xb7f1b000) 二: 动态库 这类库的名字一般是libxxx.so.../libd.so (或者g++ -o dOut main.cpp -L./ -ld) hc@linux-v07j:~/weiming/tt/dd> ldd dOut         linux-gate.so...)         libc.so.6 => /lib/libc.so.6 (0xb7cd8000)         /lib/ld-linux.so.2 (0xb7f12000) 在上例中,动态库...例如将libd2.so换成libd.so 显式调用动态库 显式调用动态库,编译时无需库文件,执行时动态可存储于任意位置,库里共享对象必须先申请后使用,不同动态库版本,只要其共享对象接口相同,就可以直接动态加载

    17.3K21

    【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

    零基础学习IDA动态调试so

    零基础学习IDA动态调试so 最近在学少月老师的移动安全课程,受益颇深,终于会使用IDA动态调试了,感谢少月老师~~~~ 0x01 准备工作 需要调试的apk、ida、android_server导入机器里面...先把调试的as上传 adb push d:\android_server /data/local/tmp/android_server 增加权限 cd /data/local/tmp chmod.../android_server 0x02 安装软件 安装apk,运行一下看效果【目标显示255,而不是100】 打开ida【32位】调试so 选择目标真机的ip,出现了目标进程,搜索目标报名GG 选中我们要调试的包名...下面这样是成功的 进入调试界面,选中模块界面 CTRL+f选中要调试的so 点进来,发现一个getcoin 不知道怎么回事~~要等一会在双击 选中断点 点击按钮,或者F9 这边在点开apk【...有时候断不下来需要退出重新点开】,由红变蓝色就下段成功 此时手机在调试,卡住 按一下F8 此时在右边小窗口看到R0的值 这个时候按一下F5可以看到数值 此时在寄存器窗口右键,修改数值【选中R0】 修改成

    1.9K50

    LiteAVSDK集成,动态加载so库

    各个 so 库的具体作用,可以阅读 库说明。...如果是集成的商业版SDK,比如移动直播5.4商业版(LiteAVSDK_Enterprise_Android_5.4.6097),解压sdk包,会发现多了一些jar、so库,而这些so库的动态加载方式,...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

    c#封装动态库_nginx调用so动态库

    库一般分为两种:静态库(.a 、.lib)动态库(.so 、.dll )所谓静态、动态是指链接过程。 3、静态库与动态库 区别: (1)lib是编译时用到的,dll是运行时用到的。...使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。...特点: 1)代码共享,所有引用该动态库的可执行目标文件共享一份相同的代码与数据。 2)程序升级方便,应用程序不需要重新链接新版本的动态库来升级,理论上只要简单地将旧的目标文件覆盖掉。...3)在运行时可以动态地选择加载各种应用程序模块 下面重点介绍Windows下动态链接库DLL. DLL即动态链接库(Dynamic-Link Libaray)的缩写,相当于Linux下的共享对象。...(1)导出与导入 在ELF(Linux下动态库的格式),共享库中所有的全局函数和变量在默认情况下都可以被其他模块使用,即ELF默认导出所有的全局符号。

    2.8K20

    Android安全-SO动态库注入

    Android是基于Linux内核的操作系统,而在Linux下SO注入基本是基于调试API函数ptrace实现的,同样Android的SO注入也是基于ptrace函数,要完成注入还需获取root权限。...0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入; (注:实际上,0x06和0x07并不属于SO动态库注入的步骤,然而仅仅注入是完全没有意义的,通常我们需要执行...和目标进程dlopen函数所在动态库的基地址remote_module_base,接着获取本进程dlopen函数的绝对地址local_addr = (void*)dlopen。...0x08 恢复目标进程的堆栈,恢复目标进程寄存器值,解除关联,完成SO动态库注入: 调用ptrace_writedata(pid, (uint8_t *)saved_regs.ARM_sp...动态库注入。

    2.6K20

    Linux动态链接库.so文件的创建与使用

    对于Linux系统,这个loader的名字是/lib/ld-linux.so.X(X是版本号)。这个loader启动后,反过来就会load所有的其他本程序要使用的共享函数库。...这个是很有用的,特别是在调试一个新的函数库的时候,或者在特殊的场合使用一个非标准的函数库的时候。...虽然使用了这个参数获得的函数库仍然可以使用,但是这使得调试程序几乎没有用,无法跟踪调试。 使用-fPIC来产生代码,而不是-fpic。...)         libc.so.6 => /lib/libc.so.6 (0x40020000)         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (...动态链接库.so文件的创建与使用 Linux动态库(.so)搜索路径 Linux 动态库与静态库制作及使用详解

    9.4K51

    静态库(.a)与动态库(.so)的简明介绍

    静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只要有了一个线索都很容易理解...静态库又叫归档文件,在linux下是*.a后缀的文件,本质上就是目标文件(*.o)的一个集合。...-o libmod.so mod1.o mod2.o 最后使用这个动态库: $ gcc -o resultant main.c libmod.so $ ....动态库的搜索顺序如下 编译目标代码时指定的动态库搜索路径; 环境变量LD_LIBRARY_PATH指定动态库搜索路径,它指定程序动态链接库文件搜索路径;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH...:data/home/billchen/lib 配置文件/etc/ld.so.conf中指定的动态库搜索路径; 默认的动态库搜索路径/lib; 默认的动态库搜索路径/usr/lib。

    1.6K50

    【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 systemlib 中的 Android 系统 so 动态库 )

    文章目录 一、拷贝 /system/lib/ 中的 Android 系统 so 动态库 一、拷贝 /system/lib/ 中的 Android 系统 so 动态库 ---- 将 Android 系统的.../system/lib/libc.so 动态库 , 拷贝到 /sdcard/Pictures/lib/ 目录中 ; 首先 , 在 /sdcard/Pictures/ 目录下创建 lib 目录 ; mkdir.../sdcard/Pictures/lib 然后 , 将 /system/lib/libc.so 动态库 , 拷贝到 /sdcard/Pictures/lib/ 目录中 ; cp /system/lib.../libc.so /sdcard/Pictures/lib/ 拷贝后 , 可以从 SD 卡中 , 将 libc.so 动态库拷贝出来 ; 注意 , 获取动态库后 , 32 位的动态库要使用 32 位的...IDA 打开 , 64 位的动态库使用 64 位的 IDA 打开 ; 在 /system/lib/ 目录下有如下动态库 : walleye:/ # cd /system/lib walleye:/system

    2.1K10
    领券