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

这篇具有很好参考价值的文章主要介绍了分析linux中动态库so文件的常用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

正文

  1. 查看文件属性

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

如何查看so文件内容,linux,linux,动态库,so,符号表,Powered by 金山文档

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

  1. 查看依赖文件

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

如何查看so文件内容,linux,linux,动态库,so,符号表,Powered by 金山文档

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

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

如何查看so文件内容,linux,linux,动态库,so,符号表,Powered by 金山文档
  1. 查看符号表

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

如何查看so文件内容,linux,linux,动态库,so,符号表,Powered by 金山文档
  1. 查看汇编信息

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

objdump -d test.so

输出结果比较多,下面只展示部分结果:文章来源地址https://www.toymoban.com/news/detail-700890.html

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文件的常用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

    最近在学习log4cpp库时,使用g++去编译,却发现自己不会链接...,这哪能行,于是网上钻研,终于解决,现在记录下来分享给遇到同样问题的人。 gcc和g++类似,这里就以g++为例! 刚好用到的log4cpp日志库有头文件和动态库.so和静态库.a,这里就以log4cpp库为例。 在安装好log4cpp库

    2024年02月08日
    浏览(54)
  • Linux查看日志文件的常用命令

    1、查看文件最后1000行内容 tail -n 1000 filename 2、实时查看文件最后1000行内容,动态刷新 tailf -n 1000 filename tail -f -n 1000 filename 3、按照搜索日志 cat filename | grep \\\'\\\' 4、按照搜索并包含前(后)多少行 【(A前B后C前后)几行】 cat filename | grep \\\'\\\' -A 2 5、将查询

    2024年02月07日
    浏览(41)
  • Linux 查看程序(动态库)、进程的依赖库的方法

    当我们在linux上部署自己开发的项目程序时,项目代码与依赖库完整拷贝过去之后,直接运行我们自己的可执行程序,往往提示找不到所相关的.so库,会报错。 系统只会去默认搜寻目录( /lib和/usr/lib )下, 以及动态库配置文件( /etc/ld.so.conf和/etc/ld.so.conf.d/*.conf )里所列的目录下

    2024年02月02日
    浏览(39)
  • 如何查看.dll文件函数接口?(DLL动态链接库)(查看动态链接库、查看接口、查看函数)(Visual Studio的dumpbin工具)(Dependency Walker)

    查看DLL(动态链接库)文件的接口,通常需要使用一些专门的工具。这里有两个比较常见的方法: Dependency Walker 使用Dependency Walker:Dependency Walker是一个免费的实用工具,可以列出DLL文件中的所有导出函数以及它们可能依赖的其他DLL。只需在Dependency Walker中打开想查看的DLL文件

    2024年02月08日
    浏览(53)
  • 53.Linux day03 文件查看命令,vi/vim常用命令

    今天进行了新的学习。 目录 1.cat a.查看单个文件的内容: b.查看多个文件的内容:  c.将多个文件的内容连接并输出到一个新文件: d.显示带有行号的文件内容:  2.more  3.less  4.head 5.tail  6.命令模式 7.插入模式   8.图片解析 用于查看和连接文件内容 以下是 cat 命令的基本

    2024年02月12日
    浏览(37)
  • 【Linux指令④】Linux查看日历、时间、打包压缩文件、Linux中的计算器,常用热键 关机指令

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:Linux入门到精通 🎉代码仓库:小智的代码仓库 【语法】 : date [OPTION] ... [+FORMAT] 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后面结束个标记,其中常用的标记列表如下 %H

    2024年02月05日
    浏览(37)
  • Linux文件权限如何查看

    在 Linux 中,可以使用 ls 命令和 ls -l 命令来查看文件权限。 例如: 第一列(\\\'-rw-r--r--\\\')表示文件的权限。第一个字符(\\\'-\\\')表示该文件是普通文件,如果是目录则为 \\\'d\\\'。接下来三个字符(\\\'rw-\\\')表示文件所有者的权限,再接三个字符(\\\'r--\\\')表示同组用户的权限,最后三个字符(\\\'r--\\\')表示

    2024年02月11日
    浏览(39)
  • Linux下七种文件类型、文件属性及其查看方法

    普通文件类型 Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-] 目录文件 就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx] 块设备文件 块设备文件 : 就是存储数据以供系统存取的

    2024年02月03日
    浏览(88)
  • linux 动态库so相关操作

    1. 查看库版本号 一般在文件名上有版本号,若文件名上没有版本号,使用如下命令查看: readelf -d libstdc++.so  2. 查看库内函数 a) nm -d libstdc++.so | grep 内容 b) objdump -tT  libstdc++.so | grep 内容 c) readelf -s libstdc++.so | grep 内容 3. 查看应用库依赖 ldd -d app 4. 待补充 https://www.cnblogs

    2024年02月15日
    浏览(56)
  • Linux如何查看文件进程占用-lsof

    lsof命令是什么? 可以列出被进程所打开的文件的信息。被打开的文件可以是 1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链接 8.底层的socket字流,网络socket,unix域名socket 9.在linux里面,大部分的东西都是被当做文

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包