0


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

前言

在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 签约作者,欢迎关注我分享更多干货!
😄

标签: linux 动态库 so

本文转载自: https://blog.csdn.net/liuzehn/article/details/130454677
版权归原作者 Data-Mining 所有, 如有侵权,请联系我们删除。

“分析linux中动态库so文件的常用方法”的评论:

还没有评论