File indexing completed on 2026-05-10 08:43:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef LLVM_BINARYFORMAT_COFF_H
0023 #define LLVM_BINARYFORMAT_COFF_H
0024
0025 #include "llvm/Support/DataTypes.h"
0026 #include <cassert>
0027
0028 namespace llvm {
0029 namespace COFF {
0030
0031
0032 const int32_t MaxNumberOfSections16 = 65279;
0033
0034
0035 static const char PEMagic[] = {'P', 'E', '\0', '\0'};
0036
0037 static const char BigObjMagic[] = {
0038 '\xc7', '\xa1', '\xba', '\xd1', '\xee', '\xba', '\xa9', '\x4b',
0039 '\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
0040 };
0041
0042 static const char ClGlObjMagic[] = {
0043 '\x38', '\xfe', '\xb3', '\x0c', '\xa5', '\xd9', '\xab', '\x4d',
0044 '\xac', '\x9b', '\xd6', '\xb6', '\x22', '\x26', '\x53', '\xc2',
0045 };
0046
0047
0048 static const char WinResMagic[] = {
0049 '\x00', '\x00', '\x00', '\x00', '\x20', '\x00', '\x00', '\x00',
0050 '\xff', '\xff', '\x00', '\x00', '\xff', '\xff', '\x00', '\x00',
0051 };
0052
0053
0054 enum {
0055 Header16Size = 20,
0056 Header32Size = 56,
0057 NameSize = 8,
0058 Symbol16Size = 18,
0059 Symbol32Size = 20,
0060 SectionSize = 40,
0061 RelocationSize = 10
0062 };
0063
0064 struct header {
0065 uint16_t Machine;
0066 int32_t NumberOfSections;
0067 uint32_t TimeDateStamp;
0068 uint32_t PointerToSymbolTable;
0069 uint32_t NumberOfSymbols;
0070 uint16_t SizeOfOptionalHeader;
0071 uint16_t Characteristics;
0072 };
0073
0074 struct BigObjHeader {
0075 enum : uint16_t { MinBigObjectVersion = 2 };
0076
0077 uint16_t Sig1;
0078 uint16_t Sig2;
0079 uint16_t Version;
0080 uint16_t Machine;
0081 uint32_t TimeDateStamp;
0082 uint8_t UUID[16];
0083 uint32_t unused1;
0084 uint32_t unused2;
0085 uint32_t unused3;
0086 uint32_t unused4;
0087 uint32_t NumberOfSections;
0088 uint32_t PointerToSymbolTable;
0089 uint32_t NumberOfSymbols;
0090 };
0091
0092 enum MachineTypes : unsigned {
0093 MT_Invalid = 0xffff,
0094
0095 IMAGE_FILE_MACHINE_UNKNOWN = 0x0,
0096 IMAGE_FILE_MACHINE_AM33 = 0x1D3,
0097 IMAGE_FILE_MACHINE_AMD64 = 0x8664,
0098 IMAGE_FILE_MACHINE_ARM = 0x1C0,
0099 IMAGE_FILE_MACHINE_ARMNT = 0x1C4,
0100 IMAGE_FILE_MACHINE_ARM64 = 0xAA64,
0101 IMAGE_FILE_MACHINE_ARM64EC = 0xA641,
0102 IMAGE_FILE_MACHINE_ARM64X = 0xA64E,
0103 IMAGE_FILE_MACHINE_EBC = 0xEBC,
0104 IMAGE_FILE_MACHINE_I386 = 0x14C,
0105 IMAGE_FILE_MACHINE_IA64 = 0x200,
0106 IMAGE_FILE_MACHINE_M32R = 0x9041,
0107 IMAGE_FILE_MACHINE_MIPS16 = 0x266,
0108 IMAGE_FILE_MACHINE_MIPSFPU = 0x366,
0109 IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466,
0110 IMAGE_FILE_MACHINE_POWERPC = 0x1F0,
0111 IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1,
0112 IMAGE_FILE_MACHINE_R4000 = 0x166,
0113 IMAGE_FILE_MACHINE_RISCV32 = 0x5032,
0114 IMAGE_FILE_MACHINE_RISCV64 = 0x5064,
0115 IMAGE_FILE_MACHINE_RISCV128 = 0x5128,
0116 IMAGE_FILE_MACHINE_SH3 = 0x1A2,
0117 IMAGE_FILE_MACHINE_SH3DSP = 0x1A3,
0118 IMAGE_FILE_MACHINE_SH4 = 0x1A6,
0119 IMAGE_FILE_MACHINE_SH5 = 0x1A8,
0120 IMAGE_FILE_MACHINE_THUMB = 0x1C2,
0121 IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169
0122 };
0123
0124 template <typename T> bool isArm64EC(T Machine) {
0125 return Machine == IMAGE_FILE_MACHINE_ARM64EC ||
0126 Machine == IMAGE_FILE_MACHINE_ARM64X;
0127 }
0128
0129 template <typename T> bool isAnyArm64(T Machine) {
0130 return Machine == IMAGE_FILE_MACHINE_ARM64 || isArm64EC(Machine);
0131 }
0132
0133 template <typename T> bool is64Bit(T Machine) {
0134 return Machine == IMAGE_FILE_MACHINE_AMD64 || isAnyArm64(Machine);
0135 }
0136
0137 enum Characteristics : unsigned {
0138 C_Invalid = 0,
0139
0140
0141
0142 IMAGE_FILE_RELOCS_STRIPPED = 0x0001,
0143
0144 IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002,
0145
0146
0147 IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004,
0148
0149
0150 IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008,
0151
0152 IMAGE_FILE_AGGRESSIVE_WS_TRIM = 0x0010,
0153
0154 IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020,
0155
0156
0157 IMAGE_FILE_BYTES_REVERSED_LO = 0x0080,
0158
0159 IMAGE_FILE_32BIT_MACHINE = 0x0100,
0160
0161 IMAGE_FILE_DEBUG_STRIPPED = 0x0200,
0162
0163 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400,
0164
0165 IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800,
0166
0167 IMAGE_FILE_SYSTEM = 0x1000,
0168
0169 IMAGE_FILE_DLL = 0x2000,
0170
0171 IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000,
0172
0173
0174 IMAGE_FILE_BYTES_REVERSED_HI = 0x8000
0175 };
0176
0177 enum ResourceTypeID : unsigned {
0178 RID_Cursor = 1,
0179 RID_Bitmap = 2,
0180 RID_Icon = 3,
0181 RID_Menu = 4,
0182 RID_Dialog = 5,
0183 RID_String = 6,
0184 RID_FontDir = 7,
0185 RID_Font = 8,
0186 RID_Accelerator = 9,
0187 RID_RCData = 10,
0188 RID_MessageTable = 11,
0189 RID_Group_Cursor = 12,
0190 RID_Group_Icon = 14,
0191 RID_Version = 16,
0192 RID_DLGInclude = 17,
0193 RID_PlugPlay = 19,
0194 RID_VXD = 20,
0195 RID_AniCursor = 21,
0196 RID_AniIcon = 22,
0197 RID_HTML = 23,
0198 RID_Manifest = 24,
0199 };
0200
0201 struct symbol {
0202 char Name[NameSize];
0203 uint32_t Value;
0204 int32_t SectionNumber;
0205 uint16_t Type;
0206 uint8_t StorageClass;
0207 uint8_t NumberOfAuxSymbols;
0208 };
0209
0210 enum SymbolSectionNumber : int32_t {
0211 IMAGE_SYM_DEBUG = -2,
0212 IMAGE_SYM_ABSOLUTE = -1,
0213 IMAGE_SYM_UNDEFINED = 0
0214 };
0215
0216
0217 enum SymbolStorageClass {
0218 SSC_Invalid = 0xff,
0219
0220 IMAGE_SYM_CLASS_END_OF_FUNCTION = -1,
0221 IMAGE_SYM_CLASS_NULL = 0,
0222 IMAGE_SYM_CLASS_AUTOMATIC = 1,
0223 IMAGE_SYM_CLASS_EXTERNAL = 2,
0224 IMAGE_SYM_CLASS_STATIC = 3,
0225 IMAGE_SYM_CLASS_REGISTER = 4,
0226 IMAGE_SYM_CLASS_EXTERNAL_DEF = 5,
0227 IMAGE_SYM_CLASS_LABEL = 6,
0228 IMAGE_SYM_CLASS_UNDEFINED_LABEL = 7,
0229 IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8,
0230 IMAGE_SYM_CLASS_ARGUMENT = 9,
0231 IMAGE_SYM_CLASS_STRUCT_TAG = 10,
0232 IMAGE_SYM_CLASS_MEMBER_OF_UNION = 11,
0233 IMAGE_SYM_CLASS_UNION_TAG = 12,
0234 IMAGE_SYM_CLASS_TYPE_DEFINITION = 13,
0235 IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14,
0236 IMAGE_SYM_CLASS_ENUM_TAG = 15,
0237 IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 16,
0238 IMAGE_SYM_CLASS_REGISTER_PARAM = 17,
0239 IMAGE_SYM_CLASS_BIT_FIELD = 18,
0240
0241 IMAGE_SYM_CLASS_BLOCK = 100,
0242
0243 IMAGE_SYM_CLASS_FUNCTION = 101,
0244 IMAGE_SYM_CLASS_END_OF_STRUCT = 102,
0245 IMAGE_SYM_CLASS_FILE = 103,
0246
0247 IMAGE_SYM_CLASS_SECTION = 104,
0248 IMAGE_SYM_CLASS_WEAK_EXTERNAL = 105,
0249
0250 IMAGE_SYM_CLASS_CLR_TOKEN = 107
0251 };
0252
0253 enum SymbolBaseType : unsigned {
0254 IMAGE_SYM_TYPE_NULL = 0,
0255 IMAGE_SYM_TYPE_VOID = 1,
0256 IMAGE_SYM_TYPE_CHAR = 2,
0257 IMAGE_SYM_TYPE_SHORT = 3,
0258 IMAGE_SYM_TYPE_INT = 4,
0259 IMAGE_SYM_TYPE_LONG = 5,
0260 IMAGE_SYM_TYPE_FLOAT = 6,
0261 IMAGE_SYM_TYPE_DOUBLE = 7,
0262 IMAGE_SYM_TYPE_STRUCT = 8,
0263 IMAGE_SYM_TYPE_UNION = 9,
0264 IMAGE_SYM_TYPE_ENUM = 10,
0265 IMAGE_SYM_TYPE_MOE = 11,
0266 IMAGE_SYM_TYPE_BYTE = 12,
0267 IMAGE_SYM_TYPE_WORD = 13,
0268 IMAGE_SYM_TYPE_UINT = 14,
0269 IMAGE_SYM_TYPE_DWORD = 15
0270 };
0271
0272 enum SymbolComplexType : unsigned {
0273 IMAGE_SYM_DTYPE_NULL = 0,
0274 IMAGE_SYM_DTYPE_POINTER = 1,
0275 IMAGE_SYM_DTYPE_FUNCTION = 2,
0276 IMAGE_SYM_DTYPE_ARRAY = 3,
0277
0278
0279 SCT_COMPLEX_TYPE_SHIFT = 4
0280 };
0281
0282 enum AuxSymbolType { IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1 };
0283
0284 struct section {
0285 char Name[NameSize];
0286 uint32_t VirtualSize;
0287 uint32_t VirtualAddress;
0288 uint32_t SizeOfRawData;
0289 uint32_t PointerToRawData;
0290 uint32_t PointerToRelocations;
0291 uint32_t PointerToLineNumbers;
0292 uint16_t NumberOfRelocations;
0293 uint16_t NumberOfLineNumbers;
0294 uint32_t Characteristics;
0295 };
0296
0297 enum SectionCharacteristics : uint32_t {
0298 SC_Invalid = 0xffffffff,
0299
0300 IMAGE_SCN_TYPE_NOLOAD = 0x00000002,
0301 IMAGE_SCN_TYPE_NO_PAD = 0x00000008,
0302 IMAGE_SCN_CNT_CODE = 0x00000020,
0303 IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040,
0304 IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
0305 IMAGE_SCN_LNK_OTHER = 0x00000100,
0306 IMAGE_SCN_LNK_INFO = 0x00000200,
0307 IMAGE_SCN_LNK_REMOVE = 0x00000800,
0308 IMAGE_SCN_LNK_COMDAT = 0x00001000,
0309 IMAGE_SCN_GPREL = 0x00008000,
0310 IMAGE_SCN_MEM_PURGEABLE = 0x00020000,
0311 IMAGE_SCN_MEM_16BIT = 0x00020000,
0312 IMAGE_SCN_MEM_LOCKED = 0x00040000,
0313 IMAGE_SCN_MEM_PRELOAD = 0x00080000,
0314 IMAGE_SCN_ALIGN_1BYTES = 0x00100000,
0315 IMAGE_SCN_ALIGN_2BYTES = 0x00200000,
0316 IMAGE_SCN_ALIGN_4BYTES = 0x00300000,
0317 IMAGE_SCN_ALIGN_8BYTES = 0x00400000,
0318 IMAGE_SCN_ALIGN_16BYTES = 0x00500000,
0319 IMAGE_SCN_ALIGN_32BYTES = 0x00600000,
0320 IMAGE_SCN_ALIGN_64BYTES = 0x00700000,
0321 IMAGE_SCN_ALIGN_128BYTES = 0x00800000,
0322 IMAGE_SCN_ALIGN_256BYTES = 0x00900000,
0323 IMAGE_SCN_ALIGN_512BYTES = 0x00A00000,
0324 IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000,
0325 IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000,
0326 IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000,
0327 IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000,
0328 IMAGE_SCN_ALIGN_MASK = 0x00F00000,
0329 IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000,
0330 IMAGE_SCN_MEM_DISCARDABLE = 0x02000000,
0331 IMAGE_SCN_MEM_NOT_CACHED = 0x04000000,
0332 IMAGE_SCN_MEM_NOT_PAGED = 0x08000000,
0333 IMAGE_SCN_MEM_SHARED = 0x10000000,
0334 IMAGE_SCN_MEM_EXECUTE = 0x20000000,
0335 IMAGE_SCN_MEM_READ = 0x40000000,
0336 IMAGE_SCN_MEM_WRITE = 0x80000000
0337 };
0338
0339 struct relocation {
0340 uint32_t VirtualAddress;
0341 uint32_t SymbolTableIndex;
0342 uint16_t Type;
0343 };
0344
0345 enum RelocationTypeI386 : unsigned {
0346 IMAGE_REL_I386_ABSOLUTE = 0x0000,
0347 IMAGE_REL_I386_DIR16 = 0x0001,
0348 IMAGE_REL_I386_REL16 = 0x0002,
0349 IMAGE_REL_I386_DIR32 = 0x0006,
0350 IMAGE_REL_I386_DIR32NB = 0x0007,
0351 IMAGE_REL_I386_SEG12 = 0x0009,
0352 IMAGE_REL_I386_SECTION = 0x000A,
0353 IMAGE_REL_I386_SECREL = 0x000B,
0354 IMAGE_REL_I386_TOKEN = 0x000C,
0355 IMAGE_REL_I386_SECREL7 = 0x000D,
0356 IMAGE_REL_I386_REL32 = 0x0014
0357 };
0358
0359 enum RelocationTypeAMD64 : unsigned {
0360 IMAGE_REL_AMD64_ABSOLUTE = 0x0000,
0361 IMAGE_REL_AMD64_ADDR64 = 0x0001,
0362 IMAGE_REL_AMD64_ADDR32 = 0x0002,
0363 IMAGE_REL_AMD64_ADDR32NB = 0x0003,
0364 IMAGE_REL_AMD64_REL32 = 0x0004,
0365 IMAGE_REL_AMD64_REL32_1 = 0x0005,
0366 IMAGE_REL_AMD64_REL32_2 = 0x0006,
0367 IMAGE_REL_AMD64_REL32_3 = 0x0007,
0368 IMAGE_REL_AMD64_REL32_4 = 0x0008,
0369 IMAGE_REL_AMD64_REL32_5 = 0x0009,
0370 IMAGE_REL_AMD64_SECTION = 0x000A,
0371 IMAGE_REL_AMD64_SECREL = 0x000B,
0372 IMAGE_REL_AMD64_SECREL7 = 0x000C,
0373 IMAGE_REL_AMD64_TOKEN = 0x000D,
0374 IMAGE_REL_AMD64_SREL32 = 0x000E,
0375 IMAGE_REL_AMD64_PAIR = 0x000F,
0376 IMAGE_REL_AMD64_SSPAN32 = 0x0010
0377 };
0378
0379 enum RelocationTypesARM : unsigned {
0380 IMAGE_REL_ARM_ABSOLUTE = 0x0000,
0381 IMAGE_REL_ARM_ADDR32 = 0x0001,
0382 IMAGE_REL_ARM_ADDR32NB = 0x0002,
0383 IMAGE_REL_ARM_BRANCH24 = 0x0003,
0384 IMAGE_REL_ARM_BRANCH11 = 0x0004,
0385 IMAGE_REL_ARM_TOKEN = 0x0005,
0386 IMAGE_REL_ARM_BLX24 = 0x0008,
0387 IMAGE_REL_ARM_BLX11 = 0x0009,
0388 IMAGE_REL_ARM_REL32 = 0x000A,
0389 IMAGE_REL_ARM_SECTION = 0x000E,
0390 IMAGE_REL_ARM_SECREL = 0x000F,
0391 IMAGE_REL_ARM_MOV32A = 0x0010,
0392 IMAGE_REL_ARM_MOV32T = 0x0011,
0393 IMAGE_REL_ARM_BRANCH20T = 0x0012,
0394 IMAGE_REL_ARM_BRANCH24T = 0x0014,
0395 IMAGE_REL_ARM_BLX23T = 0x0015,
0396 IMAGE_REL_ARM_PAIR = 0x0016,
0397 };
0398
0399 enum RelocationTypesARM64 : unsigned {
0400 IMAGE_REL_ARM64_ABSOLUTE = 0x0000,
0401 IMAGE_REL_ARM64_ADDR32 = 0x0001,
0402 IMAGE_REL_ARM64_ADDR32NB = 0x0002,
0403 IMAGE_REL_ARM64_BRANCH26 = 0x0003,
0404 IMAGE_REL_ARM64_PAGEBASE_REL21 = 0x0004,
0405 IMAGE_REL_ARM64_REL21 = 0x0005,
0406 IMAGE_REL_ARM64_PAGEOFFSET_12A = 0x0006,
0407 IMAGE_REL_ARM64_PAGEOFFSET_12L = 0x0007,
0408 IMAGE_REL_ARM64_SECREL = 0x0008,
0409 IMAGE_REL_ARM64_SECREL_LOW12A = 0x0009,
0410 IMAGE_REL_ARM64_SECREL_HIGH12A = 0x000A,
0411 IMAGE_REL_ARM64_SECREL_LOW12L = 0x000B,
0412 IMAGE_REL_ARM64_TOKEN = 0x000C,
0413 IMAGE_REL_ARM64_SECTION = 0x000D,
0414 IMAGE_REL_ARM64_ADDR64 = 0x000E,
0415 IMAGE_REL_ARM64_BRANCH19 = 0x000F,
0416 IMAGE_REL_ARM64_BRANCH14 = 0x0010,
0417 IMAGE_REL_ARM64_REL32 = 0x0011,
0418 };
0419
0420 enum RelocationTypesMips : unsigned {
0421 IMAGE_REL_MIPS_ABSOLUTE = 0x0000,
0422 IMAGE_REL_MIPS_REFHALF = 0x0001,
0423 IMAGE_REL_MIPS_REFWORD = 0x0002,
0424 IMAGE_REL_MIPS_JMPADDR = 0x0003,
0425 IMAGE_REL_MIPS_REFHI = 0x0004,
0426 IMAGE_REL_MIPS_REFLO = 0x0005,
0427 IMAGE_REL_MIPS_GPREL = 0x0006,
0428 IMAGE_REL_MIPS_LITERAL = 0x0007,
0429 IMAGE_REL_MIPS_SECTION = 0x000A,
0430 IMAGE_REL_MIPS_SECREL = 0x000B,
0431 IMAGE_REL_MIPS_SECRELLO = 0x000C,
0432 IMAGE_REL_MIPS_SECRELHI = 0x000D,
0433 IMAGE_REL_MIPS_JMPADDR16 = 0x0010,
0434 IMAGE_REL_MIPS_REFWORDNB = 0x0022,
0435 IMAGE_REL_MIPS_PAIR = 0x0025,
0436 };
0437
0438 enum DynamicRelocationType : unsigned {
0439 IMAGE_DYNAMIC_RELOCATION_GUARD_RF_PROLOGUE = 1,
0440 IMAGE_DYNAMIC_RELOCATION_GUARD_RF_EPILOGUE = 2,
0441 IMAGE_DYNAMIC_RELOCATION_GUARD_IMPORT_CONTROL_TRANSFER = 3,
0442 IMAGE_DYNAMIC_RELOCATION_GUARD_INDIR_CONTROL_TRANSFER = 4,
0443 IMAGE_DYNAMIC_RELOCATION_GUARD_SWITCHTABLE_BRANCH = 5,
0444 IMAGE_DYNAMIC_RELOCATION_ARM64X = 6,
0445 };
0446
0447 enum Arm64XFixupType : uint8_t {
0448 IMAGE_DVRT_ARM64X_FIXUP_TYPE_ZEROFILL = 0,
0449 IMAGE_DVRT_ARM64X_FIXUP_TYPE_VALUE = 1,
0450 IMAGE_DVRT_ARM64X_FIXUP_TYPE_DELTA = 2,
0451 };
0452
0453 enum COMDATType : uint8_t {
0454 IMAGE_COMDAT_SELECT_NODUPLICATES = 1,
0455 IMAGE_COMDAT_SELECT_ANY,
0456 IMAGE_COMDAT_SELECT_SAME_SIZE,
0457 IMAGE_COMDAT_SELECT_EXACT_MATCH,
0458 IMAGE_COMDAT_SELECT_ASSOCIATIVE,
0459 IMAGE_COMDAT_SELECT_LARGEST,
0460 IMAGE_COMDAT_SELECT_NEWEST
0461 };
0462
0463
0464 struct AuxiliaryFunctionDefinition {
0465 uint32_t TagIndex;
0466 uint32_t TotalSize;
0467 uint32_t PointerToLinenumber;
0468 uint32_t PointerToNextFunction;
0469 char unused[2];
0470 };
0471
0472 struct AuxiliarybfAndefSymbol {
0473 uint8_t unused1[4];
0474 uint16_t Linenumber;
0475 uint8_t unused2[6];
0476 uint32_t PointerToNextFunction;
0477 uint8_t unused3[2];
0478 };
0479
0480 struct AuxiliaryWeakExternal {
0481 uint32_t TagIndex;
0482 uint32_t Characteristics;
0483 uint8_t unused[10];
0484 };
0485
0486 enum WeakExternalCharacteristics : unsigned {
0487 IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
0488 IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2,
0489 IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3,
0490 IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY = 4
0491 };
0492
0493 struct AuxiliarySectionDefinition {
0494 uint32_t Length;
0495 uint16_t NumberOfRelocations;
0496 uint16_t NumberOfLinenumbers;
0497 uint32_t CheckSum;
0498 uint32_t Number;
0499 uint8_t Selection;
0500 char unused;
0501 };
0502
0503 struct AuxiliaryCLRToken {
0504 uint8_t AuxType;
0505 uint8_t unused1;
0506 uint32_t SymbolTableIndex;
0507 char unused2[12];
0508 };
0509
0510 union Auxiliary {
0511 AuxiliaryFunctionDefinition FunctionDefinition;
0512 AuxiliarybfAndefSymbol bfAndefSymbol;
0513 AuxiliaryWeakExternal WeakExternal;
0514 AuxiliarySectionDefinition SectionDefinition;
0515 };
0516
0517
0518
0519
0520 struct ImportDirectoryTableEntry {
0521 uint32_t ImportLookupTableRVA;
0522 uint32_t TimeDateStamp;
0523 uint32_t ForwarderChain;
0524 uint32_t NameRVA;
0525 uint32_t ImportAddressTableRVA;
0526 };
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536 struct ImportLookupTableEntry32 {
0537 uint32_t data;
0538
0539
0540 bool isOrdinal() const { return data & 0x80000000; }
0541
0542
0543 uint16_t getOrdinal() const {
0544 assert(isOrdinal() && "ILT entry is not an ordinal!");
0545 return data & 0xFFFF;
0546 }
0547
0548
0549 void setOrdinal(uint16_t o) {
0550 data = o;
0551 data |= 0x80000000;
0552 }
0553
0554
0555 uint32_t getHintNameRVA() const {
0556 assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!");
0557 return data;
0558 }
0559
0560
0561 void setHintNameRVA(uint32_t rva) { data = rva; }
0562 };
0563
0564
0565 struct DOSHeader {
0566 uint16_t Magic;
0567 uint16_t UsedBytesInTheLastPage;
0568 uint16_t FileSizeInPages;
0569 uint16_t NumberOfRelocationItems;
0570 uint16_t HeaderSizeInParagraphs;
0571 uint16_t MinimumExtraParagraphs;
0572 uint16_t MaximumExtraParagraphs;
0573 uint16_t InitialRelativeSS;
0574 uint16_t InitialSP;
0575 uint16_t Checksum;
0576 uint16_t InitialIP;
0577 uint16_t InitialRelativeCS;
0578 uint16_t AddressOfRelocationTable;
0579 uint16_t OverlayNumber;
0580 uint16_t Reserved[4];
0581 uint16_t OEMid;
0582 uint16_t OEMinfo;
0583 uint16_t Reserved2[10];
0584 uint32_t AddressOfNewExeHeader;
0585 };
0586
0587 struct PE32Header {
0588 enum { PE32 = 0x10b, PE32_PLUS = 0x20b };
0589
0590 uint16_t Magic;
0591 uint8_t MajorLinkerVersion;
0592 uint8_t MinorLinkerVersion;
0593 uint32_t SizeOfCode;
0594 uint32_t SizeOfInitializedData;
0595 uint32_t SizeOfUninitializedData;
0596 uint32_t AddressOfEntryPoint;
0597 uint32_t BaseOfCode;
0598 uint32_t BaseOfData;
0599 uint64_t ImageBase;
0600 uint32_t SectionAlignment;
0601 uint32_t FileAlignment;
0602 uint16_t MajorOperatingSystemVersion;
0603 uint16_t MinorOperatingSystemVersion;
0604 uint16_t MajorImageVersion;
0605 uint16_t MinorImageVersion;
0606 uint16_t MajorSubsystemVersion;
0607 uint16_t MinorSubsystemVersion;
0608 uint32_t Win32VersionValue;
0609 uint32_t SizeOfImage;
0610 uint32_t SizeOfHeaders;
0611 uint32_t CheckSum;
0612 uint16_t Subsystem;
0613
0614 uint16_t DLLCharacteristics;
0615 uint64_t SizeOfStackReserve;
0616 uint64_t SizeOfStackCommit;
0617 uint64_t SizeOfHeapReserve;
0618 uint64_t SizeOfHeapCommit;
0619 uint32_t LoaderFlags;
0620
0621 uint32_t NumberOfRvaAndSize;
0622 };
0623
0624 struct DataDirectory {
0625 uint32_t RelativeVirtualAddress;
0626 uint32_t Size;
0627 };
0628
0629 enum DataDirectoryIndex : unsigned {
0630 EXPORT_TABLE = 0,
0631 IMPORT_TABLE,
0632 RESOURCE_TABLE,
0633 EXCEPTION_TABLE,
0634 CERTIFICATE_TABLE,
0635 BASE_RELOCATION_TABLE,
0636 DEBUG_DIRECTORY,
0637 ARCHITECTURE,
0638 GLOBAL_PTR,
0639 TLS_TABLE,
0640 LOAD_CONFIG_TABLE,
0641 BOUND_IMPORT,
0642 IAT,
0643 DELAY_IMPORT_DESCRIPTOR,
0644 CLR_RUNTIME_HEADER,
0645
0646 NUM_DATA_DIRECTORIES
0647 };
0648
0649 enum WindowsSubsystem : unsigned {
0650 IMAGE_SUBSYSTEM_UNKNOWN = 0,
0651 IMAGE_SUBSYSTEM_NATIVE = 1,
0652 IMAGE_SUBSYSTEM_WINDOWS_GUI = 2,
0653 IMAGE_SUBSYSTEM_WINDOWS_CUI = 3,
0654 IMAGE_SUBSYSTEM_OS2_CUI = 5,
0655 IMAGE_SUBSYSTEM_POSIX_CUI = 7,
0656 IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8,
0657 IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9,
0658 IMAGE_SUBSYSTEM_EFI_APPLICATION = 10,
0659 IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11,
0660
0661 IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12,
0662
0663 IMAGE_SUBSYSTEM_EFI_ROM = 13,
0664 IMAGE_SUBSYSTEM_XBOX = 14,
0665 IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16
0666 };
0667
0668 enum DLLCharacteristics : unsigned {
0669
0670 IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020,
0671
0672 IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040,
0673
0674 IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
0675
0676 IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100,
0677
0678 IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION = 0x0200,
0679
0680
0681 IMAGE_DLL_CHARACTERISTICS_NO_SEH = 0x0400,
0682
0683 IMAGE_DLL_CHARACTERISTICS_NO_BIND = 0x0800,
0684
0685 IMAGE_DLL_CHARACTERISTICS_APPCONTAINER = 0x1000,
0686
0687 IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER = 0x2000,
0688
0689 IMAGE_DLL_CHARACTERISTICS_GUARD_CF = 0x4000,
0690
0691 IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
0692 };
0693
0694 enum ExtendedDLLCharacteristics : unsigned {
0695
0696 IMAGE_DLL_CHARACTERISTICS_EX_CET_COMPAT = 0x0001
0697 };
0698
0699 enum DebugType : unsigned {
0700 IMAGE_DEBUG_TYPE_UNKNOWN = 0,
0701 IMAGE_DEBUG_TYPE_COFF = 1,
0702 IMAGE_DEBUG_TYPE_CODEVIEW = 2,
0703 IMAGE_DEBUG_TYPE_FPO = 3,
0704 IMAGE_DEBUG_TYPE_MISC = 4,
0705 IMAGE_DEBUG_TYPE_EXCEPTION = 5,
0706 IMAGE_DEBUG_TYPE_FIXUP = 6,
0707 IMAGE_DEBUG_TYPE_OMAP_TO_SRC = 7,
0708 IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8,
0709 IMAGE_DEBUG_TYPE_BORLAND = 9,
0710 IMAGE_DEBUG_TYPE_RESERVED10 = 10,
0711 IMAGE_DEBUG_TYPE_CLSID = 11,
0712 IMAGE_DEBUG_TYPE_VC_FEATURE = 12,
0713 IMAGE_DEBUG_TYPE_POGO = 13,
0714 IMAGE_DEBUG_TYPE_ILTCG = 14,
0715 IMAGE_DEBUG_TYPE_MPX = 15,
0716 IMAGE_DEBUG_TYPE_REPRO = 16,
0717 IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS = 20,
0718 };
0719
0720 enum BaseRelocationType : unsigned {
0721 IMAGE_REL_BASED_ABSOLUTE = 0,
0722 IMAGE_REL_BASED_HIGH = 1,
0723 IMAGE_REL_BASED_LOW = 2,
0724 IMAGE_REL_BASED_HIGHLOW = 3,
0725 IMAGE_REL_BASED_HIGHADJ = 4,
0726 IMAGE_REL_BASED_MIPS_JMPADDR = 5,
0727 IMAGE_REL_BASED_ARM_MOV32A = 5,
0728 IMAGE_REL_BASED_ARM_MOV32T = 7,
0729 IMAGE_REL_BASED_MIPS_JMPADDR16 = 9,
0730 IMAGE_REL_BASED_DIR64 = 10
0731 };
0732
0733 enum ImportType : unsigned {
0734 IMPORT_CODE = 0,
0735 IMPORT_DATA = 1,
0736 IMPORT_CONST = 2
0737 };
0738
0739 enum ImportNameType : unsigned {
0740
0741
0742
0743
0744 IMPORT_ORDINAL = 0,
0745
0746 IMPORT_NAME = 1,
0747
0748
0749 IMPORT_NAME_NOPREFIX = 2,
0750
0751
0752 IMPORT_NAME_UNDECORATE = 3,
0753
0754
0755 IMPORT_NAME_EXPORTAS = 4
0756 };
0757
0758 enum class GuardFlags : uint32_t {
0759
0760
0761 CF_INSTRUMENTED = 0x100,
0762
0763 CFW_INSTRUMENTED = 0x200,
0764
0765 CF_FUNCTION_TABLE_PRESENT = 0x400,
0766
0767 SECURITY_COOKIE_UNUSED = 0x800,
0768
0769 PROTECT_DELAYLOAD_IAT = 0x1000,
0770
0771
0772 DELAYLOAD_IAT_IN_ITS_OWN_SECTION = 0x2000,
0773
0774
0775 CF_EXPORT_SUPPRESSION_INFO_PRESENT = 0x4000,
0776
0777 CF_ENABLE_EXPORT_SUPPRESSION = 0x8000,
0778
0779 CF_LONGJUMP_TABLE_PRESENT = 0x10000,
0780
0781 EH_CONTINUATION_TABLE_PRESENT = 0x400000,
0782
0783
0784
0785 CF_FUNCTION_TABLE_SIZE_MASK = 0xF0000000,
0786 CF_FUNCTION_TABLE_SIZE_5BYTES = 0x10000000,
0787 CF_FUNCTION_TABLE_SIZE_6BYTES = 0x20000000,
0788 CF_FUNCTION_TABLE_SIZE_7BYTES = 0x30000000,
0789 CF_FUNCTION_TABLE_SIZE_8BYTES = 0x40000000,
0790 CF_FUNCTION_TABLE_SIZE_9BYTES = 0x50000000,
0791 CF_FUNCTION_TABLE_SIZE_10BYTES = 0x60000000,
0792 CF_FUNCTION_TABLE_SIZE_11BYTES = 0x70000000,
0793 CF_FUNCTION_TABLE_SIZE_12BYTES = 0x80000000,
0794 CF_FUNCTION_TABLE_SIZE_13BYTES = 0x90000000,
0795 CF_FUNCTION_TABLE_SIZE_14BYTES = 0xA0000000,
0796 CF_FUNCTION_TABLE_SIZE_15BYTES = 0xB0000000,
0797 CF_FUNCTION_TABLE_SIZE_16BYTES = 0xC0000000,
0798 CF_FUNCTION_TABLE_SIZE_17BYTES = 0xD0000000,
0799 CF_FUNCTION_TABLE_SIZE_18BYTES = 0xE0000000,
0800 CF_FUNCTION_TABLE_SIZE_19BYTES = 0xF0000000,
0801 };
0802
0803 struct ImportHeader {
0804 uint16_t Sig1;
0805 uint16_t Sig2;
0806 uint16_t Version;
0807 uint16_t Machine;
0808 uint32_t TimeDateStamp;
0809 uint32_t SizeOfData;
0810 uint16_t OrdinalHint;
0811 uint16_t TypeInfo;
0812
0813 ImportType getType() const { return static_cast<ImportType>(TypeInfo & 0x3); }
0814
0815 ImportNameType getNameType() const {
0816 return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 2);
0817 }
0818 };
0819
0820 enum CodeViewIdentifiers {
0821 DEBUG_SECTION_MAGIC = 0x4,
0822 DEBUG_HASHES_SECTION_MAGIC = 0x133C9C5
0823 };
0824
0825
0826
0827 enum Feat00Flags : uint32_t {
0828
0829 SafeSEH = 0x1,
0830
0831 GuardStack = 0x100,
0832
0833 SDL = 0x200,
0834
0835 GuardCF = 0x800,
0836
0837 GuardEHCont = 0x4000,
0838
0839 Kernel = 0x40000000,
0840 };
0841
0842 enum Arm64ECThunkType : uint8_t {
0843 GuestExit = 0,
0844 Entry = 1,
0845 Exit = 4,
0846 };
0847
0848 inline bool isReservedSectionNumber(int32_t SectionNumber) {
0849 return SectionNumber <= 0;
0850 }
0851
0852
0853
0854 bool encodeSectionName(char *Out, uint64_t Offset);
0855
0856 }
0857 }
0858
0859 #endif