C 为什么在ELF二进制文件中,字节以两个为一组进行反转
我正在尝试创建和ELF格式的标题编辑器。在开发过程中,我注意到在二进制组中,两个字节总是颠倒的 这里有一个hextump示例(我将其命名为hextump1以供参考) 例如,在前4个字节中,我期望的是“7f45 4c46”,而不是“457f 464c” 当我使用-C参数运行hextump时,我得到了预期的转储。(我将此hextump称为hextump2以供参考) 二进制文件保存为hexdump1,这使得在C中很难读取 只是一些额外的信息。这不是endian问题,因为相关数据(例如整数)在hexdump2中以小endian格式正确,而在hexdump1中不正确。例如,在偏移量字节0x14中,启动一个32位Int(值为1),在hextump2中,它由字节01 00 00正确表示,在hextump1中,它不正确(字节00 01 00) 因此,我的疑问是:C 为什么在ELF二进制文件中,字节以两个为一组进行反转,c,linux,binary,elf,C,Linux,Binary,Elf,我正在尝试创建和ELF格式的标题编辑器。在开发过程中,我注意到在二进制组中,两个字节总是颠倒的 这里有一个hextump示例(我将其命名为hextump1以供参考) 例如,在前4个字节中,我期望的是“7f45 4c46”,而不是“457f 464c” 当我使用-C参数运行hextump时,我得到了预期的转储。(我将此hextump称为hextump2以供参考) 二进制文件保存为hexdump1,这使得在C中很难读取 只是一些额外的信息。这不是endian问题,因为相关数据(例如整数)在hexdu
根据尾数,大小大于1的字段将被反转或不反转。小尾数硬件?请看这两个十六进制转储都是正确的,因为
7f45
确实是457F
的小端表示。只是第一次转储将数据显示为16位值,而在第二次转储中,数据以字节方式显示。Thx作为回复。当我在C中读取二进制文件时,我得到的字节也和hexdump1中的一样。它也是以16位块读取的吗(为什么是16位而不是其他值)?文件中的前16个字节应为无符号字符数组。字符数组的顺序不应该独立于endianess?Thx进行回复。好吧,我开始接受这是永无止境。然而,这种行为对我来说仍然很奇怪。查看ELF格式头“/usr/includes/ELF.h”,前16个字节是无符号字符数组。据我所知(或我认为我所知),字符数组将以相同的顺序存储在big和little-endian中。但是在这里,它是以两个字节为一组进行更改的(为什么是两个字节)。此外,这个“2字节”结尾改变了一个整数的正确位置,如0x14所示。
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
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...............|
e_ident[EI_DATA]