| ... | @@ -175,6 +175,8 @@ pub const Subsystem = enum(u16) { | ... | @@ -175,6 +175,8 @@ pub const Subsystem = enum(u16) { |
| 175 | | 175 | |
| 176 | /// Windows boot application | 176 | /// Windows boot application |
| 177 | WINDOWS_BOOT_APPLICATION = 16, | 177 | WINDOWS_BOOT_APPLICATION = 16, |
| | 178 | |
| | 179 | _, |
| 178 | }; | 180 | }; |
| 179 | | 181 | |
| 180 | pub const OptionalHeader = extern struct { | 182 | pub const OptionalHeader = extern struct { |
| ... | @@ -300,6 +302,8 @@ pub const DirectoryEntry = enum(u16) { | ... | @@ -300,6 +302,8 @@ pub const DirectoryEntry = enum(u16) { |
| 300 | | 302 | |
| 301 | /// COM Runtime descriptor | 303 | /// COM Runtime descriptor |
| 302 | COM_DESCRIPTOR = 14, | 304 | COM_DESCRIPTOR = 14, |
| | 305 | |
| | 306 | _, |
| 303 | }; | 307 | }; |
| 304 | | 308 | |
| 305 | pub const ImageDataDirectory = extern struct { | 309 | pub const ImageDataDirectory = extern struct { |
| ... | @@ -383,6 +387,8 @@ pub const BaseRelocationType = enum(u4) { | ... | @@ -383,6 +387,8 @@ pub const BaseRelocationType = enum(u4) { |
| 383 | | 387 | |
| 384 | /// The base relocation applies the difference to the 64-bit field at offset. | 388 | /// The base relocation applies the difference to the 64-bit field at offset. |
| 385 | DIR64 = 10, | 389 | DIR64 = 10, |
| | 390 | |
| | 391 | _, |
| 386 | }; | 392 | }; |
| 387 | | 393 | |
| 388 | pub const DebugDirectoryEntry = extern struct { | 394 | pub const DebugDirectoryEntry = extern struct { |
| ... | @@ -414,6 +420,8 @@ pub const DebugType = enum(u32) { | ... | @@ -414,6 +420,8 @@ pub const DebugType = enum(u32) { |
| 414 | MPX = 15, | 420 | MPX = 15, |
| 415 | REPRO = 16, | 421 | REPRO = 16, |
| 416 | EX_DLLCHARACTERISTICS = 20, | 422 | EX_DLLCHARACTERISTICS = 20, |
| | 423 | |
| | 424 | _, |
| 417 | }; | 425 | }; |
| 418 | | 426 | |
| 419 | pub const ImportDirectoryEntry = extern struct { | 427 | pub const ImportDirectoryEntry = extern struct { |
| ... | @@ -736,6 +744,8 @@ pub const BaseType = enum(u8) { | ... | @@ -736,6 +744,8 @@ pub const BaseType = enum(u8) { |
| 736 | | 744 | |
| 737 | /// An unsigned 4-byte integer | 745 | /// An unsigned 4-byte integer |
| 738 | DWORD = 15, | 746 | DWORD = 15, |
| | 747 | |
| | 748 | _, |
| 739 | }; | 749 | }; |
| 740 | | 750 | |
| 741 | pub const ComplexType = enum(u8) { | 751 | pub const ComplexType = enum(u8) { |
| ... | @@ -750,6 +760,8 @@ pub const ComplexType = enum(u8) { | ... | @@ -750,6 +760,8 @@ pub const ComplexType = enum(u8) { |
| 750 | | 760 | |
| 751 | /// The symbol is an array of base type. | 761 | /// The symbol is an array of base type. |
| 752 | ARRAY = 48, | 762 | ARRAY = 48, |
| | 763 | |
| | 764 | _, |
| 753 | }; | 765 | }; |
| 754 | | 766 | |
| 755 | pub const StorageClass = enum(u8) { | 767 | pub const StorageClass = enum(u8) { |
| ... | @@ -843,6 +855,8 @@ pub const StorageClass = enum(u8) { | ... | @@ -843,6 +855,8 @@ pub const StorageClass = enum(u8) { |
| 843 | /// A CLR token symbol. The name is an ASCII string that consists of the hexadecimal value of the token. | 855 | /// A CLR token symbol. The name is an ASCII string that consists of the hexadecimal value of the token. |
| 844 | /// For more information, see CLR Token Definition (Object Only). | 856 | /// For more information, see CLR Token Definition (Object Only). |
| 845 | CLR_TOKEN = 107, | 857 | CLR_TOKEN = 107, |
| | 858 | |
| | 859 | _, |
| 846 | }; | 860 | }; |
| 847 | | 861 | |
| 848 | pub const FunctionDefinition = struct { | 862 | pub const FunctionDefinition = struct { |
| ... | @@ -915,6 +929,7 @@ pub const WeakExternalFlag = enum(u32) { | ... | @@ -915,6 +929,7 @@ pub const WeakExternalFlag = enum(u32) { |
| 915 | SEARCH_LIBRARY = 2, | 929 | SEARCH_LIBRARY = 2, |
| 916 | SEARCH_ALIAS = 3, | 930 | SEARCH_ALIAS = 3, |
| 917 | ANTI_DEPENDENCY = 4, | 931 | ANTI_DEPENDENCY = 4, |
| | 932 | _, |
| 918 | }; | 933 | }; |
| 919 | | 934 | |
| 920 | pub const ComdatSelection = enum(u8) { | 935 | pub const ComdatSelection = enum(u8) { |
| ... | @@ -947,6 +962,8 @@ pub const ComdatSelection = enum(u8) { | ... | @@ -947,6 +962,8 @@ pub const ComdatSelection = enum(u8) { |
| 947 | /// The linker chooses the largest definition from among all of the definitions for this symbol. | 962 | /// The linker chooses the largest definition from among all of the definitions for this symbol. |
| 948 | /// If multiple definitions have this size, the choice between them is arbitrary. | 963 | /// If multiple definitions have this size, the choice between them is arbitrary. |
| 949 | LARGEST = 6, | 964 | LARGEST = 6, |
| | 965 | |
| | 966 | _, |
| 950 | }; | 967 | }; |
| 951 | | 968 | |
| 952 | pub const DebugInfoDefinition = struct { | 969 | pub const DebugInfoDefinition = struct { |
| ... | @@ -975,6 +992,8 @@ pub const MachineType = enum(u16) { | ... | @@ -975,6 +992,8 @@ pub const MachineType = enum(u16) { |
| 975 | ARM = 0x1c0, | 992 | ARM = 0x1c0, |
| 976 | /// ARM64 little endian | 993 | /// ARM64 little endian |
| 977 | ARM64 = 0xaa64, | 994 | ARM64 = 0xaa64, |
| | 995 | /// ARM64EC |
| | 996 | ARM64EC = 0xa641, |
| 978 | /// ARM Thumb-2 little endian | 997 | /// ARM Thumb-2 little endian |
| 979 | ARMNT = 0x1c4, | 998 | ARMNT = 0x1c4, |
| 980 | /// EFI byte code | 999 | /// EFI byte code |
| ... | @@ -1016,6 +1035,8 @@ pub const MachineType = enum(u16) { | ... | @@ -1016,6 +1035,8 @@ pub const MachineType = enum(u16) { |
| 1016 | /// MIPS little-endian WCE v2 | 1035 | /// MIPS little-endian WCE v2 |
| 1017 | WCEMIPSV2 = 0x169, | 1036 | WCEMIPSV2 = 0x169, |
| 1018 | | 1037 | |
| | 1038 | _, |
| | 1039 | |
| 1019 | pub fn fromTargetCpuArch(arch: std.Target.Cpu.Arch) MachineType { | 1040 | pub fn fromTargetCpuArch(arch: std.Target.Cpu.Arch) MachineType { |
| 1020 | return switch (arch) { | 1041 | return switch (arch) { |
| 1021 | .arm => .ARM, | 1042 | .arm => .ARM, |
| ... | @@ -1401,3 +1422,166 @@ pub const Strtab = struct { | ... | @@ -1401,3 +1422,166 @@ pub const Strtab = struct { |
| 1401 | return mem.sliceTo(@as([*:0]const u8, @ptrCast(self.buffer.ptr + off)), 0); | 1422 | return mem.sliceTo(@as([*:0]const u8, @ptrCast(self.buffer.ptr + off)), 0); |
| 1402 | } | 1423 | } |
| 1403 | }; | 1424 | }; |
| | 1425 | |
| | 1426 | pub const ImportHeader = extern struct { |
| | 1427 | sig1: MachineType, |
| | 1428 | sig2: u16, |
| | 1429 | version: u16, |
| | 1430 | machine: MachineType, |
| | 1431 | time_date_stamp: u32, |
| | 1432 | size_of_data: u32, |
| | 1433 | hint: u16, |
| | 1434 | types: packed struct { |
| | 1435 | type: ImportType, |
| | 1436 | name_type: ImportNameType, |
| | 1437 | reserved: u11, |
| | 1438 | }, |
| | 1439 | }; |
| | 1440 | |
| | 1441 | pub const ImportType = enum(u2) { |
| | 1442 | /// Executable code. |
| | 1443 | CODE = 0, |
| | 1444 | /// Data. |
| | 1445 | DATA = 1, |
| | 1446 | /// Specified as CONST in .def file. |
| | 1447 | CONST = 2, |
| | 1448 | _, |
| | 1449 | }; |
| | 1450 | |
| | 1451 | pub const ImportNameType = enum(u3) { |
| | 1452 | /// The import is by ordinal. This indicates that the value in the Ordinal/Hint |
| | 1453 | /// field of the import header is the import's ordinal. If this constant is not |
| | 1454 | /// specified, then the Ordinal/Hint field should always be interpreted as the import's hint. |
| | 1455 | ORDINAL = 0, |
| | 1456 | /// The import name is identical to the public symbol name. |
| | 1457 | NAME = 1, |
| | 1458 | /// The import name is the public symbol name, but skipping the leading ?, @, or optionally _. |
| | 1459 | NAME_NOPREFIX = 2, |
| | 1460 | /// The import name is the public symbol name, but skipping the leading ?, @, or optionally _, |
| | 1461 | /// and truncating at the first @. |
| | 1462 | NAME_UNDECORATE = 3, |
| | 1463 | _, |
| | 1464 | }; |
| | 1465 | |
| | 1466 | pub const Relocation = extern struct { |
| | 1467 | virtual_address: u32, |
| | 1468 | symbol_table_index: u32, |
| | 1469 | type: u16, |
| | 1470 | }; |
| | 1471 | |
| | 1472 | pub const ImageRelAmd64 = enum(u16) { |
| | 1473 | /// The relocation is ignored. |
| | 1474 | absolute = 0, |
| | 1475 | |
| | 1476 | /// The 64-bit VA of the relocation target. |
| | 1477 | addr64 = 1, |
| | 1478 | |
| | 1479 | /// The 32-bit VA of the relocation target. |
| | 1480 | addr32 = 2, |
| | 1481 | |
| | 1482 | /// The 32-bit address without an image base. |
| | 1483 | addr32nb = 3, |
| | 1484 | |
| | 1485 | /// The 32-bit relative address from the byte following the relocation. |
| | 1486 | rel32 = 4, |
| | 1487 | |
| | 1488 | /// The 32-bit address relative to byte distance 1 from the relocation. |
| | 1489 | rel32_1 = 5, |
| | 1490 | |
| | 1491 | /// The 32-bit address relative to byte distance 2 from the relocation. |
| | 1492 | rel32_2 = 6, |
| | 1493 | |
| | 1494 | /// The 32-bit address relative to byte distance 3 from the relocation. |
| | 1495 | rel32_3 = 7, |
| | 1496 | |
| | 1497 | /// The 32-bit address relative to byte distance 4 from the relocation. |
| | 1498 | rel32_4 = 8, |
| | 1499 | |
| | 1500 | /// The 32-bit address relative to byte distance 5 from the relocation. |
| | 1501 | rel32_5 = 9, |
| | 1502 | |
| | 1503 | /// The 16-bit section index of the section that contains the target. |
| | 1504 | /// This is used to support debugging information. |
| | 1505 | section = 10, |
| | 1506 | |
| | 1507 | /// The 32-bit offset of the target from the beginning of its section. |
| | 1508 | /// This is used to support debugging information and static thread local storage. |
| | 1509 | secrel = 11, |
| | 1510 | |
| | 1511 | /// A 7-bit unsigned offset from the base of the section that contains the target. |
| | 1512 | secrel7 = 12, |
| | 1513 | |
| | 1514 | /// CLR tokens. |
| | 1515 | token = 13, |
| | 1516 | |
| | 1517 | /// A 32-bit signed span-dependent value emitted into the object. |
| | 1518 | srel32 = 14, |
| | 1519 | |
| | 1520 | /// A pair that must immediately follow every span-dependent value. |
| | 1521 | pair = 15, |
| | 1522 | |
| | 1523 | /// A 32-bit signed span-dependent value that is applied at link time. |
| | 1524 | sspan32 = 16, |
| | 1525 | |
| | 1526 | _, |
| | 1527 | }; |
| | 1528 | |
| | 1529 | pub const ImageRelArm64 = enum(u16) { |
| | 1530 | /// The relocation is ignored. |
| | 1531 | absolute = 0, |
| | 1532 | |
| | 1533 | /// The 32-bit VA of the target. |
| | 1534 | addr32 = 1, |
| | 1535 | |
| | 1536 | /// The 32-bit RVA of the target. |
| | 1537 | addr32nb = 2, |
| | 1538 | |
| | 1539 | /// The 26-bit relative displacement to the target, for B and BL instructions. |
| | 1540 | branch26 = 3, |
| | 1541 | |
| | 1542 | /// The page base of the target, for ADRP instruction. |
| | 1543 | pagebase_rel21 = 4, |
| | 1544 | |
| | 1545 | /// The 21-bit relative displacement to the target, for instruction ADR. |
| | 1546 | rel21 = 5, |
| | 1547 | |
| | 1548 | /// The 12-bit page offset of the target, for instructions ADD/ADDS (immediate) with zero shift. |
| | 1549 | pageoffset_12a = 6, |
| | 1550 | |
| | 1551 | /// The 12-bit page offset of the target, for instruction LDR (indexed, unsigned immediate). |
| | 1552 | pageoffset_12l = 7, |
| | 1553 | |
| | 1554 | /// The 32-bit offset of the target from the beginning of its section. |
| | 1555 | /// This is used to support debugging information and static thread local storage. |
| | 1556 | secrel = 8, |
| | 1557 | |
| | 1558 | /// Bit 0:11 of section offset of the target for instructions ADD/ADDS (immediate) with zero shift. |
| | 1559 | low12a = 9, |
| | 1560 | |
| | 1561 | /// Bit 12:23 of section offset of the target, for instructions ADD/ADDS (immediate) with zero shift. |
| | 1562 | high12a = 10, |
| | 1563 | |
| | 1564 | /// Bit 0:11 of section offset of the target, for instruction LDR (indexed, unsigned immediate). |
| | 1565 | low12l = 11, |
| | 1566 | |
| | 1567 | /// CLR token. |
| | 1568 | token = 12, |
| | 1569 | |
| | 1570 | /// The 16-bit section index of the section that contains the target. |
| | 1571 | /// This is used to support debugging information. |
| | 1572 | section = 13, |
| | 1573 | |
| | 1574 | /// The 64-bit VA of the relocation target. |
| | 1575 | addr64 = 14, |
| | 1576 | |
| | 1577 | /// The 19-bit offset to the relocation target, for conditional B instruction. |
| | 1578 | branch19 = 15, |
| | 1579 | |
| | 1580 | /// The 14-bit offset to the relocation target, for instructions TBZ and TBNZ. |
| | 1581 | branch14 = 16, |
| | 1582 | |
| | 1583 | /// The 32-bit relative address from the byte following the relocation. |
| | 1584 | rel32 = 17, |
| | 1585 | |
| | 1586 | _, |
| | 1587 | }; |