这篇文章给那些在 Linux 开发的小伙伴们介绍一个强大的显示二进制文件信息的命令行工具:objdump。用途:objdump 是 GNU Binary Utilities (binutils) 工具链中的一员,用于 显示二进制文件的各种信息,常用于程序调试、逆向分析、底层学习等场景。简单理解:objdump 就是二进制文件的 “显微镜”,帮你看清可执行文件内部的构造。文件:目标文件、可执行文件、库文件(.o、.elf、.a、.so 等) | |
|---|
-d,--disassemble | |
-D, --disassemble-all | 反汇编所有段(包括 .data、.rodata 等) |
-S,--source | |
-l,--line-numbers | |
-M intel | |
-C,--demangle | |
| |
|---|
-f,--file-headers | |
-h, --headers | |
-t, --syms | |
-r, --reloc | |
-x, --all-headers | 显示所有头信息(等价于 -a -f -h -p -r -t) |
-s,--full-contents | |
| |
|---|
-j name,--section=name | |
-p,--private-headers | |
-g, --debugging | |
-i,--info | |
-w,--wide | |
main: file format elf64-x86-64architecture: i386:x86-64, flags 0x00000112:EXEC_P, HAS_SYMS, D_PAGEDstart address 0x0000000000401000
main: file format elf64-x86-64Sections:Idx Name Size VMA LMA File off Algn0 .interp 0x00001c 0x00000000004003180x00000000004003180x000003182**0 CONTENTS, ALLOC, LOAD, READONLY, DATA1 .note.ABI-tag 0x0000200x00000000004003340x00000000004003380x000003342**2 CONTENTS, ALLOC, LOAD, READONLY ...13 .text 0x0005a20x00000000004010000x00000000004010000x000010002**4 CONTENTS, ALLOC, LOAD, READONLY, CODE14 .data 0x0000080x00000000004020000x00000000004020000x000020002**3 CONTENTS, ALLOC, LOAD, DATA15 .bss 0x0000040x00000000004020080x00000000004020080x000020082**0 ALLOC
main: file format elf64-x86-64Disassembly of section .text:0000000000401000 <_start>:401000: f3 0f 1e fa endbr64 401004: 31 ed xor%ebp,%ebp401006: 4989 d1 mov %rdx,%r9401009: 5e pop%rsi ...0000000000401136 <main>:401136: f3 0f 1e fa endbr64 40113a: 55push%rbp 40113b: 4889 e5 mov %rsp,%rbp ...
# 先用 -g 编译gcc -g -o main main.c# 混合显示objdump -S main
0000000000401136 <main>:#include <stdio.h>int main() {401136: f3 0f 1e fa endbr64 40113a: 55 push %rbp40113b: 4889 e5 mov %rsp,%rbpprintf("Hello\n");40113f: 488d 3d 10000000 lea 0x10(%rip),%rdi401146: e8 e5 fe ff ff call 401030 <puts@plt>return0;40114b: b8 00000000 mov \$0x0,%eax401150: 5d pop %rbp401151: c3 ret
0000000000401136 <main>:401136: f3 0f 1e fa endbr64 40113a: 55 push rbp40113b: 4889 e5 mov rbp, rsp40113f: 488d 3d 10000000 lea rdi, [rip + 0x10]401146: e8 e5 fe ff ff call 401030 <puts@plt>
objdump -t main | head -30
main: file format elf64-x86-64SYMBOL TABLE:0000000000000000 l df *ABS* 0000000000000000 main.c0000000000000000 l d .text 0000000000000000 .text0000000000000000 l d .data 0000000000000000 .data0000000000401000 l F .text 0000000000000000 _start0000000000401136 g F .text 000000000000000c main0000000000401050 g F .text 0000000000000025 func1
# 查看函数汇编实现objdump -d -M intel main | grep -A 20 "<main>"
# 查看是否有调试信息objdump -g main
# 查看只读数据段objdump -s -j .rodata main
# 完整反汇编 + C++ 符号还原objdump -d -C -M intel main
| |
|---|
| objdump -f main |
| objdump -h main |
| objdump -d main |
| objdump -S main |
| objdump -d -M intel main |
| objdump -t main |
| objdump -r main |
| objdump -x main |
| objdump -d -j .text main |
objdump 是一个功能强大的二进制文件分析工具,它提供了丰富的选项来提取二进制文件的各种信息,可以更好地帮助小伙伴们理解程序的内部结构和执行流程,提高软件开发和系统分析的能力。