简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:如何查看so、bin启动依赖的库文件,帮助开发者快速定位问题。
2.实践
<1>.readelf命令
在Linux平台上,readelf
是一个非常有用的命令行工具,用于分析可执行文件、共享库和目标文件的ELF格式(Executable and Linkable Format,可执行和可链接格式)的信息。ELF是Linux系统和其他类Unix系统上可执行文件和对象文件的标准格式。
以下是一些常用的readelf
命令选项和作用:
-
readelf -h <filename>
:显示目标文件的文件头信息,包括文件类型、目标体系结构、入口点地址等。 -
readelf -l <filename>
:显示目标文件的程序头信息,包括段的起始地址、大小和属性等。 -
readelf -S <filename>
:显示目标文件的节头信息,包括节的名称、起始地址、大小、属性等。 -
readelf -s <filename>
:显示目标文件的符号表,包括函数、变量和其他符号信息。 -
readelf -r <filename>
:显示目标文件的重定位表,展示代码和数据的重定位信息。 -
readelf -d <filename>
:显示目标文件的动态节信息,包括依赖的共享库、动态链接信息等。
readelf
命令对于调试、分析和了解可执行文件和目标文件的结构非常有用。它可以帮助开发者查看文件的头部、节、符号表等信息,了解程序的组织结构、依赖关系和动态链接信息,有助于进行代码审计、调试和性能优化。
# readelf -a libstagefrighthw.so | grep -i needed
0x0000000000000001 (NEEDED) 共享库:[libutils.so]
0x0000000000000001 (NEEDED) 共享库:[libcutils.so]
0x0000000000000001 (NEEDED) 共享库:[liblog.so]
0x0000000000000001 (NEEDED) 共享库:[libc++.so]
0x0000000000000001 (NEEDED) 共享库:[libc.so]
0x0000000000000001 (NEEDED) 共享库:[libm.so]
0x0000000000000001 (NEEDED) 共享库:[libdl.so]
otool
命令用于调试和分析可执行文件和共享库。
<2>.objdump命令
在Linux平台上,objdump
是一个非常有用的命令行工具,用于反汇编目标文件。它可以对可执行文件、共享库和目标文件进行静态反汇编,以便查看其二进制代码的详细信息。objdump
提供了各种选项,可以用于分析目标文件、查看符号表、显示程序入口点、反汇编代码以及更多。
以下是一些常用的objdump
命令选项和作用:
-
objdump -d <filename>
:对目标文件进行反汇编,显示其二进制代码和汇编指令。 -
objdump -t <filename>
:显示目标文件的符号表,包括函数、变量和节等信息。 -
objdump -r <filename>
:显示目标文件的重定位表,展示代码和数据的重定位信息。 -
objdump -x <filename>
:显示目标文件的所有头部信息,包括段、节和其他文件头信息。 -
objdump -S <filename>
:将源代码和反汇编代码以交叉的方式显示,方便进行源码和汇编代码的对比。
objdump
用于软件调试、逆向工程和软件安全分析。
# objdump -p libstagefrighthw.so | grep -i need
NEEDED libutils.so
NEEDED libcutils.so
NEEDED liblog.so
NEEDED libc++.so
NEEDED libc.so
NEEDED libm.so
NEEDED libdl.so
VERNEED 0x0000000000000530
VERNEEDNUM 0x0000000000000003
<3>.Mac OS平台工具:otool
在Mac OS平台上,otool
命令用于分析可执行文件、共享库和内核扩展。它可以提供关于这些二进制文件的信息,包括文件的结构、依赖关系和符号表等内容。以下是otool
命令常用的选项和作用:
-
otool -h
:显示可执行文件或共享库的文件头信息,包括文件类型、可执行文件的入口点等。 -
otool -l
:显示二进制文件的加载命令信息,包括依赖的动态库、段和节的信息等。 -
otool -L
:显示二进制文件依赖的动态库和其对应的路径。 -
otool -tV
:显示二进制文件的文本节(Text Section)的内容,其中包含了可执行代码。 -
otool -d
:显示共享库的动态链接信息,包括其他共享库的引用。 -
otool -arch
:指定CPU架构,可以用于查看特定架构的二进制文件信息。
# otool -L xxx.dylib
3.如果以上三种命令没有满足你的需求:请继续往下看
###<4>.strings命令
Linux中的strings
命令用于在一个文件中查找并打印可打印字符序列。它的主要作用是从二进制文件中提取文本信息,例如从可执行文件或库文件中提取字符串常量。
# strings libstagefrighthw.so |grep .so
liblog.so
libc.so
libdl.so
libutils.so
libcutils.so
libc++.so
libm.so
libstagefrighthw.so
libOmxCore.so