问题描述
我有以下测试汇编程序:
.section .rodata
a: .byte 17
.section .text
.globl _start
_start:
mov $1,%eax
mov a(%rip),%ebx
int $0x80
我已经编译成名为file
的可执行文件。当我使用objdump
进行反汇编时,会得到以下预期输出:
$ objdump --disassemble --section=.text file
file: file format elf64-x86-64
disassembly of section .text:
0000000000400078 <_start>:
400078: b8 01 00 00 00 mov $0x1,%eax
40007d: 8b 1d 02 00 00 00 mov 0x2(%rip),%ebx # 400085 <a>
400083: cd 80 int $0x80
但是,当我只用$ xxd file
打印二进制文件时,内存甚至没有达到400078
:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 b000 4000 0000 0000 ..>.......@.....
00000020: 4000 0000 0000 0000 e001 0000 0000 0000 @...............
...
00000340: 2700 0000 0000 0000 0000 0000 0000 0000 '...............
00000350: 0100 0000 0000 0000 0000 0000 0000 0000 ................
是什么造成了这一差异?似乎xxd
会使所有内容都从0开始偏移,但是如果您可以称呼objdump
使用的“偏移量”又是什么呢?如何调和400078
在xxd
中的位置?还是我需要为此使用其他程序?
解决方法
为什么xxd和objdump之间的内存地址或偏移量不同?
因为它们显示的是与数据无关的视图。
-
xxd
向您显示任意文件的原始位,不解释其含义。 -
objdump
(带有您使用的标志)向您显示当将可执行文件加载到内存中时,内存的内容是什么样。objdump
通过检查并了解ELF
文件头,程序头和节头的含义而到达该视图。
您可以使用readelf --segments
和readelf --sections
检查这些标题。