linux中分析动态库so常用命令:strings、file、ldd、nm、objdump

linux中分析动态库so常用命令

1、strings命令

可以从文件中提取可打印字符(字母、数字、字符、标点符号、空格等)。可以帮助我们快速查找和分析二进制文件中的文本信息。
strings命令可以从二进制文件中提取所有可打印的字符串,包括文本、注释、函数名等。

1.1、 常用参数

-a	扫描整个文件,而不只是扫描目标文件初始化和装载段
-f	显示字符串前,先显示文件名
-t	输出字符的位置,基于八进制,十进制或十六进制
-d	只打印文件中初始化的、加载的数据节中的字符串。这可能会减少输出中的垃圾数量,但也会将字符串程序暴露给用于扫描和加载部分的BFD库中可能存在的任何安全缺陷。

1.2、有用的实例

1)可以在代码中定义版本,多版本时用来判断是否有变动
代码:

在这里插入图片描述
查询:
在这里插入图片描述
2)查看glibc支持(向下兼容)的版本
在这里插入图片描述
3)查看生成so的GCC版本
在这里插入图片描述

2. file命令

用于检测文件类型的命令,可以根据文件的二进制数据来确定其类型

2.1、 常用参数

-b:仅显示文件类型,不显示文件名;
-i:显示MIME类型;
-z:对压缩文件也进行检测。
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号链接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-s: 查询(块/字符设备)文件信息

2.2、实例

1)查看so ELF类,支持操作系统

在这里插入图片描述

上图,显示32位,ARM库,如果在X86上使用会提示版本不兼容问题

3、ldd命令

用来打印或者查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题

3.1、 常用参数

--help 获取指令帮助信息;
--version 打印指令版本号;
-d,--data-relocs 执行重定位和报告任何丢失的对象;
-r,--function-relocs 执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;
-u, --unused 打印未使用的直接依赖;
-v, --verbose 详细信息模式,打印所有相关信息;

3.2、实例

1)查看动态库so或可执行文件依赖库情况

在这里插入图片描述
当缺少依赖时 显示 not found

4、nm命令

列出 .o, .a, .so 中的符号信息(不是直接作用于 main.c、test.h、test.c 等文件),包括诸如符号的值、符号类型以及符号名称等。所谓符号,通常指定义出的函数、全局变量等信息。

4.1、 常用参数

-A 在每个符号信息的前面打印所在对象文件名称;
-C 输出demangle过了的符号名称;
-D 打印动态符号;
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号。
常见符号类型:
A 该符号的值在今后的链接中将不再改变;
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
T 该符号放在代码段中,通常是那些全局非静态函数;
U 该符号未定义过,需要自其他对象文件中链接进来;
W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

4.2、示例

在这里插入图片描述

通常用于加载第三方so等库文件时,报错函数未定义时,可通过该方式搜索so中是否定义某函数
Nm –A hello.so | grep “T main”

5、objdump命令

objdump命令是Linux下的反汇编目标文件或者可执行文件的命令。

5.1、 常用参数

-f	显示文件头信息
-d	反汇编文件中需要执行指令的那些section
-D	与-d类似,但反汇编文件中中的所有section
-h	显示文件中的Section Header信息
-x	显示文件的全部Header信息
-s	除了显示文件的全部Header信息,还显示他们对应的十六进制文件代码

5.2、 示例

objdump -f hello.so
显示hello.so的文件头信息

在这里插入图片描述

objdump -d hello.so
反汇编hello.so中的需要执行指令的那些section

在这里插入图片描述
objdump -D hello.so
与-d类似,但反汇编hello.so中的所有section
在这里插入图片描述

objdump -h hello.so
显示hello.so的Section Header信息

在这里插入图片描述

objdump -x hello.so
显示hello.so的全部Header信息

在这里插入图片描述

objdump -s hello.so
除了显示hello.so的全部Header信息,还显示他们对应的十六进制文件代码

在这里插入图片描述

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值