Rev 1 | Rev 11 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 10 | ||
---|---|---|---|
Line 116... | Line 116... | ||
116 | 116 | ||
117 | typedef struct image_trailer_s |
117 | typedef struct image_trailer_s |
118 | { |
118 | { |
119 | unsigned __int32 cksum; // checksum from start of header to start of trailer |
119 | unsigned __int32 cksum; // checksum from start of header to start of trailer |
120 | } image_trailer_t; |
120 | } image_trailer_t; |
- | 121 | ||
- | 122 | ||
- | 123 | ||
- | 124 | ||
- | 125 | ||
- | 126 | ||
- | 127 | // Executable and Linkable Format master header structure type definition |
|
- | 128 | typedef struct elf32_header_s |
|
- | 129 | { |
|
- | 130 | unsigned char magic[4]; // offset 0: "\x07" + "ELF" |
|
- | 131 | unsigned char platform_size; // offset 4: 1 = 32-bit, 2 = 64-bit |
|
- | 132 | unsigned char endianness; // offset 5: 1 = little endian, 2 = big endian |
|
- | 133 | unsigned char header_version; // offset 6: typically 1 |
|
- | 134 | unsigned char os_abi; // offset 7: 0 = SysV, 1 = HP/UX, 2 = NetBSD, 3 = Linux, 4 = GNU/Hurd, 6 = Solaris, 7 = AIX, 8 = IRIX, 9 = FreeBSD, 10 = Tru64, 11 = Novell, 12 = OpenBSD, 13 = OpenVMS, 14 = NonStop kernel, 15 = AROS, 16 = FenixOS, 17 = Nuxi CloudABI, 18 = OpenVOS |
|
- | 135 | unsigned char spare[8]; // offset 8: zeroes |
|
- | 136 | unsigned __int16 type; // offset 16: 1 = relocatable, 2 = executable, 3 = shared, 4 = core dump |
|
- | 137 | unsigned __int16 instruction_set; // offset 18: 2 = Sparc, 3 = i386, 8 = MIPS, 20 = PowerPC, 40 = ARM, 42 = SuperH, 50 = IA-64, 62 = x86_64, 183 = AArch64, 243 = RISC-V |
|
- | 138 | unsigned __int32 elf_version; // offset 20: typically 1 |
|
- | 139 | unsigned __int32 entrypoint_offset; // offset 24: offset to program entrypoint |
|
- | 140 | unsigned __int32 program_header_table_offset; // offset 28: offset to program header table |
|
- | 141 | unsigned __int32 section_header_table_offset; // offset 32: offset to section header table |
|
- | 142 | unsigned __int32 flags; // offset 36: flags (architecture-dependent, none for x86) |
|
- | 143 | unsigned __int16 header_size; // offset 40: size of ELF header, 52 for 32-bit ELF and 64 for 64-bit ELF -- DO NOT USE sizeof() ON THE elf_header_s STRUCT BECAUSE OF THE UNION! WRITE THE CORRECT SIZE YOURSELF! |
|
- | 144 | unsigned __int16 program_header_item_size; // offset 42: size of an entry in the program header table |
|
- | 145 | unsigned __int16 program_header_table_len; // offset 44: number of entries in the program header table |
|
- | 146 | unsigned __int16 section_header_item_size; // offset 46: size of an entry in the section header table |
|
- | 147 | unsigned __int16 section_header_table_len; // offset 48: number of entries in the section header table |
|
- | 148 | unsigned __int16 section_header_names_idx; // offset 50: index of the entry in the section header table that contains the section names |
|
- | 149 | } elf32_header_t; |
|
- | 150 | ||
- | 151 | typedef struct elf64_header_s |
|
- | 152 | { |
|
- | 153 | unsigned char magic[4]; // offset 0: "\x07" + "ELF" |
|
- | 154 | unsigned char platform_size; // offset 4: 1 = 32-bit, 2 = 64-bit |
|
- | 155 | unsigned char endianness; // offset 5: 1 = little endian, 2 = big endian |
|
- | 156 | unsigned char header_version; // offset 6: typically 1 |
|
- | 157 | unsigned char os_abi; // offset 7: 0 = SysV, 1 = HP/UX, 2 = NetBSD, 3 = Linux, 4 = GNU/Hurd, 6 = Solaris, 7 = AIX, 8 = IRIX, 9 = FreeBSD, 10 = Tru64, 11 = Novell, 12 = OpenBSD, 13 = OpenVMS, 14 = NonStop kernel, 15 = AROS, 16 = FenixOS, 17 = Nuxi CloudABI, 18 = OpenVOS |
|
- | 158 | unsigned char spare[8]; // offset 8: zeroes |
|
- | 159 | unsigned __int16 type; // offset 16: 1 = relocatable, 2 = executable, 3 = shared, 4 = core dump |
|
- | 160 | unsigned __int16 instruction_set; // offset 18: 2 = Sparc, 3 = i386, 8 = MIPS, 20 = PowerPC, 40 = ARM, 42 = SuperH, 50 = IA-64, 62 = x86_64, 183 = AArch64, 243 = RISC-V |
|
- | 161 | unsigned __int32 elf_version; // offset 20: typically 1 |
|
- | 162 | unsigned __int64 entrypoint_offset; // offset 24: program entry offset |
|
- | 163 | unsigned __int64 program_header_table_offset; // offset 32: offset to program header table |
|
- | 164 | unsigned __int64 section_header_table_offset; // offset 40: offset to section header table |
|
- | 165 | unsigned __int32 flags; // offset 48: flags (architecture-dependent, none for x86) |
|
- | 166 | unsigned __int16 header_size; // offset 52: size of ELF header, 52 for 32-bit ELF and 64 for 64-bit ELF |
|
- | 167 | unsigned __int16 program_header_item_size; // offset 54: size of an entry in the program header table |
|
- | 168 | unsigned __int16 program_header_table_len; // offset 56: number of entries in the program header table |
|
- | 169 | unsigned __int16 section_header_item_size; // offset 58: size of an entry in the section header table |
|
- | 170 | unsigned __int16 section_header_table_len; // offset 60: number of entries in the section header table |
|
- | 171 | unsigned __int16 section_header_names_idx; // offset 62: index of the entry in the section header table that contains the section names |
|
- | 172 | } elf64_header_t; |
|
- | 173 | ||
- | 174 | ||
- | 175 | // Executable and Linkable Format program header structure type definition |
|
- | 176 | typedef struct elf32_program_header_s |
|
- | 177 | { |
|
- | 178 | unsigned __int32 segment_type; // offset 0: type of segment (0: unused table entry, 1: loadable, 2: dynamic linking information, 3: interpreter information, 4: auxiliary information, 5: reserved, 6: this very segment, 7: TLS template) |
|
- | 179 | unsigned __int32 file_offset; // offset 4: file offset of this segment |
|
- | 180 | unsigned __int32 virtual_addr; // offset 8: virtual address where this segment should be mapped in memory |
|
- | 181 | unsigned __int32 physical_addr; // offset 12: on systems where this is relevant, PHYSICAL address where this segment should be mapped in memory |
|
- | 182 | unsigned __int32 size_in_file; // offset 16: size of this segment in the ELF file (may be zero) |
|
- | 183 | unsigned __int32 size_in_memory; // offset 20: size of this segment in memory (may be zero) |
|
- | 184 | unsigned __int32 segment_flags; // offset 24: bitmap of segment flags (1: executable, 2: writable, 4: readable) |
|
- | 185 | unsigned __int32 alignment; // offset 28: memory alignment (0 or 1 mean non alignment, else must be a power of 2 where virtual_addr == file_offset % alignment) |
|
- | 186 | } elf32_program_header_t; |
|
- | 187 | typedef struct elf64_program_header_s |
|
- | 188 | { |
|
- | 189 | unsigned __int32 segment_type; // offset 0: type of segment (0: unused table entry, 1: loadable, 2: dynamic linking information, 3: interpreter information, 4: auxiliary information, 5: reserved, 6: this very segment, 7: TLS template) |
|
- | 190 | unsigned __int32 segment_flags; // offset 4: bitmap of segment flags (1: executable, 2: writable, 4: readable) |
|
- | 191 | unsigned __int64 file_offset; // offset 8: file offset of this segment |
|
- | 192 | unsigned __int64 virtual_addr; // offset 16: virtual address where this segment should be mapped in memory |
|
- | 193 | unsigned __int64 physical_addr; // offset 24: on systems where this is relevant, PHYSICAL address where this segment should be mapped in memory |
|
- | 194 | unsigned __int64 size_in_file; // offset 32: size of this segment in the ELF file (may be zero) |
|
- | 195 | unsigned __int64 size_in_memory; // offset 40: size of this segment in memory (may be zero) |
|
- | 196 | unsigned __int64 alignment; // offset 48: memory alignment (0 or 1 mean non alignment, else must be a power of 2 where virtual_addr == file_offset % alignment) |
|
- | 197 | } elf64_program_header_t; |
|
- | 198 | ||
- | 199 | ||
- | 200 | // Executable and Linkable Format section header structure type definition |
|
- | 201 | typedef struct elf32_section_header_s |
|
- | 202 | { |
|
- | 203 | unsigned __int32 name_offset; // offset 0: offset in the string table of the name of this section |
|
- | 204 | unsigned __int32 type; // offset 4: |
|
- | 205 | unsigned __int32 flags; // offset 8: |
|
- | 206 | unsigned __int32 virtual_addr; // offset 12: address in virtual memory where this section may be loaded |
|
- | 207 | unsigned __int32 file_offset; // offset 16: offset of this section in the ELF file |
|
- | 208 | unsigned __int32 size; // offset 20: size of this section |
|
- | 209 | unsigned __int32 linked_index; // offset 24: optional section index of an associated section |
|
- | 210 | unsigned __int32 info; // offset 28: optional extra information |
|
- | 211 | unsigned __int32 alignment; // offset 32: required memory alignment (must be a power of 2) |
|
- | 212 | unsigned __int32 entry_size; // offset 36: for table-like sections, size of an element in the table |
|
- | 213 | } elf32_section_header_t; |
|
- | 214 | typedef struct elf64_section_header_s |
|
- | 215 | { |
|
- | 216 | unsigned __int32 name_offset; // offset 0: offset in the string table of the name of this section |
|
- | 217 | unsigned __int32 type; // offset 4: |
|
- | 218 | unsigned __int64 flags; // offset 8: |
|
- | 219 | unsigned __int64 virtual_addr; // offset 16: address in virtual memory where this section may be loaded |
|
- | 220 | unsigned __int64 file_offset; // offset 24: offset of this section in the ELF file |
|
- | 221 | unsigned __int64 size; // offset 32: size of this section |
|
- | 222 | unsigned __int32 linked_index; // offset 40: optional section index of an associated section |
|
- | 223 | unsigned __int32 info; // offset 44: optional extra information |
|
- | 224 | unsigned __int64 alignment; // offset 48: required memory alignment (must be a power of 2) |
|
- | 225 | unsigned __int64 entry_size; // offset 56: for table-like sections, size of an element in the table |
|
- | 226 | } elf64_section_header_t; |
|
- | 227 | ||
- | 228 | ||
- | 229 | // Executable and Linkable Format dynamic section entry structure type definition |
|
- | 230 | typedef struct elf32_dynamic_section_entry_s |
|
- | 231 | { |
|
- | 232 | __int32 tag; // dynamic entry type (one of ELF_DT_xxx #defines) |
|
- | 233 | unsigned __int32 integer_or_pointer; // value as integer |
|
- | 234 | } elf32_dynamic_section_entry_t; |
|
- | 235 | typedef struct elf32_dynamic_section_entry_s |
|
- | 236 | { |
|
- | 237 | __int64 tag; // dynamic entry type (one of ELF_DT_xxx #defines) |
|
- | 238 | unsigned __int64 integer_or_pointer; // value as intege |
|
- | 239 | } elf64_dynamic_section_entry_t; |