在 Linux 下做**反汇编(disassembly)**时,“看地址”通常涉及几类地址概念:虚拟地址(VA)、文件偏移(File Offset)、相对偏移、符号地址等。下面用通俗方式讲清楚怎么看、用什么工具看。
objdump、gdb)默认显示的就是 VA400526: 55 push %rbp
这里 400526 就是虚拟地址
main+0x14main, printfobjdump -d a.out
示例输出:
0000000000400526 <main>:
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
400526 → 虚拟地址<main> → 符号objdump -d -h a.out
或:
readelf -S a.out
看 section(如 .text)的:
Addr → 虚拟地址Off → 文件偏移公式:
文件偏移 = VA - Section_VA + Section_Offset
disassemble main
或:
disas /r main
示例:
0x0000000000400526 <main+0>: push %rbp
0x... → 当前 VAmain+0 → 相对偏移x/10i 0x400526
x/20xw 0x400526
info address main
readelf -h a.out # ELF 头
readelf -S a.out # 段/节区地址
readelf -s a.out # 符号表
gcc -g test.c
objdump -S a.out
混合源码 + 汇编
addr2line -e a.out 0x400526
❌ 文件偏移 ≠ 虚拟地址
❌ PIE 程序每次运行地址不同
❌ 静态分析和运行时地址可能不同
反汇编看地址,默认看的是虚拟地址;
要改文件看文件偏移;
调试用 GDB;
分析结构用 readelf / objdump。
如果你愿意,可以告诉我:
我可以直接给你对应示例。