为什么在此 elf 文件中将目标 OS 设置为 HP-UX 而不是 Linux?

Why the target OS is set to HP-UX instead of Linux in this elf file?

来自this wiki

表示偏移量 7 处的数字标识目标 OS。

我已经为 linux 机器编译了一个 c 程序并检查了生成文件的 elf header(前 64 个字节):

> xxd -l 64 helloworld
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0300 3e00 0100 0000 8012 0000 0000 0000  ..>.............
00000020: 4000 0000 0000 0000 183f 0000 0000 0000  @........?......
00000030: 0000 0000 4000 3800 0d00 4000 1f00 1e00  ....@.8...@.....

为什么我得到第 7 个字节的 01?不应该是03吗?

来自 binutils header 描述:

  35 #define EI_MAG0     0   /* File identification byte 0 index */
  36 #define ELFMAG0        0x7F /* Magic number byte 0 */
  37 
  38 #define EI_MAG1     1   /* File identification byte 1 index */
  39 #define ELFMAG1         'E' /* Magic number byte 1 */
  40 
  41 #define EI_MAG2     2   /* File identification byte 2 index */
  42 #define ELFMAG2         'L' /* Magic number byte 2 */
  43 
  44 #define EI_MAG3     3   /* File identification byte 3 index */
  45 #define ELFMAG3         'F' /* Magic number byte 3 */
  46 
  47 #define EI_CLASS    4   /* File class */
  48 #define ELFCLASSNONE          0 /* Invalid class */
  49 #define ELFCLASS32        1 /* 32-bit objects */
  50 #define ELFCLASS64        2 /* 64-bit objects */
  51 
  52 #define EI_DATA     5   /* Data encoding */
  53 #define ELFDATANONE       0 /* Invalid data encoding */
  54 #define ELFDATA2LSB       1 /* 2's complement, little endian */
  55 #define ELFDATA2MSB       2 /* 2's complement, big endian */
  56 
  57 #define EI_VERSION  6   /* File version */
  58 
  59 #define EI_OSABI    7   /* Operating System/ABI indication */
  60 #define ELFOSABI_NONE         0 /* UNIX System V ABI */
  61 #define ELFOSABI_HPUX         1 /* HP-UX operating system */
  62 #define ELFOSABI_NETBSD       2 /* NetBSD */
  63 #define ELFOSABI_GNU          3 /* GNU */
  64 #define ELFOSABI_LINUX        3 /* Alias for ELFOSABI_GNU */
  65 #define ELFOSABI_SOLARIS      6 /* Solaris */
  66 #define ELFOSABI_AIX          7 /* AIX */
  67 #define ELFOSABI_IRIX         8 /* IRIX */
  68 #define ELFOSABI_FREEBSD      9 /* FreeBSD */
  ...

但是为什么有人要在小精灵身上寻找比特header?如果您想要文字说明 header,请使用工具!

readelf -h a.out

ELF Header:
  Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - GNU
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x4013f0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          486392 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         11
  Size of section headers:           64 (bytes)
  Number of section headers:         38
  Section header string table index: 37

Why am I getting 01 for the 7th byte?

偏移量7处的字节为第8个字节,即0,即System V1 用于 e_ident[EI_VERSION],设置为 1 表示“为 ELF 的原始版本和当前版本设置为 1”。

7f45 4c46 0201 0100 ...
                 ^^ - OSABI
               ^^ - VERSION
            ^^  DATA
          ^^ CLASS
^^^^^^^^^ - MAG{0..3}

Shouldn't it be 03?

正如您的 link 所解释的那样,“无论目标平台如何,它通常都设置为 0”。