为什么 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 会用什么?我如何协调 400078xxd 中的位置?或者我需要为此使用其他程序吗?

Why the differences in memory address or offset between xxd and objdump?

因为它们向您展示了大部分不相关的数据视图。

  • xxd 显示任意文件的原始位,不解释其含义。

  • objdump(使用您使用的标志)向您显示当您的可执行文件加载到内存中时 memory 的内容。

    objdump 通过检查和理解 ELF 文件 header、程序 header 的含义得出该观点s 和部分 headers.

您可以使用 readelf --segmentsreadelf --sections 来检查这些 header。