分析linux中动态库so文件的常用方法

news/2025/2/13 21:35:28/

前言

在linux系统中,我们经常会遇到各种各样的动态库文件,常见的是.so后缀,那么我们应该如何分析这些文件的用途和作用呢?毕竟我们不能一知半解的“搞事情”。

正文

  1. 查看文件属性

首先,我们从整体上了解一下该文件的基础属性,此时可以使用file命令,示例用法如下图所示:

通过执行结果,我们可以知道这是一个32位的动态库文件。

  1. 查看依赖文件

一般来说,动态库文件都会依赖其他动态库,具体情况还要看该动态库文件的作用和功能,此时可以使用ldd命令,示例用法如下图所示:

可以看出test.so文件依赖了另外7个文件。

此外,我们可以使用readelf命令实现相同的目的,示例用法如下图所示:

  1. 查看符号表

查看so动态库的符号表和导出方法列表,可以使用nm命令,示例用法如下图所示:

  1. 查看汇编信息

如果我们需要查看某个方法的汇编实现,可以使用objdump命令,其实它也具有nm命令的能力,示例命令如下:

objdump -d test.so

输出结果比较多,下面只展示部分结果:

00000000000e4150 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc>:
e4150:55 push %rbp
e4151:48 89 f8 mov %rdi,%rax
e4154:49 89 c8 mov %rcx,%r8
e4157:48 8b 3e mov (%rsi),%rdi
e415a:48 89 e5 mov %rsp,%rbp
e415d:49 89 fa mov %rdi,%r10
e4160:49 c1 ea 3c shr $0x3c,%r10
e4164:83 fa 0f cmp $0xf,%edx
e4167:0f 87 83 00 00 00 ja e41f0 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0xa0>
e416d:8d 0c 95 00 00 00 00 lea 0x0(,%rdx,4),%ecx
e4174:41 b9 0f 00 00 00 mov $0xf,%r9d
e417a:49 d3 e1 shl %cl,%r9
e417d:4c 21 cf and %r9,%rdi
e4180:48 d3 ef shr %cl,%rdi
e4183:85 ff test %edi,%edi
e4185:74 22 je e41a9 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x59>
e4187:4d 85 d2 test %r10,%r10
e418a:89 d2 mov %edx,%edx
e418c:0f 84 d6 00 00 00 je e4268 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x118>
e4192:48 c1 e2 05 shl $0x5,%rdx
e4196:48 03 56 08 add 0x8(%rsi),%rdx
e419a:48 8b 0a mov (%rdx),%rcx
e419d:48 8b 52 08 mov 0x8(%rdx),%rdx
e41a1:48 89 4d e0 mov %rcx,-0x20(%rbp)
e41a5:48 89 55 e8 mov %rdx,-0x18(%rbp)
e41a9:89 7d f0 mov %edi,-0x10(%rbp)
e41ac:48 8b 55 e0 mov -0x20(%rbp),%rdx
e41b0:48 89 10 mov %rdx,(%rax)
e41b3:48 8b 55 e8 mov -0x18(%rbp),%rdx
e41b7:48 89 50 08 mov %rdx,0x8(%rax)
e41bb:48 8b 55 f0 mov -0x10(%rbp),%rdx
e41bf:48 89 50 10 mov %rdx,0x10(%rax)
e41c3:48 8b 55 f8 mov -0x8(%rbp),%rdx
e41c7:48 89 50 18 mov %rdx,0x18(%rax)
e41cb:8b 50 10 mov 0x10(%rax),%edx
e41ce:85 d2 test %edx,%edx
e41d0:74 75 je e4247 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0xf7>
e41d2:83 fa 01 cmp $0x1,%edx
e41d5:75 17 jne e41ee <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x9e>
e41d7:48 8b 10 mov (%rax),%rdx
e41da:48 8b 0a mov (%rdx),%rcx
e41dd:48 89 08 mov %rcx,(%rax)
e41e0:48 8b 4a 08 mov 0x8(%rdx),%rcx
e41e4:8b 52 10 mov 0x10(%rdx),%edx
e41e7:48 89 48 08 mov %rcx,0x8(%rax)
e41eb:89 50 10 mov %edx,0x10(%rax)
e41ee:5d pop %rbp
e41ef:c3 retq
e41f0:4d 85 d2 test %r10,%r10
e41f3:74 63 je e4258 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x108>
e41f5:48 8b 7e 08 mov 0x8(%rsi),%rdi
e41f9:be 10 00 00 00 mov $0x10,%esi
e41fe:66 90 xchg %ax,%ax
e4200:89 f1 mov %esi,%ecx
e4202:48 c1 e1 05 shl $0x5,%rcx
e4206:48 01 f9 add %rdi,%rcx
e4209:44 8b 49 10 mov 0x10(%rcx),%r9d
e420d:45 85 c9 test %r9d,%r9d
e4210:74 66 je e4278 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x128>
e4212:83 c6 01 add $0x1,%esi
e4215:39 f2 cmp %esi,%edx
e4217:73 e7 jae e4200 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0xb0>
e4219:89 d2 mov %edx,%edx
e421b:48 c1 e2 05 shl $0x5,%rdx
e421f:48 01 fa add %rdi,%rdx
e4222:48 8b 0a mov (%rdx),%rcx
e4225:48 89 08 mov %rcx,(%rax)
e4228:48 8b 4a 08 mov 0x8(%rdx),%rcx
e422c:48 89 48 08 mov %rcx,0x8(%rax)
e4230:48 8b 4a 10 mov 0x10(%rdx),%rcx
e4234:48 8b 52 18 mov 0x18(%rdx),%rdx
e4238:48 89 48 10 mov %rcx,0x10(%rax)
e423c:48 89 50 18 mov %rdx,0x18(%rax)
e4240:8b 50 10 mov 0x10(%rax),%edx
e4243:85 d2 test %edx,%edx
e4245:75 8b jne e41d2 <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x82>
e4247:48 8d 3d ad 9a 0f 00 lea 0xf9aad(%rip),%rdi # 1ddcfb <_fini+0x63f>
e424e:49 89 38 mov %rdi,(%r8)
e4251:5d pop %rbp
e4252:c3 retq
e4253:0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
e4258:c7 45 f0 00 00 00 00 movl $0x0,-0x10(%rbp)
e425f:e9 48 ff ff ff jmpq e41ac <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x5c>
e4264:0f 1f 40 00 nopl 0x0(%rax)
e4268:48 c1 e2 04 shl $0x4,%rdx
e426c:48 03 56 08 add 0x8(%rsi),%rdx
e4270:e9 25 ff ff ff jmpq e419a <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x4a>
e4275:0f 1f 00 nopl (%rax)
e4278:48 8b 11 mov (%rcx),%rdx
e427b:48 89 10 mov %rdx,(%rax)
e427e:48 8b 51 08 mov 0x8(%rcx),%rdx
e4282:48 89 50 08 mov %rdx,0x8(%rax)
e4286:48 8b 51 10 mov 0x10(%rcx),%rdx
e428a:48 89 50 10 mov %rdx,0x10(%rax)
e428e:48 8b 51 18 mov 0x18(%rcx),%rdx
e4292:48 89 50 18 mov %rdx,0x18(%rax)
e4296:e9 30 ff ff ff jmpq e41cb <_ZN3fmt8internal13FormatterBase10do_get_argEjRPKc+0x7b>
e429b:0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)

