C 为什么在ELF二进制文件中,字节以两个为一组进行反转

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

我正在尝试创建和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)

因此,我的疑问是:

  • 这种行为正常吗
  • 为什么会这样
  • 在所有Linux发行版和体系结构中都是这样吗
  • 我可以反转整个文件中的字节(包括二进制文件的其余部分)吗
  • 有没有简单或正确的方法来纠正字节顺序
  • 我想让我的程序灵活地运行在任何Linux发行版或体系结构中。 请提前向Thx寻求帮助。

    定义elf二进制文件的endianess


    根据尾数,大小大于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]