c - 为什么在 ELF 二进制文件中字节以两个为一组进行反转
问题描述
我正在尝试创建 ELF 格式的标题编辑器。在开发过程中,我注意到在两个字节的二进制组中总是反转的。
例如,这是一个 hexdump(我将其称为 hexdump1 以供参考)。
pc@pc-VirtualBox:~/Documents/ElfEditor$ hexdump Test | head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0003 003e 0001 0000 07a0 0000 0000 0000
0000020 0040 0000 0000 0000 2758 0000 0000 0000
0000030 0000 0000 0040 0038 0009 0040 0022 0021
0000040 0006 0000 0004 0000 0040 0000 0000 0000
0000050 0040 0000 0000 0000 0040 0000 0000 0000
0000060 01f8 0000 0000 0000 01f8 0000 0000 0000
0000070 0008 0000 0000 0000 0003 0000 0004 0000
0000080 0238 0000 0000 0000 0238 0000 0000 0000
0000090 0238 0000 0000 0000 001c 0000 0000 0000
例如,在前 4 个字节中,我期待“7f45 4c46”而不是“457f 464c”。
当我使用 -C 参数运行 hexdump 时,我得到了我期望的转储。(我将此 hexdump 称为 hexdump2 以供参考)。
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 03 00 3e 00 01 00 00 00 a0 07 00 00 00 00 00 00 |..>.............|
00000020 40 00 00 00 00 00 00 00 58 27 00 00 00 00 00 00 |@.......X'......|
00000030 00 00 00 00 40 00 38 00 09 00 40 00 22 00 21 00 |....@.8...@.".!.|
00000040 06 00 00 00 04 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000050 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |@.......@.......|
00000060 f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00 |................|
00000070 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 |................|
00000080 38 02 00 00 00 00 00 00 38 02 00 00 00 00 00 00 |8.......8.......|
00000090 38 02 00 00 00 00 00 00 1c 00 00 00 00 00 00 00 |8...............|
二进制文件保存为 hexdump1,这使得在 C 中难以读取。
只是一些额外的信息。这不是字节序问题,因为相关数据(例如整数)在 hexdump2 中以小端格式正确,而在 hexdump1 中不正确。例如,在偏移字节 0x14 中开始一个 32 位 Int(值为 1),在 hexdump2 中它由字节 01 00 00 00 正确表示,而在 hexdump1 中它不正确(字节 00 01 00 00)。
所以我的疑问是:
- 这种行为正常吗?
- 为什么会发生?
- 在所有 Linux 发行版和体系结构中都以这种方式发生吗?
- 我可以只反转整个文件(包括二进制文件的其余部分)中的字节吗?
- 有没有一种简单或正确的方法来纠正字节顺序?
我想让我的程序灵活地在任何 Linux 发行版或架构中运行。感谢您提前提供帮助。
解决方案
推荐阅读
- r - 将多个数据框导出到多个 Excel 工作表
- angular - 角路由打开错误的组件
- python - 多维输出的 Softmax 和损失函数
- git - `git log --pretty=format` 可以通过正则表达式转换输出吗?
- jquery - 关于 jQuery 值更改的警报
- android - android + tflite:直接从 GPU 内存中获取相机直播图像到 tflite 模型(更快)
- javascript - 在部分 jira 中执行 AJS
- javascript - 获取数据后尝试渲染组件时出现跨域错误
- android - Kotlin File.readtext() 调用使 Android 应用程序崩溃
- sockets - 如果我一直在套接字中写入并且有时在我的后端读取会发生什么