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