xref: /freebsd/sys/contrib/edk2/Include/IndustryStandard/PeImage.h (revision f439973d6726c3be929c8fb3b1545b8b1744abc3)
1 /** @file
2   EFI image format for PE32, PE32+ and TE. Please note some data structures are
3   different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and
4   EFI_IMAGE_NT_HEADERS64 is for PE32+.
5 
6   This file is coded to the Visual Studio, Microsoft Portable Executable and
7   Common Object File Format Specification, Revision 9.3 - December 29, 2015.
8   This file also includes some definitions in PI Specification, Revision 1.0.
9 
10 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
11 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
12 Portions Copyright (c) 2016 - 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
13 Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
14 
15 SPDX-License-Identifier: BSD-2-Clause-Patent
16 
17 **/
18 
19 #ifndef __PE_IMAGE_H__
20 #define __PE_IMAGE_H__
21 
22 //
23 // PE32+ Subsystem type for EFI images
24 //
25 #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION          10
26 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  11
27 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER       12
28 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER       13///< defined PI Specification, 1.0
29 
30 //
31 // PE32+ Machine type for EFI images
32 //
33 #define IMAGE_FILE_MACHINE_I386            0x014c
34 #define IMAGE_FILE_MACHINE_IA64            0x0200
35 #define IMAGE_FILE_MACHINE_EBC             0x0EBC
36 #define IMAGE_FILE_MACHINE_X64             0x8664
37 #define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED  0x01c2
38 #define IMAGE_FILE_MACHINE_ARM64           0xAA64
39 #define IMAGE_FILE_MACHINE_RISCV32         0x5032
40 #define IMAGE_FILE_MACHINE_RISCV64         0x5064
41 #define IMAGE_FILE_MACHINE_RISCV128        0x5128
42 #define IMAGE_FILE_MACHINE_LOONGARCH32     0x6232
43 #define IMAGE_FILE_MACHINE_LOONGARCH64     0x6264
44 
45 //
46 // EXE file formats
47 //
48 #define EFI_IMAGE_DOS_SIGNATURE     SIGNATURE_16('M', 'Z')
49 #define EFI_IMAGE_OS2_SIGNATURE     SIGNATURE_16('N', 'E')
50 #define EFI_IMAGE_OS2_SIGNATURE_LE  SIGNATURE_16('L', 'E')
51 #define EFI_IMAGE_NT_SIGNATURE      SIGNATURE_32('P', 'E', '\0', '\0')
52 
53 ///
54 /// PE images can start with an optional DOS header, so if an image is run
55 /// under DOS it can print an error message.
56 ///
57 typedef struct {
58   UINT16    e_magic;    ///< Magic number.
59   UINT16    e_cblp;     ///< Bytes on last page of file.
60   UINT16    e_cp;       ///< Pages in file.
61   UINT16    e_crlc;     ///< Relocations.
62   UINT16    e_cparhdr;  ///< Size of header in paragraphs.
63   UINT16    e_minalloc; ///< Minimum extra paragraphs needed.
64   UINT16    e_maxalloc; ///< Maximum extra paragraphs needed.
65   UINT16    e_ss;       ///< Initial (relative) SS value.
66   UINT16    e_sp;       ///< Initial SP value.
67   UINT16    e_csum;     ///< Checksum.
68   UINT16    e_ip;       ///< Initial IP value.
69   UINT16    e_cs;       ///< Initial (relative) CS value.
70   UINT16    e_lfarlc;   ///< File address of relocation table.
71   UINT16    e_ovno;     ///< Overlay number.
72   UINT16    e_res[4];   ///< Reserved words.
73   UINT16    e_oemid;    ///< OEM identifier (for e_oeminfo).
74   UINT16    e_oeminfo;  ///< OEM information; e_oemid specific.
75   UINT16    e_res2[10]; ///< Reserved words.
76   UINT32    e_lfanew;   ///< File address of new exe header.
77 } EFI_IMAGE_DOS_HEADER;
78 
79 ///
80 /// COFF File Header (Object and Image).
81 ///
82 typedef struct {
83   UINT16    Machine;
84   UINT16    NumberOfSections;
85   UINT32    TimeDateStamp;
86   UINT32    PointerToSymbolTable;
87   UINT32    NumberOfSymbols;
88   UINT16    SizeOfOptionalHeader;
89   UINT16    Characteristics;
90 } EFI_IMAGE_FILE_HEADER;
91 
92 ///
93 /// Size of EFI_IMAGE_FILE_HEADER.
94 ///
95 #define EFI_IMAGE_SIZEOF_FILE_HEADER  20
96 
97 //
98 // Characteristics
99 //
100 #define EFI_IMAGE_FILE_RELOCS_STRIPPED      BIT0     ///< 0x0001  Relocation info stripped from file.
101 #define EFI_IMAGE_FILE_EXECUTABLE_IMAGE     BIT1     ///< 0x0002  File is executable  (i.e. no unresolved externel references).
102 #define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED   BIT2     ///< 0x0004  Line numbers stripped from file.
103 #define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED  BIT3     ///< 0x0008  Local symbols stripped from file.
104 #define EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE  BIT5     ///< 0x0020  Supports addresses > 2-GB
105 #define EFI_IMAGE_FILE_BYTES_REVERSED_LO    BIT7     ///< 0x0080  Bytes of machine word are reversed.
106 #define EFI_IMAGE_FILE_32BIT_MACHINE        BIT8     ///< 0x0100  32 bit word machine.
107 #define EFI_IMAGE_FILE_DEBUG_STRIPPED       BIT9     ///< 0x0200  Debugging info stripped from file in .DBG file.
108 #define EFI_IMAGE_FILE_SYSTEM               BIT12    ///< 0x1000  System File.
109 #define EFI_IMAGE_FILE_DLL                  BIT13    ///< 0x2000  File is a DLL.
110 #define EFI_IMAGE_FILE_BYTES_REVERSED_HI    BIT15    ///< 0x8000  Bytes of machine word are reversed.
111 
112 ///
113 /// Header Data Directories.
114 ///
115 typedef struct {
116   UINT32    VirtualAddress;
117   UINT32    Size;
118 } EFI_IMAGE_DATA_DIRECTORY;
119 
120 //
121 // Directory Entries
122 //
123 #define EFI_IMAGE_DIRECTORY_ENTRY_EXPORT       0
124 #define EFI_IMAGE_DIRECTORY_ENTRY_IMPORT       1
125 #define EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE     2
126 #define EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION    3
127 #define EFI_IMAGE_DIRECTORY_ENTRY_SECURITY     4
128 #define EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC    5
129 #define EFI_IMAGE_DIRECTORY_ENTRY_DEBUG        6
130 #define EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT    7
131 #define EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR    8
132 #define EFI_IMAGE_DIRECTORY_ENTRY_TLS          9
133 #define EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG  10
134 
135 #define EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES  16
136 
137 ///
138 /// @attention
139 /// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and
140 /// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary
141 /// after NT additional fields.
142 ///
143 #define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC  0x10b
144 
145 ///
146 /// Optional Header Standard Fields for PE32.
147 ///
148 typedef struct {
149   ///
150   /// Standard fields.
151   ///
152   UINT16                      Magic;
153   UINT8                       MajorLinkerVersion;
154   UINT8                       MinorLinkerVersion;
155   UINT32                      SizeOfCode;
156   UINT32                      SizeOfInitializedData;
157   UINT32                      SizeOfUninitializedData;
158   UINT32                      AddressOfEntryPoint;
159   UINT32                      BaseOfCode;
160   UINT32                      BaseOfData; ///< PE32 contains this additional field, which is absent in PE32+.
161   ///
162   /// Optional Header Windows-Specific Fields.
163   ///
164   UINT32                      ImageBase;
165   UINT32                      SectionAlignment;
166   UINT32                      FileAlignment;
167   UINT16                      MajorOperatingSystemVersion;
168   UINT16                      MinorOperatingSystemVersion;
169   UINT16                      MajorImageVersion;
170   UINT16                      MinorImageVersion;
171   UINT16                      MajorSubsystemVersion;
172   UINT16                      MinorSubsystemVersion;
173   UINT32                      Win32VersionValue;
174   UINT32                      SizeOfImage;
175   UINT32                      SizeOfHeaders;
176   UINT32                      CheckSum;
177   UINT16                      Subsystem;
178   UINT16                      DllCharacteristics;
179   UINT32                      SizeOfStackReserve;
180   UINT32                      SizeOfStackCommit;
181   UINT32                      SizeOfHeapReserve;
182   UINT32                      SizeOfHeapCommit;
183   UINT32                      LoaderFlags;
184   UINT32                      NumberOfRvaAndSizes;
185   EFI_IMAGE_DATA_DIRECTORY    DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
186 } EFI_IMAGE_OPTIONAL_HEADER32;
187 
188 ///
189 /// @attention
190 /// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and
191 /// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary
192 /// after NT additional fields.
193 ///
194 #define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC  0x20b
195 
196 ///
197 /// Optional Header Standard Fields for PE32+.
198 ///
199 typedef struct {
200   ///
201   /// Standard fields.
202   ///
203   UINT16                      Magic;
204   UINT8                       MajorLinkerVersion;
205   UINT8                       MinorLinkerVersion;
206   UINT32                      SizeOfCode;
207   UINT32                      SizeOfInitializedData;
208   UINT32                      SizeOfUninitializedData;
209   UINT32                      AddressOfEntryPoint;
210   UINT32                      BaseOfCode;
211   ///
212   /// Optional Header Windows-Specific Fields.
213   ///
214   UINT64                      ImageBase;
215   UINT32                      SectionAlignment;
216   UINT32                      FileAlignment;
217   UINT16                      MajorOperatingSystemVersion;
218   UINT16                      MinorOperatingSystemVersion;
219   UINT16                      MajorImageVersion;
220   UINT16                      MinorImageVersion;
221   UINT16                      MajorSubsystemVersion;
222   UINT16                      MinorSubsystemVersion;
223   UINT32                      Win32VersionValue;
224   UINT32                      SizeOfImage;
225   UINT32                      SizeOfHeaders;
226   UINT32                      CheckSum;
227   UINT16                      Subsystem;
228   UINT16                      DllCharacteristics;
229   UINT64                      SizeOfStackReserve;
230   UINT64                      SizeOfStackCommit;
231   UINT64                      SizeOfHeapReserve;
232   UINT64                      SizeOfHeapCommit;
233   UINT32                      LoaderFlags;
234   UINT32                      NumberOfRvaAndSizes;
235   EFI_IMAGE_DATA_DIRECTORY    DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
236 } EFI_IMAGE_OPTIONAL_HEADER64;
237 
238 ///
239 /// @attention
240 /// EFI_IMAGE_NT_HEADERS32 is for use ONLY by tools.
241 ///
242 typedef struct {
243   UINT32                         Signature;
244   EFI_IMAGE_FILE_HEADER          FileHeader;
245   EFI_IMAGE_OPTIONAL_HEADER32    OptionalHeader;
246 } EFI_IMAGE_NT_HEADERS32;
247 
248 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER  sizeof (EFI_IMAGE_NT_HEADERS32)
249 
250 ///
251 /// @attention
252 /// EFI_IMAGE_HEADERS64 is for use ONLY by tools.
253 ///
254 typedef struct {
255   UINT32                         Signature;
256   EFI_IMAGE_FILE_HEADER          FileHeader;
257   EFI_IMAGE_OPTIONAL_HEADER64    OptionalHeader;
258 } EFI_IMAGE_NT_HEADERS64;
259 
260 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER  sizeof (EFI_IMAGE_NT_HEADERS64)
261 
262 //
263 // Other Windows Subsystem Values
264 //
265 #define EFI_IMAGE_SUBSYSTEM_UNKNOWN      0
266 #define EFI_IMAGE_SUBSYSTEM_NATIVE       1
267 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI  2
268 #define EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI  3
269 #define EFI_IMAGE_SUBSYSTEM_OS2_CUI      5
270 #define EFI_IMAGE_SUBSYSTEM_POSIX_CUI    7
271 
272 //
273 // DLL Characteristics
274 //
275 #define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA        0x0020
276 #define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE           0x0040
277 #define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY        0x0080
278 #define IMAGE_DLLCHARACTERISTICS_NX_COMPAT              0x0100
279 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION           0x0200
280 #define IMAGE_DLLCHARACTERISTICS_NO_SEH                 0x0400
281 #define IMAGE_DLLCHARACTERISTICS_NO_BIND                0x0800
282 #define IMAGE_DLLCHARACTERISTICS_APPCONTAINER           0x1000
283 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER             0x2000
284 #define IMAGE_DLLCHARACTERISTICS_GUARD_CF               0x4000
285 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE  0x8000
286 
287 ///
288 /// Length of ShortName.
289 ///
290 #define EFI_IMAGE_SIZEOF_SHORT_NAME  8
291 
292 ///
293 /// Section Table. This table immediately follows the optional header.
294 ///
295 typedef struct {
296   UINT8     Name[EFI_IMAGE_SIZEOF_SHORT_NAME];
297   union {
298     UINT32    PhysicalAddress;
299     UINT32    VirtualSize;
300   } Misc;
301   UINT32    VirtualAddress;
302   UINT32    SizeOfRawData;
303   UINT32    PointerToRawData;
304   UINT32    PointerToRelocations;
305   UINT32    PointerToLinenumbers;
306   UINT16    NumberOfRelocations;
307   UINT16    NumberOfLinenumbers;
308   UINT32    Characteristics;
309 } EFI_IMAGE_SECTION_HEADER;
310 
311 ///
312 /// Size of EFI_IMAGE_SECTION_HEADER.
313 ///
314 #define EFI_IMAGE_SIZEOF_SECTION_HEADER  40
315 
316 //
317 // Section Flags Values
318 //
319 #define EFI_IMAGE_SCN_TYPE_NO_PAD             BIT3        ///< 0x00000008  ///< Reserved.
320 #define EFI_IMAGE_SCN_CNT_CODE                BIT5        ///< 0x00000020
321 #define EFI_IMAGE_SCN_CNT_INITIALIZED_DATA    BIT6        ///< 0x00000040
322 #define EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA  BIT7        ///< 0x00000080
323 
324 #define EFI_IMAGE_SCN_LNK_OTHER   BIT8                    ///< 0x00000100  ///< Reserved.
325 #define EFI_IMAGE_SCN_LNK_INFO    BIT9                    ///< 0x00000200  ///< Section contains comments or some other type of information.
326 #define EFI_IMAGE_SCN_LNK_REMOVE  BIT11                   ///< 0x00000800  ///< Section contents will not become part of image.
327 #define EFI_IMAGE_SCN_LNK_COMDAT  BIT12                   ///< 0x00001000
328 
329 #define EFI_IMAGE_SCN_ALIGN_1BYTES   BIT20                ///< 0x00100000
330 #define EFI_IMAGE_SCN_ALIGN_2BYTES   BIT21                ///< 0x00200000
331 #define EFI_IMAGE_SCN_ALIGN_4BYTES   (BIT20|BIT21)        ///< 0x00300000
332 #define EFI_IMAGE_SCN_ALIGN_8BYTES   BIT22                ///< 0x00400000
333 #define EFI_IMAGE_SCN_ALIGN_16BYTES  (BIT20|BIT22)        ///< 0x00500000
334 #define EFI_IMAGE_SCN_ALIGN_32BYTES  (BIT21|BIT22)        ///< 0x00600000
335 #define EFI_IMAGE_SCN_ALIGN_64BYTES  (BIT20|BIT21|BIT22)  ///< 0x00700000
336 
337 #define EFI_IMAGE_SCN_MEM_DISCARDABLE  BIT25              ///< 0x02000000
338 #define EFI_IMAGE_SCN_MEM_NOT_CACHED   BIT26              ///< 0x04000000
339 #define EFI_IMAGE_SCN_MEM_NOT_PAGED    BIT27              ///< 0x08000000
340 #define EFI_IMAGE_SCN_MEM_SHARED       BIT28              ///< 0x10000000
341 #define EFI_IMAGE_SCN_MEM_EXECUTE      BIT29              ///< 0x20000000
342 #define EFI_IMAGE_SCN_MEM_READ         BIT30              ///< 0x40000000
343 #define EFI_IMAGE_SCN_MEM_WRITE        BIT31              ///< 0x80000000
344 
345 ///
346 /// Size of a Symbol Table Record.
347 ///
348 #define EFI_IMAGE_SIZEOF_SYMBOL  18
349 
350 //
351 // Symbols have a section number of the section in which they are
352 // defined. Otherwise, section numbers have the following meanings:
353 //
354 #define EFI_IMAGE_SYM_UNDEFINED  (UINT16) 0  ///< Symbol is undefined or is common.
355 #define EFI_IMAGE_SYM_ABSOLUTE   (UINT16) -1 ///< Symbol is an absolute value.
356 #define EFI_IMAGE_SYM_DEBUG      (UINT16) -2 ///< Symbol is a special debug item.
357 
358 //
359 // Symbol Type (fundamental) values.
360 //
361 #define EFI_IMAGE_SYM_TYPE_NULL    0  ///< no type.
362 #define EFI_IMAGE_SYM_TYPE_VOID    1  ///< no valid type.
363 #define EFI_IMAGE_SYM_TYPE_CHAR    2  ///< type character.
364 #define EFI_IMAGE_SYM_TYPE_SHORT   3  ///< type short integer.
365 #define EFI_IMAGE_SYM_TYPE_INT     4
366 #define EFI_IMAGE_SYM_TYPE_LONG    5
367 #define EFI_IMAGE_SYM_TYPE_FLOAT   6
368 #define EFI_IMAGE_SYM_TYPE_DOUBLE  7
369 #define EFI_IMAGE_SYM_TYPE_STRUCT  8
370 #define EFI_IMAGE_SYM_TYPE_UNION   9
371 #define EFI_IMAGE_SYM_TYPE_ENUM    10 ///< enumeration.
372 #define EFI_IMAGE_SYM_TYPE_MOE     11 ///< member of enumeration.
373 #define EFI_IMAGE_SYM_TYPE_BYTE    12
374 #define EFI_IMAGE_SYM_TYPE_WORD    13
375 #define EFI_IMAGE_SYM_TYPE_UINT    14
376 #define EFI_IMAGE_SYM_TYPE_DWORD   15
377 
378 //
379 // Symbol Type (derived) values.
380 //
381 #define EFI_IMAGE_SYM_DTYPE_NULL      0 ///< no derived type.
382 #define EFI_IMAGE_SYM_DTYPE_POINTER   1
383 #define EFI_IMAGE_SYM_DTYPE_FUNCTION  2
384 #define EFI_IMAGE_SYM_DTYPE_ARRAY     3
385 
386 //
387 // Storage classes.
388 //
389 #define EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION   ((UINT8) -1)
390 #define EFI_IMAGE_SYM_CLASS_NULL              0
391 #define EFI_IMAGE_SYM_CLASS_AUTOMATIC         1
392 #define EFI_IMAGE_SYM_CLASS_EXTERNAL          2
393 #define EFI_IMAGE_SYM_CLASS_STATIC            3
394 #define EFI_IMAGE_SYM_CLASS_REGISTER          4
395 #define EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF      5
396 #define EFI_IMAGE_SYM_CLASS_LABEL             6
397 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL   7
398 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT  8
399 #define EFI_IMAGE_SYM_CLASS_ARGUMENT          9
400 #define EFI_IMAGE_SYM_CLASS_STRUCT_TAG        10
401 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION   11
402 #define EFI_IMAGE_SYM_CLASS_UNION_TAG         12
403 #define EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION   13
404 #define EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC  14
405 #define EFI_IMAGE_SYM_CLASS_ENUM_TAG          15
406 #define EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM    16
407 #define EFI_IMAGE_SYM_CLASS_REGISTER_PARAM    17
408 #define EFI_IMAGE_SYM_CLASS_BIT_FIELD         18
409 #define EFI_IMAGE_SYM_CLASS_BLOCK             100
410 #define EFI_IMAGE_SYM_CLASS_FUNCTION          101
411 #define EFI_IMAGE_SYM_CLASS_END_OF_STRUCT     102
412 #define EFI_IMAGE_SYM_CLASS_FILE              103
413 #define EFI_IMAGE_SYM_CLASS_SECTION           104
414 #define EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL     105
415 
416 //
417 // type packing constants
418 //
419 #define EFI_IMAGE_N_BTMASK  017
420 #define EFI_IMAGE_N_TMASK   060
421 #define EFI_IMAGE_N_TMASK1  0300
422 #define EFI_IMAGE_N_TMASK2  0360
423 #define EFI_IMAGE_N_BTSHFT  4
424 #define EFI_IMAGE_N_TSHIFT  2
425 
426 //
427 // Communal selection types.
428 //
429 #define EFI_IMAGE_COMDAT_SELECT_NODUPLICATES  1
430 #define EFI_IMAGE_COMDAT_SELECT_ANY           2
431 #define EFI_IMAGE_COMDAT_SELECT_SAME_SIZE     3
432 #define EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH   4
433 #define EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE   5
434 
435 //
436 // the following values only be referred in PeCoff, not defined in PECOFF.
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 ///
452 /// Size of EFI_IMAGE_RELOCATION
453 ///
454 #define EFI_IMAGE_SIZEOF_RELOCATION  10
455 
456 //
457 // I386 relocation types.
458 //
459 #define EFI_IMAGE_REL_I386_ABSOLUTE  0x0000 ///< Reference is absolute, no relocation is necessary.
460 #define EFI_IMAGE_REL_I386_DIR16     0x0001 ///< Direct 16-bit reference to the symbols virtual address.
461 #define EFI_IMAGE_REL_I386_REL16     0x0002 ///< PC-relative 16-bit reference to the symbols virtual address.
462 #define EFI_IMAGE_REL_I386_DIR32     0x0006 ///< Direct 32-bit reference to the symbols virtual address.
463 #define EFI_IMAGE_REL_I386_DIR32NB   0x0007 ///< Direct 32-bit reference to the symbols virtual address, base not included.
464 #define EFI_IMAGE_REL_I386_SEG12     0x0009 ///< Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address.
465 #define EFI_IMAGE_REL_I386_SECTION   0x000A
466 #define EFI_IMAGE_REL_I386_SECREL    0x000B
467 #define EFI_IMAGE_REL_I386_REL32     0x0014 ///< PC-relative 32-bit reference to the symbols virtual address.
468 
469 //
470 // x64 processor relocation types.
471 //
472 #define IMAGE_REL_AMD64_ABSOLUTE  0x0000
473 #define IMAGE_REL_AMD64_ADDR64    0x0001
474 #define IMAGE_REL_AMD64_ADDR32    0x0002
475 #define IMAGE_REL_AMD64_ADDR32NB  0x0003
476 #define IMAGE_REL_AMD64_REL32     0x0004
477 #define IMAGE_REL_AMD64_REL32_1   0x0005
478 #define IMAGE_REL_AMD64_REL32_2   0x0006
479 #define IMAGE_REL_AMD64_REL32_3   0x0007
480 #define IMAGE_REL_AMD64_REL32_4   0x0008
481 #define IMAGE_REL_AMD64_REL32_5   0x0009
482 #define IMAGE_REL_AMD64_SECTION   0x000A
483 #define IMAGE_REL_AMD64_SECREL    0x000B
484 #define IMAGE_REL_AMD64_SECREL7   0x000C
485 #define IMAGE_REL_AMD64_TOKEN     0x000D
486 #define IMAGE_REL_AMD64_SREL32    0x000E
487 #define IMAGE_REL_AMD64_PAIR      0x000F
488 #define IMAGE_REL_AMD64_SSPAN32   0x0010
489 
490 ///
491 /// Based relocation format.
492 ///
493 typedef struct {
494   UINT32    VirtualAddress;
495   UINT32    SizeOfBlock;
496 } EFI_IMAGE_BASE_RELOCATION;
497 
498 ///
499 /// Size of EFI_IMAGE_BASE_RELOCATION.
500 ///
501 #define EFI_IMAGE_SIZEOF_BASE_RELOCATION  8
502 
503 //
504 // Based relocation types.
505 //
506 #define EFI_IMAGE_REL_BASED_ABSOLUTE        0
507 #define EFI_IMAGE_REL_BASED_HIGH            1
508 #define EFI_IMAGE_REL_BASED_LOW             2
509 #define EFI_IMAGE_REL_BASED_HIGHLOW         3
510 #define EFI_IMAGE_REL_BASED_HIGHADJ         4
511 #define EFI_IMAGE_REL_BASED_MIPS_JMPADDR    5
512 #define EFI_IMAGE_REL_BASED_ARM_MOV32A      5
513 #define EFI_IMAGE_REL_BASED_ARM_MOV32T      7
514 #define EFI_IMAGE_REL_BASED_IA64_IMM64      9
515 #define EFI_IMAGE_REL_BASED_MIPS_JMPADDR16  9
516 #define EFI_IMAGE_REL_BASED_DIR64           10
517 
518 ///
519 /// Relocation types of RISC-V processor.
520 ///
521 #define EFI_IMAGE_REL_BASED_RISCV_HI20    5
522 #define EFI_IMAGE_REL_BASED_RISCV_LOW12I  7
523 #define EFI_IMAGE_REL_BASED_RISCV_LOW12S  8
524 
525 //
526 // Relocation types of LoongArch processor.
527 //
528 #define EFI_IMAGE_REL_BASED_LOONGARCH32_MARK_LA  8
529 #define EFI_IMAGE_REL_BASED_LOONGARCH64_MARK_LA  8
530 
531 ///
532 /// Line number format.
533 ///
534 typedef struct {
535   union {
536     UINT32    SymbolTableIndex; ///< Symbol table index of function name if Linenumber is 0.
537     UINT32    VirtualAddress;   ///< Virtual address of line number.
538   } Type;
539   UINT16    Linenumber;       ///< Line number.
540 } EFI_IMAGE_LINENUMBER;
541 
542 ///
543 /// Size of EFI_IMAGE_LINENUMBER.
544 ///
545 #define EFI_IMAGE_SIZEOF_LINENUMBER  6
546 
547 //
548 // Archive format.
549 //
550 #define EFI_IMAGE_ARCHIVE_START_SIZE        8
551 #define EFI_IMAGE_ARCHIVE_START             "!<arch>\n"
552 #define EFI_IMAGE_ARCHIVE_END               "`\n"
553 #define EFI_IMAGE_ARCHIVE_PAD               "\n"
554 #define EFI_IMAGE_ARCHIVE_LINKER_MEMBER     "/               "
555 #define EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER  "//              "
556 
557 ///
558 /// Archive Member Headers
559 ///
560 typedef struct {
561   UINT8    Name[16];     ///< File member name - `/' terminated.
562   UINT8    Date[12];     ///< File member date - decimal.
563   UINT8    UserID[6];    ///< File member user id - decimal.
564   UINT8    GroupID[6];   ///< File member group id - decimal.
565   UINT8    Mode[8];      ///< File member mode - octal.
566   UINT8    Size[10];     ///< File member size - decimal.
567   UINT8    EndHeader[2]; ///< String to end header. (0x60 0x0A).
568 } EFI_IMAGE_ARCHIVE_MEMBER_HEADER;
569 
570 ///
571 /// Size of EFI_IMAGE_ARCHIVE_MEMBER_HEADER.
572 ///
573 #define EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR  60
574 
575 //
576 // DLL Support
577 //
578 
579 ///
580 /// Export Directory Table.
581 ///
582 typedef struct {
583   UINT32    Characteristics;
584   UINT32    TimeDateStamp;
585   UINT16    MajorVersion;
586   UINT16    MinorVersion;
587   UINT32    Name;
588   UINT32    Base;
589   UINT32    NumberOfFunctions;
590   UINT32    NumberOfNames;
591   UINT32    AddressOfFunctions;
592   UINT32    AddressOfNames;
593   UINT32    AddressOfNameOrdinals;
594 } EFI_IMAGE_EXPORT_DIRECTORY;
595 
596 //
597 // Based export types.
598 //
599 #define EFI_IMAGE_EXPORT_ORDINAL_BASE  1
600 #define EFI_IMAGE_EXPORT_ADDR_SIZE     4
601 #define EFI_IMAGE_EXPORT_ORDINAL_SIZE  2
602 
603 ///
604 /// Hint/Name Table.
605 ///
606 typedef struct {
607   UINT16    Hint;
608   UINT8     Name[1];
609 } EFI_IMAGE_IMPORT_BY_NAME;
610 
611 ///
612 /// Import Address Table RVA (Thunk Table).
613 ///
614 typedef struct {
615   union {
616     UINT32                      Function;
617     UINT32                      Ordinal;
618     EFI_IMAGE_IMPORT_BY_NAME    *AddressOfData;
619   } u1;
620 } EFI_IMAGE_THUNK_DATA;
621 
622 #define EFI_IMAGE_ORDINAL_FLAG  BIT31                ///< Flag for PE32.
623 #define EFI_IMAGE_SNAP_BY_ORDINAL(Ordinal)  ((Ordinal & EFI_IMAGE_ORDINAL_FLAG) != 0)
624 #define EFI_IMAGE_ORDINAL(Ordinal)          (Ordinal & 0xffff)
625 
626 ///
627 /// Import Directory Table
628 ///
629 typedef struct {
630   UINT32                  Characteristics;
631   UINT32                  TimeDateStamp;
632   UINT32                  ForwarderChain;
633   UINT32                  Name;
634   EFI_IMAGE_THUNK_DATA    *FirstThunk;
635 } EFI_IMAGE_IMPORT_DESCRIPTOR;
636 
637 ///
638 /// Debug Directory Format.
639 ///
640 typedef struct {
641   UINT32    Characteristics;
642   UINT32    TimeDateStamp;
643   UINT16    MajorVersion;
644   UINT16    MinorVersion;
645   UINT32    Type;
646   UINT32    SizeOfData;
647   UINT32    RVA;         ///< The address of the debug data when loaded, relative to the image base.
648   UINT32    FileOffset;  ///< The file pointer to the debug data.
649 } EFI_IMAGE_DEBUG_DIRECTORY_ENTRY;
650 
651 #define EFI_IMAGE_DEBUG_TYPE_CODEVIEW               2    ///< The Visual C++ debug information.
652 #define EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS  20
653 
654 ///
655 /// Debug Data Structure defined in Microsoft C++.
656 ///
657 #define CODEVIEW_SIGNATURE_NB10  SIGNATURE_32('N', 'B', '1', '0')
658 typedef struct {
659   UINT32    Signature;                      ///< "NB10"
660   UINT32    Unknown;
661   UINT32    Unknown2;
662   UINT32    Unknown3;
663   //
664   // Filename of .PDB goes here
665   //
666 } EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY;
667 
668 ///
669 /// Debug Data Structure defined in Microsoft C++.
670 ///
671 #define CODEVIEW_SIGNATURE_RSDS  SIGNATURE_32('R', 'S', 'D', 'S')
672 typedef struct {
673   UINT32    Signature;                      ///< "RSDS".
674   UINT32    Unknown;
675   UINT32    Unknown2;
676   UINT32    Unknown3;
677   UINT32    Unknown4;
678   UINT32    Unknown5;
679   //
680   // Filename of .PDB goes here
681   //
682 } EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY;
683 
684 ///
685 /// Debug Data Structure defined by Apple Mach-O to Coff utility.
686 ///
687 #define CODEVIEW_SIGNATURE_MTOC  SIGNATURE_32('M', 'T', 'O', 'C')
688 typedef struct {
689   UINT32    Signature;                       ///< "MTOC".
690   GUID      MachOUuid;
691   //
692   //  Filename of .DLL (Mach-O with debug info) goes here
693   //
694 } EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY;
695 
696 //
697 // .pdata entries for X64
698 //
699 typedef struct {
700   UINT32    FunctionStartAddress;
701   UINT32    FunctionEndAddress;
702   UINT32    UnwindInfoAddress;
703 } RUNTIME_FUNCTION;
704 
705 typedef struct {
706   UINT8    Version             : 3;
707   UINT8    Flags               : 5;
708   UINT8    SizeOfProlog;
709   UINT8    CountOfUnwindCodes;
710   UINT8    FrameRegister       : 4;
711   UINT8    FrameRegisterOffset : 4;
712 } UNWIND_INFO;
713 
714 ///
715 /// Extended DLL Characteristics
716 ///
717 #define EFI_IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT          0x0001
718 #define EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT  0x0040
719 
720 typedef struct {
721   UINT32    DllCharacteristicsEx;
722 } EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY;
723 
724 ///
725 /// Resource format.
726 ///
727 typedef struct {
728   UINT32    Characteristics;
729   UINT32    TimeDateStamp;
730   UINT16    MajorVersion;
731   UINT16    MinorVersion;
732   UINT16    NumberOfNamedEntries;
733   UINT16    NumberOfIdEntries;
734   //
735   // Array of EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY entries goes here.
736   //
737 } EFI_IMAGE_RESOURCE_DIRECTORY;
738 
739 ///
740 /// Resource directory entry format.
741 ///
742 typedef struct {
743   union {
744     struct {
745       UINT32    NameOffset   : 31;
746       UINT32    NameIsString : 1;
747     } s;
748     UINT32    Id;
749   } u1;
750   union {
751     UINT32    OffsetToData;
752     struct {
753       UINT32    OffsetToDirectory : 31;
754       UINT32    DataIsDirectory   : 1;
755     } s;
756   } u2;
757 } EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY;
758 
759 ///
760 /// Resource directory entry for string.
761 ///
762 typedef struct {
763   UINT16    Length;
764   CHAR16    String[1];
765 } EFI_IMAGE_RESOURCE_DIRECTORY_STRING;
766 
767 ///
768 /// Resource directory entry for data array.
769 ///
770 typedef struct {
771   UINT32    OffsetToData;
772   UINT32    Size;
773   UINT32    CodePage;
774   UINT32    Reserved;
775 } EFI_IMAGE_RESOURCE_DATA_ENTRY;
776 
777 ///
778 /// Header format for TE images, defined in the PI Specification, 1.0.
779 ///
780 typedef struct {
781   UINT16                      Signature;           ///< The signature for TE format = "VZ".
782   UINT16                      Machine;             ///< From the original file header.
783   UINT8                       NumberOfSections;    ///< From the original file header.
784   UINT8                       Subsystem;           ///< From original optional header.
785   UINT16                      StrippedSize;        ///< Number of bytes we removed from the header.
786   UINT32                      AddressOfEntryPoint; ///< Offset to entry point -- from original optional header.
787   UINT32                      BaseOfCode;          ///< From original image -- required for ITP debug.
788   UINT64                      ImageBase;           ///< From original file header.
789   EFI_IMAGE_DATA_DIRECTORY    DataDirectory[2];    ///< Only base relocation and debug directory.
790 } EFI_TE_IMAGE_HEADER;
791 
792 #define EFI_TE_IMAGE_HEADER_SIGNATURE  SIGNATURE_16('V', 'Z')
793 
794 //
795 // Data directory indexes in our TE image header
796 //
797 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0
798 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1
799 
800 ///
801 /// Union of PE32, PE32+, and TE headers.
802 ///
803 typedef union {
804   EFI_IMAGE_NT_HEADERS32    Pe32;
805   EFI_IMAGE_NT_HEADERS64    Pe32Plus;
806   EFI_TE_IMAGE_HEADER       Te;
807 } EFI_IMAGE_OPTIONAL_HEADER_UNION;
808 
809 typedef union {
810   EFI_IMAGE_NT_HEADERS32             *Pe32;
811   EFI_IMAGE_NT_HEADERS64             *Pe32Plus;
812   EFI_TE_IMAGE_HEADER                *Te;
813   EFI_IMAGE_OPTIONAL_HEADER_UNION    *Union;
814 } EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;
815 
816 #endif
817