Rev 10 | Rev 16 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 10 | Rev 11 | ||
|---|---|---|---|
| Line 125... | Line 125... | ||
| 125 | 125 | ||
| 126 | 126 | ||
| 127 | // Executable and Linkable Format master header structure type definition | 127 | // Executable and Linkable Format master header structure type definition | 
| 128 | typedef struct elf32_header_s | 128 | typedef struct elf32_header_s | 
| 129 | { | 129 | { | 
| 130 | unsigned char magic[4]; // offset 0: " | 130 | unsigned char magic[4]; // offset 0: "\x7f" + "ELF" | 
| - | 131 | #pragma verify match_var_int("magic[0]", "0x7f") | |
| - | 132 | #pragma verify match_var_int("magic[1]", "0x45") | |
| - | 133 | #pragma verify match_var_int("magic[2]", "0x4c") | |
| - | 134 | #pragma verify match_var_int("magic[3]", "0x46") | |
| 131 | unsigned char platform_size; // offset 4: 1 = 32-bit, 2 = 64-bit | 135 | unsigned char platform_size; // offset 4: 1 = 32-bit, 2 = 64-bit | 
| - | 136 | #pragma verify match_var_int("platform_size", "1") | |
| 132 | unsigned char endianness; // offset 5: 1 = little endian, 2 = big endian | 137 | unsigned char endianness; // offset 5: 1 = little endian, 2 = big endian | 
| 133 | unsigned char header_version; // offset 6: typically 1 | 138 | 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 | 139 | 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 | 140 | unsigned char spare[8]; // offset 8: zeroes | 
| 136 | unsigned __int16 type; // offset 16: 1 = relocatable, 2 = executable, 3 = shared, 4 = core dump | 141 | unsigned __int16 type; // offset 16: 1 = relocatable, 2 = executable, 3 = shared, 4 = core dump | 
| Line 147... | Line 152... | ||
| 147 | unsigned __int16 section_header_table_len; // offset 48: number of entries in the section header table | 152 | 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 | 153 | 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; | 154 | } elf32_header_t; | 
| 150 | 155 | ||
| 151 | typedef struct elf64_header_s | 156 | typedef struct elf64_header_s | 
| 152 | 
 | 157 | { | 
| 153 | 
 | 158 | unsigned char magic[4]; // offset 0: "\x07" + "ELF" | 
| - | 159 | #pragma verify match_var_int("magic[0]", "0x7f") | |
| - | 160 | #pragma verify match_var_int("magic[1]", "0x45") | |
| - | 161 | #pragma verify match_var_int("magic[2]", "0x4c") | |
| - | 162 | #pragma verify match_var_int("magic[3]", "0x46") | |
| 154 | 
 | 163 | unsigned char platform_size; // offset 4: 1 = 32-bit, 2 = 64-bit | 
| - | 164 | #pragma verify match_var_int("platform_size", "2") | |
| 155 | 
 | 165 | unsigned char endianness; // offset 5: 1 = little endian, 2 = big endian | 
| 156 | 
 | 166 | unsigned char header_version; // offset 6: typically 1 | 
| 157 | 
 | 167 | 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 | 
 | 168 | unsigned char spare[8]; // offset 8: zeroes | 
| 159 | 
 | 169 | unsigned __int16 type; // offset 16: 1 = relocatable, 2 = executable, 3 = shared, 4 = core dump | 
| 160 | 
 | 170 | 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 | 
 | 171 | unsigned __int32 elf_version; // offset 20: typically 1 | 
| 162 | 
 | 172 | unsigned __int64 entrypoint_offset; // offset 24: program entry offset | 
| 163 | 
 | 173 | unsigned __int64 program_header_table_offset; // offset 32: offset to program header table | 
| 164 | 
 | 174 | unsigned __int64 section_header_table_offset; // offset 40: offset to section header table | 
| 165 | 
 | 175 | unsigned __int32 flags; // offset 48: flags (architecture-dependent, none for x86) | 
| 166 | 
 | 176 | unsigned __int16 header_size; // offset 52: size of ELF header, 52 for 32-bit ELF and 64 for 64-bit ELF | 
| 167 | 
 | 177 | unsigned __int16 program_header_item_size; // offset 54: size of an entry in the program header table | 
| 168 | 
 | 178 | unsigned __int16 program_header_table_len; // offset 56: number of entries in the program header table | 
| 169 | 
 | 179 | unsigned __int16 section_header_item_size; // offset 58: size of an entry in the section header table | 
| 170 | 
 | 180 | unsigned __int16 section_header_table_len; // offset 60: number of entries in the section header table | 
| 171 | 
 | 181 | 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; | 182 | } elf64_header_t; | 
| 173 | 183 | ||
| 174 | 184 | ||
| 175 | // Executable and Linkable Format program header structure type definition | 185 | // Executable and Linkable Format program header structure type definition | 
| 176 | typedef struct elf32_program_header_s | 186 | typedef struct elf32_program_header_s | 
| 177 | { | 187 | { | 
| 178 | 
 | 188 | 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 | 
 | 189 | unsigned __int32 file_offset; // offset 4: file offset of this segment | 
| 180 | 
 | 190 | unsigned __int32 virtual_addr; // offset 8: virtual address where this segment should be mapped in memory | 
| 181 | 
 | 191 | unsigned __int32 physical_addr; // offset 12: on systems where this is relevant, PHYSICAL address where this segment should be mapped in memory | 
| 182 | 
 | 192 | unsigned __int32 size_in_file; // offset 16: size of this segment in the ELF file (may be zero) | 
| 183 | 
 | 193 | unsigned __int32 size_in_memory; // offset 20: size of this segment in memory (may be zero) | 
| 184 | 
 | 194 | unsigned __int32 segment_flags; // offset 24: bitmap of segment flags (1: executable, 2: writable, 4: readable) | 
| 185 | 
 | 195 | 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 | 
 | 196 | } elf32_program_header_t; | 
| 187 | typedef struct elf64_program_header_s | 197 | typedef struct elf64_program_header_s | 
| 188 | { | 198 | { | 
| 189 | 
 | 199 | 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 | 
 | 200 | unsigned __int32 segment_flags; // offset 4: bitmap of segment flags (1: executable, 2: writable, 4: readable) | 
| 191 | 
 | 201 | unsigned __int64 file_offset; // offset 8: file offset of this segment | 
| 192 | 
 | 202 | unsigned __int64 virtual_addr; // offset 16: virtual address where this segment should be mapped in memory | 
| 193 | 
 | 203 | unsigned __int64 physical_addr; // offset 24: on systems where this is relevant, PHYSICAL address where this segment should be mapped in memory | 
| 194 | 
 | 204 | unsigned __int64 size_in_file; // offset 32: size of this segment in the ELF file (may be zero) | 
| 195 | 
 | 205 | unsigned __int64 size_in_memory; // offset 40: size of this segment in memory (may be zero) | 
| 196 | 
 | 206 | 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 | 
 | 207 | } elf64_program_header_t; | 
| 198 | 208 | ||
| 199 | 209 | ||
| 200 | // Executable and Linkable Format section header structure type definition | 210 | // Executable and Linkable Format section header structure type definition | 
| 201 | typedef struct elf32_section_header_s | 211 | typedef struct elf32_section_header_s | 
| 202 | { | 212 | { | 
| 203 | 
 | 213 | unsigned __int32 name_offset; // offset 0: offset in the string table of the name of this section | 
| 204 | 
 | 214 | unsigned __int32 type; // offset 4: | 
| 205 | 
 | 215 | unsigned __int32 flags; // offset 8: | 
| 206 | 
 | 216 | unsigned __int32 virtual_addr; // offset 12: address in virtual memory where this section may be loaded | 
| 207 | 
 | 217 | unsigned __int32 file_offset; // offset 16: offset of this section in the ELF file | 
| 208 | 
 | 218 | unsigned __int32 size; // offset 20: size of this section | 
| 209 | 
 | 219 | unsigned __int32 linked_index; // offset 24: optional section index of an associated section | 
| 210 | 
 | 220 | unsigned __int32 info; // offset 28: optional extra information | 
| 211 | 
 | 221 | unsigned __int32 alignment; // offset 32: required memory alignment (must be a power of 2) | 
| 212 | 
 | 222 | unsigned __int32 entry_size; // offset 36: for table-like sections, size of an element in the table | 
| 213 | 
 | 223 | } elf32_section_header_t; | 
| 214 | typedef struct elf64_section_header_s | 224 | typedef struct elf64_section_header_s | 
| 215 | 
 | 225 | { | 
| 216 | 
 | 226 | unsigned __int32 name_offset; // offset 0: offset in the string table of the name of this section | 
| 217 | 
 | 227 | unsigned __int32 type; // offset 4: | 
| 218 | 
 | 228 | unsigned __int64 flags; // offset 8: | 
| 219 | 
 | 229 | unsigned __int64 virtual_addr; // offset 16: address in virtual memory where this section may be loaded | 
| 220 | 
 | 230 | unsigned __int64 file_offset; // offset 24: offset of this section in the ELF file | 
| 221 | 
 | 231 | unsigned __int64 size; // offset 32: size of this section | 
| 222 | 
 | 232 | unsigned __int32 linked_index; // offset 40: optional section index of an associated section | 
| 223 | 
 | 233 | unsigned __int32 info; // offset 44: optional extra information | 
| 224 | 
 | 234 | unsigned __int64 alignment; // offset 48: required memory alignment (must be a power of 2) | 
| 225 | 
 | 235 | unsigned __int64 entry_size; // offset 56: for table-like sections, size of an element in the table | 
| 226 | 
 | 236 | } elf64_section_header_t; | 
| 227 | 237 | ||
| 228 | 238 | ||
| 229 | // Executable and Linkable Format dynamic section entry structure type definition | 239 | // Executable and Linkable Format dynamic section entry structure type definition | 
| 230 | typedef struct elf32_dynamic_section_entry_s | 240 | typedef struct elf32_dynamic_section_entry_s | 
| 231 | { | 241 | { | 
| 232 | 
 | 242 | __int32 tag; // dynamic entry type (one of ELF_DT_xxx #defines) | 
| 233 | 
 | 243 | unsigned __int32 integer_or_pointer; // value as integer | 
| 234 | 
 | 244 | } elf32_dynamic_section_entry_t; | 
| 235 | typedef struct | 245 | typedef struct elf64_dynamic_section_entry_s | 
| 236 | { | 246 | { | 
| 237 | 
 | 247 | __int64 tag; // dynamic entry type (one of ELF_DT_xxx #defines) | 
| 238 | 
 | 248 | unsigned __int64 integer_or_pointer; // value as intege | 
| 239 | 
 | 249 | } elf64_dynamic_section_entry_t; |