首页 > 编程知识 正文

so文件反编译源码,linux 反汇编

时间:2023-05-06 11:54:42 阅读:169722 作者:4259

文章目录概要参数实例objdump反汇编用法示例参考

概要

objdump能做什么?

objdump命令用于反汇编Linux下的目标文件或可执行文件,使您能够以可读格式理解可能包含在二进制文件中的其他信息。

在Linux上反汇编目标文件或可执行文件。 查看静态库和动态库有哪些函数参数,并显示帮助文档

objdump--帮助参数选项:

usage :对象选项(s )文件(s ) s )必须至少指定以下选项之一: --archive-headers -a显示归档文件的成员信息,ls -l列出lib*.a的信息。 -b bfdname --target=bfdname指定目标代码格式。 这不是必须的。 objdump自动识别许多格式。 例如,objdump -b Oasys -m vax -h fu.o会显示fu.o的标头摘要信息,并明确指出该文件是在Vax系统下由oasys编译器生成的目标文件。 objdump -i显示了可以在此处指定的目标代码格式的列表。 -C --demangle将下级符号名称解码为用户级别的名称,删除开头的下划线,并显示c函数名称以供理解。 - -显示调试信息。 尝试分析保存在文件中的调试信息,并以c语言语法显示。 仅支持特定类型的调试信息。 某些其他格式在readelf -w中受支持。 -e --debugging-tags与-g选项类似,但生成的信息格式与ctags工具兼容。 --disassemble -d从objfile反汇编那些特定指令机器代码的section。 -D --disassemble-all与-d类似,但如果反汇编所有section. --prefix-addresses,则会显示每行的完整地址。 这是比较古老的反汇编格式。 - e B- El-- endian={ big }指定目标文件的小字节序。 本项影响反汇编的指令。 当反汇编的文件中没有包含小端序信息时使用。 例如,S-records. -f --file-headers显示objfile中每个文件的整体标头摘要信息。 -h --section-headers --headers显示目标文件中每个section的标头摘要信息。 -H --help的简单帮助信息。 -i --info显示可与-b或-m选项一起使用的模式和目标格式的列表。 -j name--section=name只需用文件名和行号标记与指定名为name的section的信息-l--line-numbers相对应的目标代码,即可将-d、 与-d或-r一起使用-ld和-d的区别不大,在源代码级别调试时很有用- m machine-- architecture=machine反汇编目标文件如果要反汇编的文件本身不包含模式信息(例如,S-records ),则此选项很有用。 可以使用-i选项列出在此处可以指定的模式。 --reloc -r显示文件重定位入口。 与-d或-d一起使用时,重新定位部分将以反汇编格式显示。 --dynamic-reloc -R仅针对动态目标文件的含义(如特定的共享库)显示文件的动态重新定位入口。 - s--全内容显示指定section的完整内容。 将显示默认的所有非空section。 -S --source尽可能地反汇编源代码。 特别是在编译时指定了-g这样的调试参数时,效果更好。 -d参数被隐含。 - -对于--show-raw-insn反汇编,将显示每个装配指令的机器代码。 如果未指定--prefix-addresses,则这是缺省选项。 对于--no-show-raw-insn反汇编,如果不指定--prefix-addresses,则不会显示汇编命令的机器代码。 这将成为默认选项。 --start-address=address从影响-d、-r和-s选项输出的指定地址开始显示数据。 --stop-address=address显示数据,直到指定了影响-d、-r和-s选项输出的地址。 -t --syms显示文件的符号表条目。 只有动态目标文件(如某些共享库)才有意义,如nm -s提供的信息- t--动态系统显示文件中的动态符号表条目。 显示的信息类似于nm -D|--dynamic显示的信息。 - v--版本信息- -所有标题- x显示可用的标题信息、符号表、重定位条目等。 -x等效于与-a -f -h -r -t同时指定。 -z --disassemble-zeroes的典型反汇编输出将省略大块的零。 此选项还会反汇编这些零块。 @file可以将选项组合到一个文件中,然后使用此@file选项进行加载。 注意:

必须至少指定以下选项之一: --- archive-headersdisplayarchiveheaderinformation-f,--- file-headersdisplaythecontentsoftheoveral

l file header -p, --private-headers Display object format specific file header contents -P, --private=OPT,OPT... Display object format specific contents -h, --[section-]headers Display the contents of the section headers -x, --all-headers Display the contents of all headers -d, --disassemble Display assembler contents of executable sections -D, --disassemble-all Display assembler contents of all sections -S, --source Intermix source code with disassembly -s, --full-contents Display the full contents of all sections requested -g, --debugging Display debug information in object file -e, --debugging-tags Display debug information using ctags style -G, --stabs Display (in raw form) any STABS info in the file -W[lLiaprmfFsoRt] or --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames, =frames-interp,=str,=loc,=Ranges,=pubtypes, =gdb_index,=trace_info,=trace_abbrev,=trace_aranges, =addr,=cu_index] Display DWARF info in the file -t, --syms Display the contents of the symbol table(s) -T, --dynamic-syms Display the contents of the dynamic symbol table -r, --reloc Display the relocation entries in the file -R, --dynamic-reloc Display the dynamic relocation entries in the file @<file> Read options from <file> -v, --version Display this program's version number -i, --info List object formats and architectures supported -H, --help Display this information

关于符号表字段下面直接只介绍部分常用的:

.text:已编译程序的机器代码。.rodata:只读数据,比如printf语句中的格式串和开关(switch)语句的跳转表。.data:已初始化的全局C变量。局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中。.bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。.symtab:一个符号表(symbol table),它存放在程序中被定义和引用的函数和全局变量的信息。一些程序员错误地认为必须通过-g选项来编译一个程序,得到符号表信息。实际上,每个可重定位目标文件在.symtab中都有一张符号表。然而,和编译器中的符号表不同,.symtab符号表不包含局部变量的表目。.rel.text:当链接噐把这个目标文件和其他文件结合时,.text节中的许多位置都需要修改。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面调用本地函数的指令则不需要修改。注意,可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示链接器包含这些信息。.rel.data:被模块定义或引用的任何全局变量的信息。一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改。.debug:一个调试符号表,其有些表目是程序中定义的局部变量和类型定义,有些表目是程序中定义和引用的全局变量,有些是原始的C源文件。只有以-g选项调用编译驱动程序时,才会得到这张表。.line:原始C源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译驱动程序时,才会得到这张表。.strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。 实例

反汇编应用程序

objdump -d main.o

显示文件头信息

objdump -f main.o # 查看动态库有哪些符号,包括数据段、导出的函数和引用其他库的函数objdump -tT xxx.soobjdump -x xxx.a# 查看动态库依赖项objdump -x xxx.so | grep "NEEDED" # 查看动态符号表objdump -T xxx.so## 假如想知道 xxx.so 中是否导出了符号 yyy ,那么命令为 objdump -T xxx.so | grep "yyy" 。# 查看动态符号表objdump -t xxx.so## -T 和 -t 选项在于 -T 只能查看动态符号,如库导出的函数和引用其他库的函数,而 -t 可以查看所有的符号,包括数据段的符号。 objdump反汇编用法示例 -d:将代码段反汇编-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。-C:将C++符号名逆向解析。-l:反汇编代码中插入源代码的文件名和行号。-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。 参考

Linux:objdump命令解析
https://blog.csdn.net/q2519008/article/details/82349869

objdump反汇编用法示例
https://blog.csdn.net/zoomdy/article/details/50563680

objdump命令的使用
https://blog.csdn.net/beyondioi/article/details/7796414

使用objdump查看动态库和静态库中具有哪些函数
https://blog.csdn.net/tao546377318/article/details/51727696

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。