00000000000e42a0 <_ZN6spdlog7details7log_msgD1Ev>:
e42a0:55 push %rbp
e42a1:48 89 e5 mov %rsp,%rbp
e42a4:41 55 push %r13
e42a6:41 54 push %r12
e42a8:53 push %rbx
e42a9:48 89 fb mov %rdi,%rbx
e42ac:48 83 ec 08 sub $0x8,%rsp
e42b0:4c 8b 2d e9 a4 35 00 mov 0x35a4e9(%rip),%r13 # 43e7a0 <_ZTVN3fmt17BasicMemoryWriterIcSaIcEEE@@Base+0x9078>
e42b7:4c 8b 25 da a3 35 00 mov 0x35a3da(%rip),%r12 # 43e698 <_ZTVN3fmt8internal12MemoryBufferIcLm500ESaIcEEE@@Base+0x8f98>
e42be:49 8d 45 10 lea 0x10(%r13),%rax
e42c2:48 89 87 48 02 00 00 mov %rax,0x248(%rdi)
e42c9:49 8d 44 24 10 lea 0x10(%r12),%rax
e42ce:48 89 87 58 02 00 00 mov %rax,0x258(%rdi)
e42d5:48 8b bf 60 02 00 00 mov 0x260(%rdi),%rdi
e42dc:48 8d 83 78 02 00 00 lea 0x278(%rbx),%rax
e42e3:48 39 c7 cmp %rax,%rdi
e42e6:74 05 je e42ed <_ZN6spdlog7details7log_msgD1Ev+0x4d>
e42e8:e8 53 01 ff ff callq d4440 <_ZdlPv@plt>
e42ed:49 8d 45 10 lea 0x10(%r13),%rax
e42f1:48 8b 7b 38 mov 0x38(%rbx),%rdi
e42f5:48 83 c3 50 add $0x50,%rbx
e42f9:48 89 43 d0 mov %rax,-0x30(%rbx)
e42fd:49 8d 44 24 10 lea 0x10(%r12),%rax
e4302:48 89 43 e0 mov %rax,-0x20(%rbx)
e4306:48 39 df cmp %rbx,%rdi
e4309:74 15 je e4320 <_ZN6spdlog7details7log_msgD1Ev+0x80>
e430b:48 83 c4 08 add $0x8,%rsp
e430f:5b pop %rbx
e4310:41 5c pop %r12
e4312:41 5d pop %r13
e4314:5d pop %rbp
e4315:e9 26 01 ff ff jmpq d4440 <_ZdlPv@plt>
e431a:66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
e4320:48 83 c4 08 add $0x8,%rsp
e4324:5b pop %rbx
e4325:41 5c pop %r12
e4327:41 5d pop %r13
e4329:5d pop %rbp
e432a:c3 retq
e432b:0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)


