1、命令简介
objdump:用于分析二进制目标文件的实用程序,它可以在Linux系统中使用。主要用于查看目标文件的信息,包括头部信息、符号表、代码段反汇编等
2、命令语法
objdump [-a|--archive-headers] [-b bfdname|--target=bfdname] [-C|--demangle[=style] ] [-d|--disassemble] [-D|--disassemble-all] [-z|--disassemble-zeroes] [-EB|-EL|--endian={big | little }] [-f|--file-headers] [--file-start-context] [-g|--debugging] [-e|--debugging-tags] [-h|--section-headers|--headers] [-i|--info] [-j section|--section=section] [-l|--line-numbers] [-S|--source] [-m machine|--architecture=machine] [-M options|--disassembler-options=options] [-p|--private-headers] [-r|--reloc] [-R|--dynamic-reloc] [-s|--full-contents] [-W|--dwarf] [-G|--stabs] [-t|--syms] [-T|--dynamic-syms] [-x|--all-headers] [-w|--wide] [--start-address=address] [--stop-address=address] [--prefix-addresses] [--[no-]show-raw-insn] [--adjust-vma=offset] [--special-syms] [-V|--version] [-H|--help] objfile...
3、命令描述
objdump
显示有关一个或多个目标文件的信息。选项控制要显示的特定信息。这些信息对于正在开发编译工具的程序员非常有用,而不适用于只希望编译并运行其程序的程序员。
objfile...
是要检查的目标文件。当您指定存档文件时,objdump 显示每个成员目标文件的信息。
4、命令选项
选项 | 描述 |
--archive-headers -a | 显示档案库的成员信息,类似于使用
显示 |
-b bfdname --target=bfdname |
这不是必须的, |
-C --demangle | 将底层的符号名解码成用户级名字, 使得 C++ 函数名以可理解的方式显示出来。 |
--debugging -g | 显示调试信息,企图解析保存在文件中的调试信息 并以 C 语言的语法显示出来。 |
-e --debugging-tags | 类似 但生成的信息是和 ctags 工具相兼容的格式。 |
--disassemble -d | 从 objfile 中反汇编那些特定指令的机器码的 section。 |
-D --disassemble-all | 类似 -d,但反汇编所有 section。 |
--prefix-addresses | 反汇编的时候,显示每一行的完整地址。 这是一种比较老的反汇编格式。 |
-EB -EL --endian={big|little} | 指定目标文件的小端。这个项将影响反汇编出来的指令。 在反汇编的文件没描述小端信息的时候用。例如,S-records. |
-f --file-headers | 显示 objfile 中每个文件的整体头部摘要信息。 |
-h --section-headers --headers | 显示目标文件各个 section 的头部摘要信息。 |
-H --help | 简短的帮助信息。 |
-i --info | 显示对于 |
-j name --section=name | 仅仅显示指定名称为 name 的 section 的信息。 |
-l --line-numbers | 用文件名和行号标注相应的目标代码, 仅仅和 |
-m machine --architecture=machine | 指定反汇编目标文件时使用的架构, 当待反汇编文件本身没描述架构信息的时候很有用。 |
--reloc -r | 显示文件的重定位入口。如果和 重定位部分以反汇编后的格式显示出来。 |
--dynamic-reloc -R | 显示文件的动态重定位入口, 仅对动态目标文件有意义,比如某些共享库。 |
-s --full-contents | 显示指定 section 的完整内容。 默认所有的非空 section 都会被显示。 |
-S --source | 尽可能反汇编出源代码, 尤其当编译时指定了 效果明显。隐含了 |
--show-raw-insn | 反汇编时,显示每条汇编指令对应的机器码, 如不指定 |
--no-show-raw-insn | 反汇编时,不显示汇编指令的机器码, 如不指定 |
--start-address=address | 从指定地址开始显示数据, 该选项影响 |
--stop-address=address | 显示数据直到指定地址为止, 该项影响 |
-t --syms | 显示文件的符号表入口,类似于
提供的信息。 |
-T --dynamic-syms | 显示文件的动态符号表入口, 仅仅对动态目标文件意义, 比如某些共享库。 它显示的信息类似于 |
-V | 版本信息。 |
--all-headers | 显示所可用的头信息,包括符号表、重定位入口。
|
-z --disassemble-zeroes | 一般反汇编输出将省略大块的零, 该选项使得这些零块也被反汇编。 |
@file | 可以将选项集中到一个文件中, 然后使用这个 @file 选项载入。 |
5、使用示例
1)查看目标文件头部信息:
objdump -h <filename>
显示目标文件的头部信息,包括各个段(section)的大小、地址、偏移等。
2)查看目标文件的符号表:
objdump -t <filename>
显示目标文件的符号表,包括函数名、变量名以及它们的地址。
3)反汇编代码段
objdump -d <filename>
反汇编目标文件的代码段,显示汇编指令,可以用于分析程序的执行流程。
4)查看重定位入口
objdump -r <filename>
显示目标文件的重定位入口,包括需要在链接时解析的符号引用。
5)以指定格式反汇编
objdump -M <architecture> -D <filename>
指定要使用的架构来反汇编目标文件。
6)查看所有头信息
objdump -x <filename>
显示目标文件的所有头信息,包括符号表、重定位入口等。
7)反汇编特定段
objdump -j <section_name> -d <filename>
只反汇编特定段的内容,而不是整个文件。