1 /** @file 2 EFI image format for PE32+. Please note some data structures are different 3 for IA-32 and Itanium-based images, look for UINTN and the #ifdef EFI_IA64 4 5 @bug Fix text - doc as defined in MSFT EFI specification. 6 7 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 8 Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR> 9 10 SPDX-License-Identifier: BSD-2-Clause-Patent 11 12 **/ 13 14 #ifndef __PE_IMAGE_H__ 15 #define __PE_IMAGE_H__ 16 17 // 18 // PE32+ Subsystem type for EFI images 19 // 20 #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10 21 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 22 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 23 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13 24 25 // 26 // BugBug: Need to get a real answer for this problem. This is not in the 27 // PE specification. 28 // 29 // A SAL runtime driver does not get fixed up when a transition to 30 // virtual mode is made. In all other cases it should be treated 31 // like a EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER image 32 // 33 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13 34 35 // 36 // PE32+ Machine type for EFI images 37 // 38 #define IMAGE_FILE_MACHINE_I386 0x014c 39 #define IMAGE_FILE_MACHINE_EBC 0x0EBC 40 #define IMAGE_FILE_MACHINE_X64 0x8664 41 #define IMAGE_FILE_MACHINE_ARM 0x01c0 // Thumb only 42 #define IMAGE_FILE_MACHINE_ARMT 0x01c2 // 32bit Mixed ARM and Thumb/Thumb 2 Little Endian 43 #define IMAGE_FILE_MACHINE_ARM64 0xAA64 // 64bit ARM Architecture, Little Endian 44 45 // 46 // Support old names for backward compatible 47 // 48 #define EFI_IMAGE_MACHINE_IA32 IMAGE_FILE_MACHINE_I386 49 #define EFI_IMAGE_MACHINE_EBC IMAGE_FILE_MACHINE_EBC 50 #define EFI_IMAGE_MACHINE_X64 IMAGE_FILE_MACHINE_X64 51 #define EFI_IMAGE_MACHINE_ARMT IMAGE_FILE_MACHINE_ARMT 52 #define EFI_IMAGE_MACHINE_AARCH64 IMAGE_FILE_MACHINE_ARM64 53 54 #define EFI_IMAGE_DOS_SIGNATURE 0x5A4D // MZ 55 #define EFI_IMAGE_OS2_SIGNATURE 0x454E // NE 56 #define EFI_IMAGE_OS2_SIGNATURE_LE 0x454C // LE 57 #define EFI_IMAGE_NT_SIGNATURE 0x00004550 // PE00 58 #define EFI_IMAGE_EDOS_SIGNATURE 0x44454550 // PEED 59 60 /// 61 /// PE images can start with an optional DOS header, so if an image is run 62 /// under DOS it can print an error message. 63 /// 64 typedef struct { 65 UINT16 e_magic; // Magic number 66 UINT16 e_cblp; // Bytes on last page of file 67 UINT16 e_cp; // Pages in file 68 UINT16 e_crlc; // Relocations 69 UINT16 e_cparhdr; // Size of header in paragraphs 70 UINT16 e_minalloc; // Minimum extra paragraphs needed 71 UINT16 e_maxalloc; // Maximum extra paragraphs needed 72 UINT16 e_ss; // Initial (relative) SS value 73 UINT16 e_sp; // Initial SP value 74 UINT16 e_csum; // Checksum 75 UINT16 e_ip; // Initial IP value 76 UINT16 e_cs; // Initial (relative) CS value 77 UINT16 e_lfarlc; // File address of relocation table 78 UINT16 e_ovno; // Overlay number 79 UINT16 e_res[4]; // Reserved words 80 UINT16 e_oemid; // OEM identifier (for e_oeminfo) 81 UINT16 e_oeminfo; // OEM information; e_oemid specific 82 UINT16 e_res2[10]; // Reserved words 83 UINT32 e_lfanew; // File address of new exe header 84 } EFI_IMAGE_DOS_HEADER; 85 86 /// 87 /// File header format. 88 /// 89 typedef struct { 90 UINT16 Machine; 91 UINT16 NumberOfSections; 92 UINT32 TimeDateStamp; 93 UINT32 PointerToSymbolTable; 94 UINT32 NumberOfSymbols; 95 UINT16 SizeOfOptionalHeader; 96 UINT16 Characteristics; 97 } EFI_IMAGE_FILE_HEADER; 98 99 #define EFI_IMAGE_SIZEOF_FILE_HEADER 20 100 101 #define EFI_IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. 102 #define EFI_IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). 103 #define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. 104 #define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. 105 #define EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // Supports addresses > 2-GB 106 #define EFI_IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. 107 #define EFI_IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. 108 #define EFI_IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file 109 #define EFI_IMAGE_FILE_SYSTEM 0x1000 // System File. 110 #define EFI_IMAGE_FILE_DLL 0x2000 // File is a DLL. 111 #define EFI_IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. 112 #define EFI_IMAGE_FILE_MACHINE_UNKNOWN 0 113 #define EFI_IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. 114 #define EFI_IMAGE_FILE_MACHINE_R3000 0x162 // MIPS* little-endian, 0540 big-endian 115 #define EFI_IMAGE_FILE_MACHINE_R4000 0x166 // MIPS* little-endian 116 #define EFI_IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP* 117 #define EFI_IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM* PowerPC Little-Endian 118 #define EFI_IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine 119 // 120 // * Other names and brands may be claimed as the property of others. 121 // 122 123 /// 124 /// Directory format. 125 /// 126 typedef struct { 127 UINT32 VirtualAddress; 128 UINT32 Size; 129 } EFI_IMAGE_DATA_DIRECTORY; 130 131 #define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16 132 133 typedef struct { 134 UINT16 Magic; 135 UINT8 MajorLinkerVersion; 136 UINT8 MinorLinkerVersion; 137 UINT32 SizeOfCode; 138 UINT32 SizeOfInitializedData; 139 UINT32 SizeOfUninitializedData; 140 UINT32 AddressOfEntryPoint; 141 UINT32 BaseOfCode; 142 UINT32 BaseOfData; 143 UINT32 BaseOfBss; 144 UINT32 GprMask; 145 UINT32 CprMask[4]; 146 UINT32 GpValue; 147 } EFI_IMAGE_ROM_OPTIONAL_HEADER; 148 149 #define EFI_IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 150 #define EFI_IMAGE_SIZEOF_ROM_OPTIONAL_HEADER sizeof (EFI_IMAGE_ROM_OPTIONAL_HEADER) 151 152 typedef struct { 153 EFI_IMAGE_FILE_HEADER FileHeader; 154 EFI_IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; 155 } EFI_IMAGE_ROM_HEADERS; 156 157 /// 158 /// @attention 159 /// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64 160 /// are for use ONLY by tools. All proper EFI code MUST use 161 /// EFI_IMAGE_OPTIONAL_HEADER ONLY!!! 162 /// 163 #define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b 164 165 typedef struct { 166 // 167 // Standard fields. 168 // 169 UINT16 Magic; 170 UINT8 MajorLinkerVersion; 171 UINT8 MinorLinkerVersion; 172 UINT32 SizeOfCode; 173 UINT32 SizeOfInitializedData; 174 UINT32 SizeOfUninitializedData; 175 UINT32 AddressOfEntryPoint; 176 UINT32 BaseOfCode; 177 UINT32 BaseOfData; 178 // 179 // NT additional fields. 180 // 181 UINT32 ImageBase; 182 UINT32 SectionAlignment; 183 UINT32 FileAlignment; 184 UINT16 MajorOperatingSystemVersion; 185 UINT16 MinorOperatingSystemVersion; 186 UINT16 MajorImageVersion; 187 UINT16 MinorImageVersion; 188 UINT16 MajorSubsystemVersion; 189 UINT16 MinorSubsystemVersion; 190 UINT32 Win32VersionValue; 191 UINT32 SizeOfImage; 192 UINT32 SizeOfHeaders; 193 UINT32 CheckSum; 194 UINT16 Subsystem; 195 UINT16 DllCharacteristics; 196 UINT32 SizeOfStackReserve; 197 UINT32 SizeOfStackCommit; 198 UINT32 SizeOfHeapReserve; 199 UINT32 SizeOfHeapCommit; 200 UINT32 LoaderFlags; 201 UINT32 NumberOfRvaAndSizes; 202 EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES]; 203 } EFI_IMAGE_OPTIONAL_HEADER32; 204 205 /// 206 /// @attention 207 /// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64 208 /// are for use ONLY by tools. All proper EFI code MUST use 209 /// EFI_IMAGE_OPTIONAL_HEADER ONLY!!! 210 /// 211 #define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b 212 213 typedef struct { 214 // 215 // Standard fields. 216 // 217 UINT16 Magic; 218 UINT8 MajorLinkerVersion; 219 UINT8 MinorLinkerVersion; 220 UINT32 SizeOfCode; 221 UINT32 SizeOfInitializedData; 222 UINT32 SizeOfUninitializedData; 223 UINT32 AddressOfEntryPoint; 224 UINT32 BaseOfCode; 225 // 226 // NT additional fields. 227 // 228 UINT64 ImageBase; 229 UINT32 SectionAlignment; 230 UINT32 FileAlignment; 231 UINT16 MajorOperatingSystemVersion; 232 UINT16 MinorOperatingSystemVersion; 233 UINT16 MajorImageVersion; 234 UINT16 MinorImageVersion; 235 UINT16 MajorSubsystemVersion; 236 UINT16 MinorSubsystemVersion; 237 UINT32 Win32VersionValue; 238 UINT32 SizeOfImage; 239 UINT32 SizeOfHeaders; 240 UINT32 CheckSum; 241 UINT16 Subsystem; 242 UINT16 DllCharacteristics; 243 UINT64 SizeOfStackReserve; 244 UINT64 SizeOfStackCommit; 245 UINT64 SizeOfHeapReserve; 246 UINT64 SizeOfHeapCommit; 247 UINT32 LoaderFlags; 248 UINT32 NumberOfRvaAndSizes; 249 EFI_IMAGE_DATA_DIRECTORY DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES]; 250 } EFI_IMAGE_OPTIONAL_HEADER64; 251 252 /// 253 /// @attention 254 /// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY 255 /// by tools. All proper EFI code MUST use EFI_IMAGE_NT_HEADERS ONLY!!! 256 /// 257 typedef struct { 258 UINT32 Signature; 259 EFI_IMAGE_FILE_HEADER FileHeader; 260 EFI_IMAGE_OPTIONAL_HEADER32 OptionalHeader; 261 } EFI_IMAGE_NT_HEADERS32; 262 263 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER sizeof (EFI_IMAGE_NT_HEADERS32) 264 265 typedef struct { 266 UINT32 Signature; 267 EFI_IMAGE_FILE_HEADER FileHeader; 268 EFI_IMAGE_OPTIONAL_HEADER64 OptionalHeader; 269 } EFI_IMAGE_NT_HEADERS64; 270 271 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64) 272 273 // 274 // Subsystem Values 275 // 276 #define EFI_IMAGE_SUBSYSTEM_UNKNOWN 0 277 #define EFI_IMAGE_SUBSYSTEM_NATIVE 1 278 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI 2 279 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI 3. 280 #define EFI_IMAGE_SUBSYSTEM_OS2_CUI 5 281 #define EFI_IMAGE_SUBSYSTEM_POSIX_CUI 7 282 283 // 284 // Directory Entries 285 // 286 #define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT 0 287 #define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT 1 288 #define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE 2 289 #define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 290 #define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY 4 291 #define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC 5 292 #define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG 6 293 #define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 294 #define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 295 #define EFI_IMAGE_DIRECTORY_ENTRY_TLS 9 296 #define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 297 298 // 299 // Section header format. 300 // 301 #define EFI_IMAGE_SIZEOF_SHORT_NAME 8 302 303 typedef struct { 304 UINT8 Name[EFI_IMAGE_SIZEOF_SHORT_NAME]; 305 union { 306 UINT32 PhysicalAddress; 307 UINT32 VirtualSize; 308 } Misc; 309 UINT32 VirtualAddress; 310 UINT32 SizeOfRawData; 311 UINT32 PointerToRawData; 312 UINT32 PointerToRelocations; 313 UINT32 PointerToLinenumbers; 314 UINT16 NumberOfRelocations; 315 UINT16 NumberOfLinenumbers; 316 UINT32 Characteristics; 317 } EFI_IMAGE_SECTION_HEADER; 318 319 #define EFI_IMAGE_SIZEOF_SECTION_HEADER 40 320 321 #define EFI_IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. 322 #define EFI_IMAGE_SCN_CNT_CODE 0x00000020 323 #define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 324 #define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 325 326 #define EFI_IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. 327 #define EFI_IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. 328 #define EFI_IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. 329 #define EFI_IMAGE_SCN_LNK_COMDAT 0x00001000 330 331 #define EFI_IMAGE_SCN_ALIGN_1BYTES 0x00100000 332 #define EFI_IMAGE_SCN_ALIGN_2BYTES 0x00200000 333 #define EFI_IMAGE_SCN_ALIGN_4BYTES 0x00300000 334 #define EFI_IMAGE_SCN_ALIGN_8BYTES 0x00400000 335 #define EFI_IMAGE_SCN_ALIGN_16BYTES 0x00500000 336 #define EFI_IMAGE_SCN_ALIGN_32BYTES 0x00600000 337 #define EFI_IMAGE_SCN_ALIGN_64BYTES 0x00700000 338 339 #define EFI_IMAGE_SCN_MEM_DISCARDABLE 0x02000000 340 #define EFI_IMAGE_SCN_MEM_NOT_CACHED 0x04000000 341 #define EFI_IMAGE_SCN_MEM_NOT_PAGED 0x08000000 342 #define EFI_IMAGE_SCN_MEM_SHARED 0x10000000 343 #define EFI_IMAGE_SCN_MEM_EXECUTE 0x20000000 344 #define EFI_IMAGE_SCN_MEM_READ 0x40000000 345 #define EFI_IMAGE_SCN_MEM_WRITE 0x80000000 346 347 /// 348 /// Symbol format. 349 /// 350 #define EFI_IMAGE_SIZEOF_SYMBOL 18 351 352 // 353 // Section values. 354 // 355 // Symbols have a section number of the section in which they are 356 // defined. Otherwise, section numbers have the following meanings: 357 // 358 #define EFI_IMAGE_SYM_UNDEFINED (UINT16) 0 // Symbol is undefined or is common. 359 #define EFI_IMAGE_SYM_ABSOLUTE (UINT16) -1 // Symbol is an absolute value. 360 #define EFI_IMAGE_SYM_DEBUG (UINT16) -2 // Symbol is a special debug item. 361 // 362 // Type (fundamental) values. 363 // 364 #define EFI_IMAGE_SYM_TYPE_NULL 0 // no type. 365 #define EFI_IMAGE_SYM_TYPE_VOID 1 // 366 #define EFI_IMAGE_SYM_TYPE_CHAR 2 // type character. 367 #define EFI_IMAGE_SYM_TYPE_SHORT 3 // type short integer. 368 #define EFI_IMAGE_SYM_TYPE_INT 4 369 #define EFI_IMAGE_SYM_TYPE_LONG 5 370 #define EFI_IMAGE_SYM_TYPE_FLOAT 6 371 #define EFI_IMAGE_SYM_TYPE_DOUBLE 7 372 #define EFI_IMAGE_SYM_TYPE_STRUCT 8 373 #define EFI_IMAGE_SYM_TYPE_UNION 9 374 #define EFI_IMAGE_SYM_TYPE_ENUM 10 // enumeration. 375 #define EFI_IMAGE_SYM_TYPE_MOE 11 // member of enumeration. 376 #define EFI_IMAGE_SYM_TYPE_BYTE 12 377 #define EFI_IMAGE_SYM_TYPE_WORD 13 378 #define EFI_IMAGE_SYM_TYPE_UINT 14 379 #define EFI_IMAGE_SYM_TYPE_DWORD 15 380 381 // 382 // Type (derived) values. 383 // 384 #define EFI_IMAGE_SYM_DTYPE_NULL 0 // no derived type. 385 #define EFI_IMAGE_SYM_DTYPE_POINTER 1 386 #define EFI_IMAGE_SYM_DTYPE_FUNCTION 2 387 #define EFI_IMAGE_SYM_DTYPE_ARRAY 3 388 389 // 390 // Storage classes. 391 // 392 #define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION (UINT8) -1 393 #define EFI_IMAGE_SYM_CLASS_NULL 0 394 #define EFI_IMAGE_SYM_CLASS_AUTOMATIC 1 395 #define EFI_IMAGE_SYM_CLASS_EXTERNAL 2 396 #define EFI_IMAGE_SYM_CLASS_STATIC 3 397 #define EFI_IMAGE_SYM_CLASS_REGISTER 4 398 #define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF 5 399 #define EFI_IMAGE_SYM_CLASS_LABEL 6 400 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 401 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 402 #define EFI_IMAGE_SYM_CLASS_ARGUMENT 9 403 #define EFI_IMAGE_SYM_CLASS_STRUCT_TAG 10 404 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 405 #define EFI_IMAGE_SYM_CLASS_UNION_TAG 12 406 #define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION 13 407 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 408 #define EFI_IMAGE_SYM_CLASS_ENUM_TAG 15 409 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 410 #define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM 17 411 #define EFI_IMAGE_SYM_CLASS_BIT_FIELD 18 412 #define EFI_IMAGE_SYM_CLASS_BLOCK 100 413 #define EFI_IMAGE_SYM_CLASS_FUNCTION 101 414 #define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT 102 415 #define EFI_IMAGE_SYM_CLASS_FILE 103 416 #define EFI_IMAGE_SYM_CLASS_SECTION 104 417 #define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 418 419 // 420 // type packing constants 421 // 422 #define EFI_IMAGE_N_BTMASK 017 423 #define EFI_IMAGE_N_TMASK 060 424 #define EFI_IMAGE_N_TMASK1 0300 425 #define EFI_IMAGE_N_TMASK2 0360 426 #define EFI_IMAGE_N_BTSHFT 4 427 #define EFI_IMAGE_N_TSHIFT 2 428 429 // 430 // Communal selection types. 431 // 432 #define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES 1 433 #define EFI_IMAGE_COMDAT_SELECT_ANY 2 434 #define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE 3 435 #define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH 4 436 #define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 437 438 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 439 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 440 #define EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 441 442 /// 443 /// Relocation format. 444 /// 445 typedef struct { 446 UINT32 VirtualAddress; 447 UINT32 SymbolTableIndex; 448 UINT16 Type; 449 } EFI_IMAGE_RELOCATION; 450 451 #define EFI_IMAGE_SIZEOF_RELOCATION 10 452 453 // 454 // I386 relocation types. 455 // 456 #define EFI_IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary 457 #define EFI_IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address 458 #define EFI_IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address 459 #define EFI_IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address 460 #define EFI_IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included 461 #define EFI_IMAGE_REL_I386_SEG12 09 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address 462 #define EFI_IMAGE_REL_I386_SECTION 010 463 #define EFI_IMAGE_REL_I386_SECREL 011 464 #define EFI_IMAGE_REL_I386_REL32 020 // PC-relative 32-bit reference to the symbols virtual address 465 466 // 467 // x64 processor relocation types. 468 // 469 #define IMAGE_REL_AMD64_ABSOLUTE 0x0000 470 #define IMAGE_REL_AMD64_ADDR64 0x0001 471 #define IMAGE_REL_AMD64_ADDR32 0x0002 472 #define IMAGE_REL_AMD64_ADDR32NB 0x0003 473 #define IMAGE_REL_AMD64_REL32 0x0004 474 #define IMAGE_REL_AMD64_REL32_1 0x0005 475 #define IMAGE_REL_AMD64_REL32_2 0x0006 476 #define IMAGE_REL_AMD64_REL32_3 0x0007 477 #define IMAGE_REL_AMD64_REL32_4 0x0008 478 #define IMAGE_REL_AMD64_REL32_5 0x0009 479 #define IMAGE_REL_AMD64_SECTION 0x000A 480 #define IMAGE_REL_AMD64_SECREL 0x000B 481 #define IMAGE_REL_AMD64_SECREL7 0x000C 482 #define IMAGE_REL_AMD64_TOKEN 0x000D 483 #define IMAGE_REL_AMD64_SREL32 0x000E 484 #define IMAGE_REL_AMD64_PAIR 0x000F 485 #define IMAGE_REL_AMD64_SSPAN32 0x0010 486 487 /// 488 /// Based relocation format. 489 /// 490 typedef struct { 491 UINT32 VirtualAddress; 492 UINT32 SizeOfBlock; 493 } EFI_IMAGE_BASE_RELOCATION; 494 495 #define EFI_IMAGE_SIZEOF_BASE_RELOCATION 8 496 497 // 498 // Based relocation types. 499 // 500 #define EFI_IMAGE_REL_BASED_ABSOLUTE 0 501 #define EFI_IMAGE_REL_BASED_HIGH 1 502 #define EFI_IMAGE_REL_BASED_LOW 2 503 #define EFI_IMAGE_REL_BASED_HIGHLOW 3 504 #define EFI_IMAGE_REL_BASED_HIGHADJ 4 505 #define EFI_IMAGE_REL_BASED_MIPS_JMPADDR 5 506 #define EFI_IMAGE_REL_BASED_ARM_MOV32A 5 507 #define EFI_IMAGE_REL_BASED_ARM_MOV32T 7 508 #define EFI_IMAGE_REL_BASED_IA64_IMM64 9 509 #define EFI_IMAGE_REL_BASED_DIR64 10 510 511 512 /// 513 /// Line number format. 514 /// 515 typedef struct { 516 union { 517 UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. 518 UINT32 VirtualAddress; // Virtual address of line number. 519 } Type; 520 UINT16 Linenumber; // Line number. 521 } EFI_IMAGE_LINENUMBER; 522 523 #define EFI_IMAGE_SIZEOF_LINENUMBER 6 524 525 // 526 // Archive format. 527 // 528 #define EFI_IMAGE_ARCHIVE_START_SIZE 8 529 #define EFI_IMAGE_ARCHIVE_START "!<arch>\n" 530 #define EFI_IMAGE_ARCHIVE_END "`\n" 531 #define EFI_IMAGE_ARCHIVE_PAD "\n" 532 #define EFI_IMAGE_ARCHIVE_LINKER_MEMBER "/ " 533 #define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " 534 535 typedef struct { 536 UINT8 Name[16]; // File member name - `/' terminated. 537 UINT8 Date[12]; // File member date - decimal. 538 UINT8 UserID[6]; // File member user id - decimal. 539 UINT8 GroupID[6]; // File member group id - decimal. 540 UINT8 Mode[8]; // File member mode - octal. 541 UINT8 Size[10]; // File member size - decimal. 542 UINT8 EndHeader[2]; // String to end header. 543 } EFI_IMAGE_ARCHIVE_MEMBER_HEADER; 544 545 #define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 546 547 // 548 // DLL support. 549 // 550 551 /// 552 /// DLL Export Format 553 /// 554 typedef struct { 555 UINT32 Characteristics; 556 UINT32 TimeDateStamp; 557 UINT16 MajorVersion; 558 UINT16 MinorVersion; 559 UINT32 Name; 560 UINT32 Base; 561 UINT32 NumberOfFunctions; 562 UINT32 NumberOfNames; 563 UINT32 AddressOfFunctions; 564 UINT32 AddressOfNames; 565 UINT32 AddressOfNameOrdinals; 566 } EFI_IMAGE_EXPORT_DIRECTORY; 567 568 /// 569 /// DLL support. 570 /// Import Format 571 /// 572 typedef struct { 573 UINT16 Hint; 574 UINT8 Name[1]; 575 } EFI_IMAGE_IMPORT_BY_NAME; 576 577 typedef struct { 578 union { 579 UINT32 Function; 580 UINT32 Ordinal; 581 EFI_IMAGE_IMPORT_BY_NAME *AddressOfData; 582 } u1; 583 } EFI_IMAGE_THUNK_DATA; 584 585 #define EFI_IMAGE_ORDINAL_FLAG 0x80000000 586 #define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0) 587 #define EFI_IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) 588 589 typedef struct { 590 UINT32 Characteristics; 591 UINT32 TimeDateStamp; 592 UINT32 ForwarderChain; 593 UINT32 Name; 594 EFI_IMAGE_THUNK_DATA *FirstThunk; 595 } EFI_IMAGE_IMPORT_DESCRIPTOR; 596 597 /// 598 /// Debug Format 599 /// 600 #define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 601 602 typedef struct { 603 UINT32 Characteristics; 604 UINT32 TimeDateStamp; 605 UINT16 MajorVersion; 606 UINT16 MinorVersion; 607 UINT32 Type; 608 UINT32 SizeOfData; 609 UINT32 RVA; 610 UINT32 FileOffset; 611 } EFI_IMAGE_DEBUG_DIRECTORY_ENTRY; 612 613 #define CODEVIEW_SIGNATURE_NB10 0x3031424E // "NB10" 614 typedef struct { 615 UINT32 Signature; // "NB10" 616 UINT32 Unknown; 617 UINT32 Unknown2; 618 UINT32 Unknown3; 619 // 620 // Filename of .PDB goes here 621 // 622 } EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY; 623 624 #define CODEVIEW_SIGNATURE_RSDS 0x53445352 // "RSDS" 625 typedef struct { 626 UINT32 Signature; // "RSDS" 627 UINT32 Unknown; 628 UINT32 Unknown2; 629 UINT32 Unknown3; 630 UINT32 Unknown4; 631 UINT32 Unknown5; 632 // 633 // Filename of .PDB goes here 634 // 635 } EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY; 636 637 /// 638 /// Debug Data Structure defined by Apple Mach-O to Coff utility 639 /// 640 #define CODEVIEW_SIGNATURE_MTOC SIGNATURE_32('M', 'T', 'O', 'C') 641 typedef struct { 642 UINT32 Signature; ///< "MTOC" 643 EFI_GUID MachOUuid; 644 // 645 // Filename of .DLL (Mach-O with debug info) goes here 646 // 647 } EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY; 648 649 // 650 // .pdata entries for X64 651 // 652 typedef struct { 653 UINT32 FunctionStartAddress; 654 UINT32 FunctionEndAddress; 655 UINT32 UnwindInfoAddress; 656 } RUNTIME_FUNCTION; 657 658 typedef struct { 659 UINT8 Version:3; 660 UINT8 Flags:5; 661 UINT8 SizeOfProlog; 662 UINT8 CountOfUnwindCodes; 663 UINT8 FrameRegister:4; 664 UINT8 FrameRegisterOffset:4; 665 } UNWIND_INFO; 666 667 /// 668 /// Resource format. 669 /// 670 typedef struct { 671 UINT32 Characteristics; 672 UINT32 TimeDateStamp; 673 UINT16 MajorVersion; 674 UINT16 MinorVersion; 675 UINT16 NumberOfNamedEntries; 676 UINT16 NumberOfIdEntries; 677 // 678 // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here. 679 // 680 } EFI_IMAGE_RESOURCE_DIRECTORY; 681 682 /// 683 /// Resource directory entry format. 684 /// 685 typedef struct { 686 union { 687 struct { 688 UINT32 NameOffset:31; 689 UINT32 NameIsString:1; 690 } s; 691 UINT32 Id; 692 } u1; 693 union { 694 UINT32 OffsetToData; 695 struct { 696 UINT32 OffsetToDirectory:31; 697 UINT32 DataIsDirectory:1; 698 } s; 699 } u2; 700 } EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY; 701 702 /// 703 /// Resource directory entry for string. 704 /// 705 typedef struct { 706 UINT16 Length; 707 CHAR16 String[1]; 708 } EFI_IMAGE_RESOURCE_DIRECTORY_STRING; 709 710 /// 711 /// Resource directory entry for data array. 712 /// 713 typedef struct { 714 UINT32 OffsetToData; 715 UINT32 Size; 716 UINT32 CodePage; 717 UINT32 Reserved; 718 } EFI_IMAGE_RESOURCE_DATA_ENTRY; 719 720 /// 721 /// Header format for TE images 722 /// 723 typedef struct { 724 UINT16 Signature; // signature for TE format = "VZ" 725 UINT16 Machine; // from the original file header 726 UINT8 NumberOfSections; // from the original file header 727 UINT8 Subsystem; // from original optional header 728 UINT16 StrippedSize; // how many bytes we removed from the header 729 UINT32 AddressOfEntryPoint; // offset to entry point -- from original optional header 730 UINT32 BaseOfCode; // from original image -- required for ITP debug 731 UINT64 ImageBase; // from original file header 732 EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]; // only base relocation and debug directory 733 } EFI_TE_IMAGE_HEADER; 734 735 #define EFI_TE_IMAGE_HEADER_SIGNATURE 0x5A56 // "VZ" 736 737 // 738 // Data directory indexes in our TE image header 739 // 740 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0 741 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1 742 743 744 // 745 // Union of PE32, PE32+, and TE headers 746 // 747 typedef union { 748 EFI_IMAGE_NT_HEADERS32 Pe32; 749 EFI_IMAGE_NT_HEADERS64 Pe32Plus; 750 EFI_TE_IMAGE_HEADER Te; 751 } EFI_IMAGE_OPTIONAL_HEADER_UNION; 752 753 typedef union { 754 EFI_IMAGE_NT_HEADERS32 *Pe32; 755 EFI_IMAGE_NT_HEADERS64 *Pe32Plus; 756 EFI_TE_IMAGE_HEADER *Te; 757 EFI_IMAGE_OPTIONAL_HEADER_UNION *Union; 758 } EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION; 759 760 #endif 761