命令使用
objdump可以对可执行文件进行反汇编
其常用参数为:
- objdump -d <file(s)>: 将代码段反汇编;
- objdump -S <file(s)>: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;
- objdump -C <file(s)>: 将C++符号名逆向解析
- objdump -l <file(s)>: 反汇编代码中插入文件名和行号
- objdump -j section <file(s)>: 仅反汇编指定的section
反汇编输出结果解析
有很多个参数,这里先从基本的反汇编开始,即-d参数的输出
段
objdump进行反汇编后的输出结果通常包含多个段,每个段对应于可执行文件或共享库的不同部分
一些常见段:
- .text:包含程序的机器码指令,即可执行代码.反汇编结果中大部分内容来自于这个段
- .data:程序的初始化数据.可能包含全局变量和静态变量
- .rodata:只读数据,如常量字符串.这些数据是只读的,不允许被修改
- .bss:未初始化的全局和静态变量.只包含变量的大小和位置信息,不包含实际的数据
- .plt:过程链接表(Procedure Linkage Table),包含用于进行动态链接的代码
- .got:全局偏移标(Global Offset Table),包含全局变量和函数的地址
- .eh_frame:异常处理框架信息,用于处理异常可展开栈
- .comment:包含于目标架构/编译器版本等相关的注释信息
- .fini:包含在程序退出时执行的代码,用于清理和收尾工作
- .init:通常包含在程序启动时执行的代码,用于初始化和准备运行时环境。
NT:实际的输出内容会根据目标文件的类型和编译选项而有所不同.可以使用objdump -h 可执行文件
查看更详细的段信息,其中包含每个段的起始地址\大小等信息
如一个简单的文件读取C代码,编译后为可执行文件hi,进行反编译后用objdump -h hi
查看段信息为