作者简介: 😄大家好,我是 Data-Mining(liuzhen007),是一名典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。同时也是 CSDN 博客专家(博客之星)、华为云享专家(共创编辑、十佳博主)、51CTO社区编辑、InfoQ 签约作者,欢迎关注我分享更多干货! 😄

http://www.ppmy.cn/news/59958.html

相关文章

【Unity-UGUI控件全面解析】| Toggle 开关组件详解

🎬【Unity-UGUI控件全面解析】| Toggle 开关组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 监听开关事件五、组件相关扩展使用5.1 配合Toggle Group组使用💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y …

车载搭载SystemUI音频技术,全方位呈现高品质音效

SystemUI概述 SystemUI 是 Android 操作系统中的一个系统服务&#xff0c;主要负责管理和显示系统界面元素&#xff0c;例如状态栏、通知栏、键盘和屏幕截图等。SystemUI 系统服务是系统级别的组件&#xff0c;提供的功能对于用户体验和系统安全性都非常重要。 SystemUI 的主…

DP练习题

1.减操作(ACWING) 若有 a b c d e f g 几个数&#xff0c; 先对位置d操作 变成 a b c d - e f g 再对c操作 变成 a b c - (d-e) f g 仔细分析后得出结论&#xff1a;对于第一个数如a, 它一定为正数&#xff0c;第二个数b,一定为负数&#…

三维数据学习笔记:ply数据内容介绍

目录 前言1. 三维数据的组成1.1 点云数据1.2 网格数据 2. ply数据内容2.1 属性2.1.1 文本描述属性2.1.2 数据描述属性2.1.2.1 顶点(vertex)2.1.2.2 面(face)2.1.2.3 相机(camera) 2.2 数据2.2.1 顶点(vertex)2.2.2 面(face)2.2.3 相机(camera) 3. 示例3.1 示例13.2 示例2 前言 …

MySQL学习笔记第六天

第06章多表查询 5. 7种SQL JOINS的实现 A是员工表&#xff0c;B是部门表。 5.7.1 代码实现 #8. UNION 和 UNION ALL的使用 # UNION&#xff1a;会执行去重操作 # UNION ALL:不会执行去重操作&#xff0c;效率优于前者&#xff0c;开发中优先使用 #结论&#xff1a;如果明确…

oracle 数据库创建表空间、用户、数据库实例、授权、数据导入

在安装完oracle 数据库后默认会创建一个orcl的数据库实例。除了这种方式外还可以通过别的方式创建数据库 一般导入数据通过以下五个步骤 创建导入的数据库实例&#xff0c;已有的话可以忽略创建表空间 2.1 创建临时表空间 2.2 创建数据表空间创建用户给用户授权导入数据库数据…

idea修改 项目代码,浏览器页面不生效 解决方案

使用快捷键ctrl shift delete&#xff0c;清理浏览器缓存 1、问题描述 idea修改前端项目代码&#xff0c;运行谷歌浏览器不起作用。 我也试过 rebuild project, 重启idea&#xff0c;等方法都不管用。 再次运行谷歌浏览器&#xff0c;还是没有变化。 2、尝试了以下方法&am…

java版工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…