Linux objdump命令介绍
objdump
,全名为Object Dump,是一个极其强大的工具,用于显示二进制文件的信息,允许用户查看对象文件的信息,这些信息包括汇编指令、节信息、符号表、重定位信息等。它是GNU Binutils包的一部分,这个包提供了多种工具来操作和分析二进制文件。这个多功能的命令主要用于调试程序,分析程序执行的详细信息,并且是逆向工程和二进制分析中不可或缺的工具。
Linux objdump命令适用的Linux版本
objdump
在大多数Linux发行版中都是可用的,因为它是GNU Binutils的一部分。然而,不同的Linux发行版可能会预安装不同版本的Binutils。
在CentOS 7上安装objdump
的命令是:
[linux@bashcommandnotfound.cn ~]$ sudo yum install binutils
而在CentOS 8和其他使用dnf的系统上,安装命令则变成了:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install binutils
其他基于Debian的系统(如Ubuntu)使用apt
:
[linux@bashcommandnotfound.cn ~]$ sudo apt install binutils
Linux objdump命令的基本语法
基本语法格式如下:
objdump [选项]... [文件]...
Linux objdump命令的常用选项或参数说明
选项 | 说明 |
---|---|
-a , --archive-headers | 显示档案库文件头部信息。 |
-b , --target | 指定目标二进制文件格式,如elf64-x86-64 。 |
-d , --disassemble | 反汇编指定的节(通常是.text节)中的数据。 |
-h , --section-headers | 显示节头部信息。 |
-j , --section | 仅显示指定节的信息。 |
-S , --source | 显示源代码,需要编译时带有调试信息。 |
-t , --syms | 显示符号表条目。 |
-x , --all-headers | 显示所有头部信息,包括节头部、文件头部等。 |
-D , --disassemble-all | 反汇编所有节的数据,而不仅仅是.text节。 |
-C , --demangle | 解析低级符号名称为用户级别名称,便于阅读。 |
Linux objdump命令的实例
实例1:显示二进制文件的所有头部信息
查看一个二进制文件的所有头信息,可以用于快速了解文件结构。
[linux@bashcommandnotfound.cn ~]$ objdump -x /path/to/binary
实例2:反汇编.text节
展示如何只反汇编二进制文件的.text节,这通常包含了程序的主要执行代码。
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary
实例3:查看符号表
显示一个对象文件的符号表,这对于理解程序中各个函数和变量的布局非常有用。
[linux@bashcommandnotfound.cn ~]$ objdump -t /path/to/binary
实例4:反汇编并显示源代码
如果代码在编译时包含了调试信息,此命令可以同时显示汇编代码和对应的源代码。
[linux@bashcommandnotfound.cn ~]$ objdump -S /path/to/binary
实例5:使用C++名字解码
当分析C++程序时,符号经常会被名字改编(mangle),使用--demangle
选项可以使输出更易于阅读。
[linux@bashcommandnotfound.cn ~]$ objdump --demangle -t /path/to/c++binary
实例6:以十六进制形式显示指定节内容
显示二进制文件中指定节(如.data)的内容,以十六进制形式:
[linux@bashcommandnotfound.cn ~]$ objdump -s -j .data /path/to/binary
实例7:解析动态符号表
在分析共享库或动态链接的二进制文件时,查看动态符号表是非常有用的:
[linux@bashcommandnotfound.cn ~]$ objdump -T /path/to/library.so
实例8:显示重定位信息
显示目标文件的重定位入口信息,这对于了解链接过程中地址如何被修改非常重要:
[linux@bashcommandnotfound.cn ~]$ objdump -r /path/to/object.o
实例9:输出所有信息
输出二进制文件的所有可用信息,这个命令会生成大量的输出,但有时对于全面的分析很有帮助:
[linux@bashcommandnotfound.cn ~]$ objdump -a -d -s -h -x /path/to/binary
实例10:查看编译器生成的汇编代码
有时候,分析编译器生成的汇编代码对于了解编译器优化非常有帮助:
[linux@bashcommandnotfound.cn ~]$ objdump -S /path/to/binary > assembly.asm
实例11:比较两个不同的二进制文件
使用objdump
输出两个二进制文件的指令集合,然后使用diff
工具来比较它们:
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/first_binary > first.asm
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/second_binary > second.asm
[linux@bashcommandnotfound.cn ~]$ diff first.asm second.asm
实例12:查找特定函数的汇编代码
如果你知道函数的名字,你可以使用grep
来查找该函数的汇编代码:
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary | grep -A20 '<function_name>:'
上述命令中的-A20
表示grep
将显示匹配行下面的20行,这通常足够显示整个函数的汇编代码。
实例13:查看文件头信息
有时候,了解文件格式的基本信息如魔数(magic number)、架构类型、入口点等非常重要:
[linux@bashcommandnotfound.cn ~]$ objdump -f /path/to/binary
实例14:检查编译器的优化选项
objdump
也可以被用来检查编译器使用的优化选项,这些信息可以在.comment
节中找到:
[linux@bashcommandnotfound.cn ~]$ objdump -s -j .comment /path/to/binary
实例15:查看特定地址的汇编指令
如果你想查看存储在特定地址的指令,可以使用如下命令:
[linux@bashcommandnotfound.cn ~]$ objdump -d /path/to/binary --start-address=0xADDRESS --stop-address=0xADDRESS
将0xADDRESS
替换为你想要查看的起始和结束地址。这可以用于调试或分析程序执行的特定部分。
Linux objdump命令的注意事项
- 确保在尝试分析的二进制文件上具有适当的读取权限。
- 在分析不同架构(如ARM, x86_64, MIPS等)生成的二进制文件时,应使用正确的
-b
选项指定目标格式。 - 使用
objdump
时,应当注意不要将其输出用于自动化脚本,因为输出格式可能会在不同版本的objdump
之间发生变化。 - 注意文件路径的正确性,错误的路径会导致
objdump
无法找到文件。 - 如果遇到
bash: objdump: command not found
错误,请按照上面提供的指令安装binutils
包。
评论区