为啥 xxd 和 objdump 的内存地址或偏移量不同?
Posted
技术标签:
【中文标题】为啥 xxd 和 objdump 的内存地址或偏移量不同?【英文标题】:Why the differences in memory address or offset between xxd and objdump?为什么 xxd 和 objdump 的内存地址或偏移量不同? 【发布时间】:2020-12-14 21:37:03 【问题描述】:我有以下测试汇编程序:
.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 是文件的十六进制转储,那些是文件偏移量。它对 ELF 元数据而不是内存地址一无所知。这只是任意二进制数据的简单十六进制转储。 使用 objdump -h 显示 ELF 文件的标题。这将告诉您与文本部分相对应的文件中的偏移量。 【参考方案1】:为什么xxd和objdump的内存地址或偏移量不同?
因为它们向您展示了大部分不相关的数据视图。
xxd
向您显示任意文件的原始位,不解释其含义。
objdump
(带有您使用的标志)向您显示当您的可执行文件加载到内存中时 memory 的内容会是什么样子。
objdump
通过检查和理解ELF
文件头、程序头和节头的含义得出该视图。
您可以使用readelf --segments
和readelf --sections
来检查这些标头。
【讨论】:
从不使用objdump
?我在readelf
的手册页中没有看到反汇编选项。您的意思是永远不要用于某些特定目的或某些选项?喜欢从不使用objdump -h
?
@PeterCordes 你是对的。我调低了答案。以上是关于为啥 xxd 和 objdump 的内存地址或偏移量不同?的主要内容,如果未能解决你的问题,请参考以下文章