x86 - 为什么 xxd 和 objdump 的内存地址或偏移量不同?
问题描述
我有以下测试汇编程序:
.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
使用的“偏移”,那又是什么?我怎样才能调和 where400078
会在xxd
哪里?还是我需要为此使用另一个程序?
解决方案
为什么 xxd 和 objdump 的内存地址或偏移量不同?
因为它们向您展示了大部分不相关的数据视图。
xxd
向您显示任意文件的原始位,不解释其含义。objdump
(使用您使用的标志)向您显示当您的可执行文件加载到内存中时内存的内容会是什么样子。objdump
通过检查和理解ELF
文件头、程序头和节头的含义来得出这个观点。
您可以使用readelf --segments
和readelf --sections
来检查这些标题。
推荐阅读
- rest - 如何使用 Rest API 调用更新 TM1 Cube 数据
- r - 数列因子的计数因子实例
- javascript - 在 Vue 中动态添加带有事件的不同组件
- php - 如何从字符串中删除最后一个逗号和所有空格,然后使用 PHP 对其进行清理?
- javascript - location.href 不起作用(重新加载同一页面)
- ruby - 从左到右列的引导网格布局
- node.js - express.js 在初始加载后重新加载时找不到路由
- json - 查询复杂 CosmosDB 文档的简洁方法
- android - 选择下一个输入后文本消失 - React Native Android
- node.js - 突然开始在 Mac 上遇到带有 Express 服务器的 React App 内部服务器错误 500