为什么在此 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 V
。 1
用于 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”。
来自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 V
。 1
用于 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”。