X86 为什么xxd和objdump之间的内存地址或偏移量存在差异?
我有以下测试装配程序:X86 为什么xxd和objdump之间的内存地址或偏移量存在差异?,x86,reverse-engineering,elf,objdump,xxd,X86,Reverse Engineering,Elf,Objdump,Xxd,我有以下测试装配程序: .section .rodata a: .byte 17 .section .text .globl _start _start: mov $1, %eax mov a(%rip), %ebx int $0x80 我已经编译成一个名为文件的可执行文件。当我使用objdump反汇编时,我得到以下预期输出: $ objdump --disassemble --section=.text file file: file format elf
.section .rodata
a: .byte 17
.section .text
.globl _start
_start:
mov $1, %eax
mov a(%rip), %ebx
int $0x80
我已经编译成一个名为文件的可执行文件。当我使用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
只是将所有值从0偏移,但是如果您可以称之为objdump
使用的“偏移量”是什么呢?如何协调400078
在xxd
中的位置?或者我需要使用另一个程序吗
为什么xxd和objdump之间的内存地址或偏移量存在差异
因为它们显示的是基本上不相关的数据视图
xxd
显示任意文件的原始位,不解释其含义
objdump
(带有您使用的标志)显示将可执行文件加载到内存中时内存内容的外观
objdump
通过检查和理解ELF
文件头、程序头和节头的含义,得出该视图
您可以使用readelf--segments
和readelf--sections
检查这些标题。xxd是文件的十六进制转储,它们是文件偏移量。它对ELF元数据一无所知,对内存地址一无所知。这只是任意二进制数据的简单十六进制转储。使用objdump-h显示ELF文件的头。这将告诉您与文本部分对应的文件中的偏移量。切勿使用objdump
?我在readelf
的手册页中没有看到反汇编选项。你的意思是永远不要为某个特定的目的使用它,或者它的一些选项?就像从不使用objdump-h
?@PeterCordes你是对的。我缓和了回答。
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 ................