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

news2024/9/22 23:23:04

前言

在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.coloradmin.cn/o/480084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase

一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下&#xff0c;每次都会弹出对话框要你输入密码&#xff1a; 这就有点烦&#xff0c;有啥办法可以设置默认方法没&#xff1f;网上找了一圈&#xff0c;通过搜索关键词“passphrase”&#xff0c;找到了一些教程&#x…

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…

探索【Stable-Diffusion WEBUI】的插件:ControlNet 1.1

文章目录 &#xff08;零&#xff09;前言&#xff08;二&#xff09;ControlNet&#xff08;v1.1&#xff09;&#xff08;2.1&#xff09;模型&#xff08;2.2&#xff09;新版界面&#xff08;2.3&#xff09;预处理器 &#xff08;三&#xff09;偷懒 &#xff08;零&#…

机器学习与深度学习——通过决策树算法分类鸢尾花数据集iris求出错误率画出决策树并进行可视化

什么是决策树&#xff1f; 决策树是一种常用的机器学习算法&#xff0c;它可以对数据集进行分类或回归分析。决策树的结构类似于一棵树&#xff0c;由节点和边组成。每个节点代表一个特征或属性&#xff0c;每个边代表一个判断或决策。从根节点开始&#xff0c;根据特征的不同…

list的使用介绍---C++

一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

计算机网络第一章(谢希仁第8版学习)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网&#xff08;因特网&#xff09;的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…

详解c++---list介绍

目录标题 list介绍list定义list遍历list数据插入push_backpush_frontinsert list删除pop_backpop_fronterase list排序list去重list合并list转移list其他函数emptysizefrontbackassignswapresizeclear list排序效率问题 list介绍 list是可以在常数范围内在任意位置进行插入和删…

【Java笔试强训 22】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;小易的升…

【Java笔试强训 21】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 洗牌 &…

免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…

c#笔记-代码格式

格式 为了让编译器能看懂。我们编写的源码必须符合一定的规范。 区分大小写 c#是大小写敏感语言。A1和a1是不同的东西。 不区分空白字符 c#对空白字符&#xff08;空格&#xff0c;制表符&#xff0c;换行&#xff09;不敏感。只要不截断单词&#xff0c;可以任意地使用空…

Java 基础进阶篇(二)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

TiDB实战篇-TiDB集群常用的监控指标

TiDB Server相关指标 Duration(延迟) 总体延迟 SQL不同的类型延迟 不同实例延迟 QPS&#xff08;每秒钟查询次数&#xff09; 总览 CPS&#xff08;一次请求多个sql,上面的QPS每一次就是一个记录&#xff09; 事务相关 延迟 影响性能的大事务 CPU 内存&#xff08;下图…

面试官:谈谈你对死锁的理解

1. 什么是死锁 比如上一次讲到 synchronized 的时候&#xff0c;一个线程&#xff0c;对同一个对象连续加锁两次&#xff0c;如果出现阻塞等待&#xff0c;代表这个锁是不可重入锁&#xff0c;这样的线程&#xff0c;也就称为死锁&#xff01; 一旦程序进入死锁了就会导致线程僵…

PromQL,让你轻松实现监控可视化!快来了解一下吧!

Prometheus 中的一些关键设计&#xff0c;比如注重标准和生态、监控目标动态发现机制、PromQL等。 PromQL 是 Prometheus 的查询语言&#xff0c;使用灵活方便&#xff0c;但很多人不知道如何更好利用它&#xff0c;发挥不出优势。 PromQL主要用于时序数据的查询和二次计算场…

【Docker】4、Docker 数据卷

目录 一、数据卷介绍二、数据卷相关命令三、创建一个数据卷&#xff0c;并查看数据卷在宿主机的目录位置四、数据卷挂载到容器五、数据卷挂载练习&#xff08;MySQL&#xff09;(1) 加载 MySQL 镜像(2) 根据镜像创建容器 一、数据卷介绍 &#x1f384; 数据卷&#xff08;volum…

Lychee图床 - 本地配置属于自己的相册管理系统并远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

HCIA-RS实验-路由配置-配置RIPv1 和RIPv2

书接上回。。。这篇主要以实验为主&#xff0c;实验的主要目标也是理解RIP路由协议的防环机制 &#xff0c;掌握RIPv1和v2的配置方法&#xff1b;大致拓扑图如下&#xff1a; 拓扑图&#xff1a; 配置对应的IP&#xff1a; R1.2.3 测试R1与R2间的连通性。 配置IP后测试连通性…

设计模式——设计模式简介和七大原则

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 一、通过经典面试题掌握重点 二、设计模式的目的和核心原则 三、设计模式七大原则 3.1 单一职责原则&#xff08;Single Respo…