1 /* pe.h  -  PE COFF header information
2 
3    Copyright (C) 1999-2018 Free Software Foundation, Inc.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software Foundation,
19    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
20 #ifndef _PE_H
21 #define _PE_H
22 
23 /* NT specific file attributes.  */
24 #define IMAGE_FILE_RELOCS_STRIPPED           0x0001
25 #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002
26 #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004
27 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008
28 #define IMAGE_FILE_AGGRESSIVE_WS_TRIM        0x0010
29 #define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020
30 #define IMAGE_FILE_16BIT_MACHINE             0x0040
31 #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080
32 #define IMAGE_FILE_32BIT_MACHINE             0x0100
33 #define IMAGE_FILE_DEBUG_STRIPPED            0x0200
34 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400
35 #define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800
36 #define IMAGE_FILE_SYSTEM                    0x1000
37 #define IMAGE_FILE_DLL                       0x2000
38 #define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000
39 #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000
40 
41 /* DllCharacteristics flag bits.  The inconsistent naming may seem
42    odd, but that is how they are defined in the PE specification.  */
43 #define IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA       0x0020
44 #define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE          0x0040
45 #define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY       0x0080
46 #define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT             0x0100
47 #define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION           0x0200
48 #define IMAGE_DLLCHARACTERISTICS_NO_SEH                 0x0400
49 #define IMAGE_DLLCHARACTERISTICS_NO_BIND                0x0800
50 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER             0x2000
51 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE  0x8000
52 
53 /* Additional flags to be set for section headers to allow the NT loader to
54    read and write to the section data (to replace the addresses of data in
55    dlls for one thing); also to execute the section in .text's case.  */
56 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
57 #define IMAGE_SCN_MEM_EXECUTE     0x20000000
58 #define IMAGE_SCN_MEM_READ        0x40000000
59 #define IMAGE_SCN_MEM_WRITE       0x80000000
60 
61 /* Section characteristics added for ppc-nt.  */
62 
63 #define IMAGE_SCN_TYPE_NO_PAD                0x00000008  /* Reserved.  */
64 
65 #define IMAGE_SCN_CNT_CODE                   0x00000020  /* Section contains code.  */
66 #define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  /* Section contains initialized data.  */
67 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  /* Section contains uninitialized data.  */
68 
69 #define IMAGE_SCN_LNK_OTHER                  0x00000100  /* Reserved.  */
70 #define IMAGE_SCN_LNK_INFO                   0x00000200  /* Section contains comments or some other type of information.  */
71 #define IMAGE_SCN_LNK_REMOVE                 0x00000800  /* Section contents will not become part of image.  */
72 #define IMAGE_SCN_LNK_COMDAT                 0x00001000  /* Section contents comdat.  */
73 
74 #define IMAGE_SCN_MEM_FARDATA                0x00008000
75 
76 #define IMAGE_SCN_MEM_PURGEABLE              0x00020000
77 #define IMAGE_SCN_MEM_16BIT                  0x00020000
78 #define IMAGE_SCN_MEM_LOCKED                 0x00040000
79 #define IMAGE_SCN_MEM_PRELOAD                0x00080000
80 
81 /* Bit position in the s_flags field where the alignment values start.  */
82 #define IMAGE_SCN_ALIGN_POWER_BIT_POS	     20
83 #define IMAGE_SCN_ALIGN_POWER_BIT_MASK	     0x00f00000
84 #define IMAGE_SCN_ALIGN_POWER_NUM(val)	     \
85   (((val) >> IMAGE_SCN_ALIGN_POWER_BIT_POS) - 1)
86 #define IMAGE_SCN_ALIGN_POWER_CONST(val)     \
87   (((val) + 1) << IMAGE_SCN_ALIGN_POWER_BIT_POS)
88 
89 #define IMAGE_SCN_ALIGN_1BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (0)
90 #define IMAGE_SCN_ALIGN_2BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (1)
91 #define IMAGE_SCN_ALIGN_4BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (2)
92 #define IMAGE_SCN_ALIGN_8BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (3)
93 /* Default alignment if no others are specified.  */
94 #define IMAGE_SCN_ALIGN_16BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (4)
95 #define IMAGE_SCN_ALIGN_32BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (5)
96 #define IMAGE_SCN_ALIGN_64BYTES		     IMAGE_SCN_ALIGN_POWER_CONST (6)
97 #define IMAGE_SCN_ALIGN_128BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (7)
98 #define IMAGE_SCN_ALIGN_256BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (8)
99 #define IMAGE_SCN_ALIGN_512BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (9)
100 #define IMAGE_SCN_ALIGN_1024BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (10)
101 #define IMAGE_SCN_ALIGN_2048BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (11)
102 #define IMAGE_SCN_ALIGN_4096BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (12)
103 #define IMAGE_SCN_ALIGN_8192BYTES	     IMAGE_SCN_ALIGN_POWER_CONST (13)
104 
105 /* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags.  */
106 #define COFF_ENCODE_ALIGNMENT(SECTION, ALIGNMENT_POWER) \
107   ((SECTION).s_flags |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER) <= 13 \
108 						     ? (ALIGNMENT_POWER) : 13))
109 #define COFF_DECODE_ALIGNMENT(X)             \
110   IMAGE_SCN_ALIGN_POWER_NUM ((X) & IMAGE_SCN_ALIGN_POWER_BIT_MASK)
111 
112 #define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  /* Section contains extended relocations. */
113 #define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  /* Section is not cachable.               */
114 #define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  /* Section is not pageable.               */
115 #define IMAGE_SCN_MEM_SHARED                 0x10000000  /* Section is shareable.                  */
116 
117 /* COMDAT selection codes.  */
118 
119 #define IMAGE_COMDAT_SELECT_NODUPLICATES     (1) /* Warn if duplicates.  */
120 #define IMAGE_COMDAT_SELECT_ANY		     (2) /* No warning.  */
121 #define IMAGE_COMDAT_SELECT_SAME_SIZE	     (3) /* Warn if different size.  */
122 #define IMAGE_COMDAT_SELECT_EXACT_MATCH	     (4) /* Warn if different.  */
123 #define IMAGE_COMDAT_SELECT_ASSOCIATIVE	     (5) /* Base on other section.  */
124 
125 /* Machine numbers.  */
126 
127 #define IMAGE_FILE_MACHINE_UNKNOWN           0x0000
128 #define IMAGE_FILE_MACHINE_ALPHA             0x0184
129 #define IMAGE_FILE_MACHINE_ALPHA64           0x0284
130 #define IMAGE_FILE_MACHINE_AM33              0x01d3
131 #define IMAGE_FILE_MACHINE_AMD64             0x8664
132 #define IMAGE_FILE_MACHINE_ARM               0x01c0
133 #define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
134 #define IMAGE_FILE_MACHINE_CEE               0xc0ee
135 #define IMAGE_FILE_MACHINE_CEF               0x0cef
136 #define IMAGE_FILE_MACHINE_EBC               0x0ebc
137 #define IMAGE_FILE_MACHINE_I386              0x014c
138 #define IMAGE_FILE_MACHINE_IA64              0x0200
139 #define IMAGE_FILE_MACHINE_M32R              0x9041
140 #define IMAGE_FILE_MACHINE_M68K              0x0268
141 #define IMAGE_FILE_MACHINE_MIPS16            0x0266
142 #define IMAGE_FILE_MACHINE_MIPSFPU           0x0366
143 #define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466
144 #define IMAGE_FILE_MACHINE_POWERPC           0x01f0
145 #define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
146 #define IMAGE_FILE_MACHINE_R10000            0x0168
147 #define IMAGE_FILE_MACHINE_R3000             0x0162
148 #define IMAGE_FILE_MACHINE_R4000             0x0166
149 #define IMAGE_FILE_MACHINE_SH3               0x01a2
150 #define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
151 #define IMAGE_FILE_MACHINE_SH3E              0x01a4
152 #define IMAGE_FILE_MACHINE_SH4               0x01a6
153 #define IMAGE_FILE_MACHINE_SH5               0x01a8
154 #define IMAGE_FILE_MACHINE_THUMB             0x01c2
155 #define IMAGE_FILE_MACHINE_TRICORE           0x0520
156 #define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169
157 #define IMAGE_FILE_MACHINE_AMD64             0x8664
158 
159 #define IMAGE_SUBSYSTEM_UNKNOWN			 0
160 #define IMAGE_SUBSYSTEM_NATIVE			 1
161 #define IMAGE_SUBSYSTEM_WINDOWS_GUI		 2
162 #define IMAGE_SUBSYSTEM_WINDOWS_CUI		 3
163 #define IMAGE_SUBSYSTEM_POSIX_CUI		 7
164 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI		 9
165 #define IMAGE_SUBSYSTEM_EFI_APPLICATION		10
166 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER	11
167 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER	12
168 #define IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER	13
169 #define IMAGE_SUBSYSTEM_XBOX			14
170 
171 /* Magic values that are true for all dos/nt implementations.  */
172 #define DOSMAGIC       0x5a4d
173 #define NT_SIGNATURE   0x00004550
174 
175 /* NT allows long filenames, we want to accommodate this.
176    This may break some of the bfd functions.  */
177 #undef  FILNMLEN
178 #define FILNMLEN	18	/* # characters in a file name.  */
179 
180 struct external_PEI_DOS_hdr
181 {
182   /* DOS header fields - always at offset zero in the EXE file.  */
183   char e_magic[2];		/* Magic number, 0x5a4d.  */
184   char e_cblp[2];		/* Bytes on last page of file, 0x90.  */
185   char e_cp[2];			/* Pages in file, 0x3.  */
186   char e_crlc[2];		/* Relocations, 0x0.  */
187   char e_cparhdr[2];		/* Size of header in paragraphs, 0x4.  */
188   char e_minalloc[2];		/* Minimum extra paragraphs needed, 0x0.  */
189   char e_maxalloc[2];		/* Maximum extra paragraphs needed, 0xFFFF.  */
190   char e_ss[2];			/* Initial (relative) SS value, 0x0.  */
191   char e_sp[2];			/* Initial SP value, 0xb8.  */
192   char e_csum[2];		/* Checksum, 0x0.  */
193   char e_ip[2];			/* Initial IP value, 0x0.  */
194   char e_cs[2];			/* Initial (relative) CS value, 0x0.  */
195   char e_lfarlc[2];		/* File address of relocation table, 0x40.  */
196   char e_ovno[2];		/* Overlay number, 0x0.  */
197   char e_res[4][2];		/* Reserved words, all 0x0.  */
198   char e_oemid[2];		/* OEM identifier (for e_oeminfo), 0x0.  */
199   char e_oeminfo[2];		/* OEM information; e_oemid specific, 0x0.  */
200   char e_res2[10][2];		/* Reserved words, all 0x0.  */
201   char e_lfanew[4];		/* File address of new exe header, usually 0x80.  */
202   char dos_message[16][4];	/* Other stuff, always follow DOS header.  */
203 };
204 
205 struct external_PEI_IMAGE_hdr
206 {
207   char nt_signature[4];		/* Required NT signature, 0x4550.  */
208 
209   /* From standard header.  */
210   char f_magic[2];		/* Magic number.		*/
211   char f_nscns[2];		/* Number of sections.		*/
212   char f_timdat[4];		/* Time & date stamp.		*/
213   char f_symptr[4];		/* File pointer to symtab.	*/
214   char f_nsyms[4];		/* Number of symtab entries.	*/
215   char f_opthdr[2];		/* Sizeof(optional hdr).	*/
216   char f_flags[2];		/* Flags.			*/
217 };
218 
219 struct external_PEI_filehdr
220 {
221   /* DOS header fields - always at offset zero in the EXE file.  */
222   char e_magic[2];		/* Magic number, 0x5a4d.  */
223   char e_cblp[2];		/* Bytes on last page of file, 0x90.  */
224   char e_cp[2];			/* Pages in file, 0x3.  */
225   char e_crlc[2];		/* Relocations, 0x0.  */
226   char e_cparhdr[2];		/* Size of header in paragraphs, 0x4.  */
227   char e_minalloc[2];		/* Minimum extra paragraphs needed, 0x0.  */
228   char e_maxalloc[2];		/* Maximum extra paragraphs needed, 0xFFFF.  */
229   char e_ss[2];			/* Initial (relative) SS value, 0x0.  */
230   char e_sp[2];			/* Initial SP value, 0xb8.  */
231   char e_csum[2];		/* Checksum, 0x0.  */
232   char e_ip[2];			/* Initial IP value, 0x0.  */
233   char e_cs[2];			/* Initial (relative) CS value, 0x0.  */
234   char e_lfarlc[2];		/* File address of relocation table, 0x40.  */
235   char e_ovno[2];		/* Overlay number, 0x0.  */
236   char e_res[4][2];		/* Reserved words, all 0x0.  */
237   char e_oemid[2];		/* OEM identifier (for e_oeminfo), 0x0.  */
238   char e_oeminfo[2];		/* OEM information; e_oemid specific, 0x0.  */
239   char e_res2[10][2];		/* Reserved words, all 0x0.  */
240   char e_lfanew[4];		/* File address of new exe header, usually 0x80.  */
241   char dos_message[16][4];	/* Other stuff, always follow DOS header.  */
242 
243   /* Note: additional bytes may be inserted before the signature.  Use
244    the e_lfanew field to find the actual location of the NT signature.  */
245 
246   char nt_signature[4];		/* Required NT signature, 0x4550.  */
247 
248   /* From standard header.  */
249   char f_magic[2];		/* Magic number.		*/
250   char f_nscns[2];		/* Number of sections.		*/
251   char f_timdat[4];		/* Time & date stamp.		*/
252   char f_symptr[4];		/* File pointer to symtab.	*/
253   char f_nsyms[4];		/* Number of symtab entries.	*/
254   char f_opthdr[2];		/* Sizeof(optional hdr).	*/
255   char f_flags[2];		/* Flags.			*/
256 };
257 
258 #ifdef COFF_IMAGE_WITH_PE
259 
260 /* The filehdr is only weird in images.  */
261 
262 #undef  FILHDR
263 #define FILHDR struct external_PEI_filehdr
264 #undef  FILHSZ
265 #define FILHSZ 152
266 
267 #endif /* COFF_IMAGE_WITH_PE */
268 
269 /* 32-bit PE a.out header:  */
270 
271 typedef struct
272 {
273   AOUTHDR standard;
274 
275   /* NT extra fields; see internal.h for descriptions.  */
276   char  ImageBase[4];
277   char  SectionAlignment[4];
278   char  FileAlignment[4];
279   char  MajorOperatingSystemVersion[2];
280   char  MinorOperatingSystemVersion[2];
281   char  MajorImageVersion[2];
282   char  MinorImageVersion[2];
283   char  MajorSubsystemVersion[2];
284   char  MinorSubsystemVersion[2];
285   char  Reserved1[4];
286   char  SizeOfImage[4];
287   char  SizeOfHeaders[4];
288   char  CheckSum[4];
289   char  Subsystem[2];
290   char  DllCharacteristics[2];
291   char  SizeOfStackReserve[4];
292   char  SizeOfStackCommit[4];
293   char  SizeOfHeapReserve[4];
294   char  SizeOfHeapCommit[4];
295   char  LoaderFlags[4];
296   char  NumberOfRvaAndSizes[4];
297   /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  */
298   char  DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars.  */
299 } PEAOUTHDR;
300 
301 #undef AOUTSZ
302 #define AOUTSZ (AOUTHDRSZ + 196)
303 
304 /* Like PEAOUTHDR, except that the "standard" member has no BaseOfData
305    (aka data_start) member and that some of the members are 8 instead
306    of just 4 bytes long.  */
307 typedef struct
308 {
309 #ifdef AOUTHDRSZ64
310   AOUTHDR64 standard;
311 #else
312   AOUTHDR standard;
313 #endif
314   /* NT extra fields; see internal.h for descriptions.  */
315   char  ImageBase[8];
316   char  SectionAlignment[4];
317   char  FileAlignment[4];
318   char  MajorOperatingSystemVersion[2];
319   char  MinorOperatingSystemVersion[2];
320   char  MajorImageVersion[2];
321   char  MinorImageVersion[2];
322   char  MajorSubsystemVersion[2];
323   char  MinorSubsystemVersion[2];
324   char  Reserved1[4];
325   char  SizeOfImage[4];
326   char  SizeOfHeaders[4];
327   char  CheckSum[4];
328   char  Subsystem[2];
329   char  DllCharacteristics[2];
330   char  SizeOfStackReserve[8];
331   char  SizeOfStackCommit[8];
332   char  SizeOfHeapReserve[8];
333   char  SizeOfHeapCommit[8];
334   char  LoaderFlags[4];
335   char  NumberOfRvaAndSizes[4];
336   /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  */
337   char  DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars.  */
338 } PEPAOUTHDR;
339 
340 #ifdef AOUTHDRSZ64
341 #define PEPAOUTSZ	(AOUTHDRSZ64 + 196 + 5 * 4) /* = 240 */
342 #else
343 #define PEPAOUTSZ	240
344 #endif
345 
346 #undef  E_FILNMLEN
347 #define E_FILNMLEN	18	/* # characters in a file name.  */
348 
349 /* Import Tyoes fot ILF format object files..  */
350 #define IMPORT_CODE	0
351 #define IMPORT_DATA	1
352 #define IMPORT_CONST	2
353 
354 /* Import Name Tyoes for ILF format object files.  */
355 #define IMPORT_ORDINAL		0
356 #define IMPORT_NAME		1
357 #define IMPORT_NAME_NOPREFIX	2
358 #define IMPORT_NAME_UNDECORATE	3
359 
360 /* Weak external characteristics.  */
361 #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY	1
362 #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY	2
363 #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS		3
364 
365 /* Bigobj header.  */
366 struct external_ANON_OBJECT_HEADER_BIGOBJ
367 {
368   /* ANON_OBJECT_HEADER_V2 header.  */
369   char Sig1[2];
370   char Sig2[2];
371   char Version[2];
372   char Machine[2];
373   char TimeDateStamp[4];
374   char ClassID[16];
375   char SizeOfData[4];
376   char Flags[4];
377   char MetaDataSize[4];
378   char MetaDataOffset[4];
379 
380   /* BIGOBJ specific.  */
381   char NumberOfSections[4];
382   char PointerToSymbolTable[4];
383   char NumberOfSymbols[4];
384 };
385 
386 #define FILHSZ_BIGOBJ (14 * 4)
387 
388 struct external_SYMBOL_EX
389 {
390   union
391   {
392     char e_name[E_SYMNMLEN];
393 
394     struct
395     {
396       char e_zeroes[4];
397       char e_offset[4];
398     } e;
399   } e;
400 
401   char e_value[4];
402   char e_scnum[4];
403   char e_type[2];
404   char e_sclass[1];
405   char e_numaux[1];
406 } ATTRIBUTE_PACKED ;
407 
408 #define	SYMENT_BIGOBJ	struct external_SYMBOL_EX
409 #define	SYMESZ_BIGOBJ	20
410 
411 #define FILNMLEN_BIGOBJ	20
412 
413 union external_AUX_SYMBOL_EX
414 {
415   struct
416   {
417     char WeakDefaultSymIndex[4];
418     char WeakSearchType[4];
419     char rgbReserved[12];
420   } Sym;
421 
422   struct
423   {
424     char Name[FILNMLEN_BIGOBJ];
425   } File;
426 
427   struct
428   {
429     char Length[4];		/* Section length.  */
430     char NumberOfRelocations[2];/* # relocation entries.  */
431     char NumberOfLinenumbers[2];/* # line numbers.  */
432     char Checksum[4];		/* Section COMDAT checksum.  */
433     char Number[2];	   	/* COMDAT associated section index.  */
434     char Selection[1];		/* COMDAT selection number.  */
435     char bReserved[1];
436     char HighNumber[2];         /* High bits of COMDAT associated sec.  */
437     char rgbReserved[2];
438   } Section;
439 } ATTRIBUTE_PACKED;
440 
441 #define	AUXENT_BIGOBJ	union external_AUX_SYMBOL_EX
442 #define	AUXESZ_BIGOBJ	20
443 
444 /* .pdata/.xdata defines and structures for x64 PE+ for exception handling.  */
445 
446 /* .pdata in exception directory.  */
447 
448 struct pex64_runtime_function
449 {
450   bfd_vma rva_BeginAddress;
451   bfd_vma rva_EndAddress;
452   bfd_vma rva_UnwindData;
453 };
454 
455 struct external_pex64_runtime_function
456 {
457   bfd_byte rva_BeginAddress[4];
458   bfd_byte rva_EndAddress[4];
459   bfd_byte rva_UnwindData[4];
460 };
461 
462 /* If the lowest significant bit is set for rva_UnwindData RVA, it
463    means that the unified RVA points to another pex64_runtime_function
464    that this entry shares the unwind_info block with.  */
465 #define PEX64_IS_RUNTIME_FUNCTION_CHAINED(PTR_RTF) \
466   (((PTR_RTF)->rva_UnwindData & 1) != 0)
467 #define PEX64_GET_UNWINDDATA_UNIFIED_RVA(PTR_RTF) \
468   ((PTR_RTF)->rva_UnwindData & ~1)
469 
470 /* The unwind codes.  */
471 #define UWOP_PUSH_NONVOL      0
472 #define UWOP_ALLOC_LARGE      1
473 #define UWOP_ALLOC_SMALL      2
474 #define UWOP_SET_FPREG	      3
475 #define UWOP_SAVE_NONVOL      4
476 #define UWOP_SAVE_NONVOL_FAR  5
477 #define UWOP_SAVE_XMM         6 /* For version 1.  */
478 #define UWOP_EPILOG           6 /* For version 2.  */
479 #define UWOP_SAVE_XMM_FAR     7 /* For version 1 (deprecated).  */
480 #define UWOP_SPARE            7 /* For version 2.  */
481 #define UWOP_SAVE_XMM128      8
482 #define UWOP_SAVE_XMM128_FAR  9
483 #define UWOP_PUSH_MACHFRAME   10
484 
485 struct pex64_unwind_code
486 {
487   bfd_vma prologue_offset;
488   /* Contains Frame offset, or frame allocation size.  */
489   bfd_vma frame_addr;
490   unsigned int uwop_code : 4;
491   /* xmm, mm, or standard register from 0 - 15.  */
492   unsigned int reg : 4;
493   /* Used for UWOP_PUSH_MACHFRAME to indicate optional errorcode stack
494      argument.  */
495   unsigned int has_errorcode : 1;
496 };
497 
498 struct external_pex64_unwind_code
499 {
500   bfd_byte dta[2];
501 };
502 
503 #define PEX64_UNWCODE_CODE(VAL)	((VAL) & 0xf)
504 #define PEX64_UNWCODE_INFO(VAL) (((VAL) >> 4) & 0xf)
505 
506 /* The unwind info.  */
507 #define UNW_FLAG_NHANDLER     0
508 #define UNW_FLAG_EHANDLER     1
509 #define UNW_FLAG_UHANDLER     2
510 #define UNW_FLAG_FHANDLER     3
511 #define UNW_FLAG_CHAININFO    4
512 
513 #define UNW_FLAG_MASK	      0x1f
514 
515 struct pex64_unwind_info
516 {
517   bfd_vma SizeOfBlock;
518   bfd_byte Version; /* Values from 0 up to 7 are possible.  */
519   bfd_byte Flags; /* Values from 0 up to 31 are possible.  */
520   bfd_vma SizeOfPrologue;
521   bfd_vma CountOfCodes; /* Amount of pex64_unwind_code elements.  */
522   /* 0 = CFA, 1..15 are index of integer registers.  */
523   unsigned int FrameRegister : 4;
524   bfd_vma FrameOffset;
525   bfd_vma sizeofUnwindCodes;
526   bfd_byte *rawUnwindCodes;
527   bfd_vma rva_ExceptionHandler; /* UNW_EHANDLER or UNW_FLAG_UHANDLER.  */
528   bfd_vma rva_BeginAddress;	/* UNW_FLAG_CHAININFO.  */
529   bfd_vma rva_EndAddress;	/* UNW_FLAG_CHAININFO.  */
530   bfd_vma rva_UnwindData;	/* UNW_FLAG_CHAININFO.  */
531 };
532 
533 struct external_pex64_unwind_info
534 {
535   bfd_byte Version_Flags;
536   bfd_byte SizeOfPrologue;
537   bfd_byte CountOfCodes;
538   bfd_byte FrameRegisterOffset;
539   /* external_pex64_unwind_code array.  */
540   /* bfd_byte handler[4];  */
541   /* Optional language specific data.  */
542 };
543 
544 struct external_pex64_scope
545 {
546   bfd_vma Count;
547 };
548 
549 struct pex64_scope
550 {
551   bfd_byte Count[4];
552 };
553 
554 struct pex64_scope_entry
555 {
556   bfd_vma rva_BeginAddress;
557   bfd_vma rva_EndAddress;
558   bfd_vma rva_HandlerAddress;
559   bfd_vma rva_JumpAddress;
560 };
561 #define PEX64_SCOPE_ENTRY_SIZE	16
562 
563 struct external_pex64_scope_entry
564 {
565   bfd_byte rva_BeginAddress[4];
566   bfd_byte rva_EndAddress[4];
567   bfd_byte rva_HandlerAddress[4];
568   bfd_byte rva_JumpAddress[4];
569 };
570 
571 #define PEX64_UWI_VERSION(VAL)	((VAL) & 7)
572 #define PEX64_UWI_FLAGS(VAL)	(((VAL) >> 3) & 0x1f)
573 #define PEX64_UWI_FRAMEREG(VAL)	((VAL) & 0xf)
574 #define PEX64_UWI_FRAMEOFF(VAL)	(((VAL) >> 4) & 0xf)
575 #define PEX64_UWI_SIZEOF_UWCODE_ARRAY(VAL) \
576   ((((VAL) + 1) & ~1) * 2)
577 
578 #define PEX64_OFFSET_TO_UNWIND_CODE 0x4
579 
580 #define PEX64_OFFSET_TO_HANDLER_RVA (COUNTOFUNWINDCODES) \
581   (PEX64_OFFSET_TO_UNWIND_CODE + \
582    PEX64_UWI_SIZEOF_UWCODE_ARRAY(COUNTOFUNWINDCODES))
583 
584 #define PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) \
585   (PEX64_OFFSET_TO_HANDLER_RVA(COUNTOFUNWINDCODES) + 4)
586 
587 #define PEX64_SCOPE_ENTRY(COUNTOFUNWINDCODES, IDX) \
588   (PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) + \
589    PEX64_SCOPE_ENTRY_SIZE * (IDX))
590 
591 /* Extra structure used in debug directory.  */
592 struct external_IMAGE_DEBUG_DIRECTORY
593 {
594   char Characteristics[4];
595   char TimeDateStamp[4];
596   char MajorVersion[2];
597   char MinorVersion[2];
598   char Type[4];
599   char SizeOfData[4];
600   char AddressOfRawData[4];
601   char PointerToRawData[4];
602 };
603 
604 /* Extra structures used in codeview debug record.  */
605 /* This is not part of the PE specification.  */
606 
607 #define CVINFO_PDB70_CVSIGNATURE 0x53445352 // "RSDS"
608 #define CVINFO_PDB20_CVSIGNATURE 0x3031424e // "NB10"
609 #define CVINFO_CV50_CVSIGNATURE  0x3131424e // "NB11"
610 #define CVINFO_CV41_CVSIGNATURE  0x3930424e // "NB09"
611 
612 typedef struct _CV_INFO_PDB70
613 {
614   char CvSignature[4];
615   char Signature[16];
616   char Age[4];
617   char PdbFileName[];
618 } CV_INFO_PDB70;
619 
620 typedef struct _CV_INFO_PDB20
621 {
622   char CvHeader[4];
623   char Offset[4];
624   char Signature[4];
625   char Age[4];
626   char PdbFileName[];
627 } CV_INFO_PDB20;
628 
629 #endif /* _PE_H */
630