为什么 xxd 和 objdump 之间的内存地址或偏移量不同?
Why the differences in memory address or offset between xxd and objdump?
我有以下测试汇编程序:
.section .rodata
a: .byte 17
.section .text
.globl _start
_start:
mov , %eax
mov a(%rip), %ebx
int [=10=]x80
我已经编译成一个名为 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 [=11=]x1,%eax
40007d: 8b 1d 02 00 00 00 mov 0x2(%rip),%ebx # 400085 <a>
400083: cd 80 int [=11=]x80
然而,当我用 $ 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 开始偏移所有内容,但是 'offset' 如果你可以调用它, objdump
会用什么?我如何协调 400078
在 xxd
中的位置?或者我需要为此使用其他程序吗?
Why the differences in memory address or offset between xxd and objdump?
因为它们向您展示了大部分不相关的数据视图。
xxd
显示任意文件的原始位,不解释其含义。
objdump
(使用您使用的标志)向您显示当您的可执行文件加载到内存中时 memory 的内容。
objdump
通过检查和理解 ELF
文件 header、程序 header 的含义得出该观点s 和部分 headers.
您可以使用 readelf --segments
和 readelf --sections
来检查这些 header。
我有以下测试汇编程序:
.section .rodata
a: .byte 17
.section .text
.globl _start
_start:
mov , %eax
mov a(%rip), %ebx
int [=10=]x80
我已经编译成一个名为 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 [=11=]x1,%eax
40007d: 8b 1d 02 00 00 00 mov 0x2(%rip),%ebx # 400085 <a>
400083: cd 80 int [=11=]x80
然而,当我用 $ 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 开始偏移所有内容,但是 'offset' 如果你可以调用它, objdump
会用什么?我如何协调 400078
在 xxd
中的位置?或者我需要为此使用其他程序吗?
Why the differences in memory address or offset between xxd and objdump?
因为它们向您展示了大部分不相关的数据视图。
xxd
显示任意文件的原始位,不解释其含义。objdump
(使用您使用的标志)向您显示当您的可执行文件加载到内存中时 memory 的内容。objdump
通过检查和理解ELF
文件 header、程序 header 的含义得出该观点s 和部分 headers.
您可以使用 readelf --segments
和 readelf --sections
来检查这些 header。