前言
在linux系统中,我们经常会遇到各种各样的动态库文件,常见的是.so后缀,那么我们应该如何分析这些文件的用途和作用呢?毕竟我们不能一知半解的“搞事情”。
正文
查看文件属性
首先,我们从整体上了解一下该文件的基础属性,此时可以使用file命令,示例用法如下图所示:
通过执行结果,我们可以知道这是一个32位的动态库文件。
查看依赖文件
一般来说,动态库文件都会依赖其他动态库,具体情况还要看该动态库文件的作用和功能,此时可以使用ldd命令,示例用法如下图所示:
可以看出test.so文件依赖了另外7个文件。
此外,我们可以使用readelf命令实现相同的目的,示例用法如下图所示:
查看符号表
查看so动态库的符号表和导出方法列表,可以使用nm命令,示例用法如下图所示:
查看汇编信息
如果我们需要查看某个方法的汇编实现,可以使用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 签约作者,欢迎关注我分享更多干货! 😄