section.odin 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package debug_pe
  2. Section_Header32 :: struct {
  3. name: [8]u8,
  4. virtual_size: u32le,
  5. virtual_address: u32le,
  6. size_of_raw_data: u32le,
  7. pointer_to_raw_data: u32le,
  8. pointer_to_relocations: u32le,
  9. pointer_to_line_numbers: u32le,
  10. number_of_relocations: u16le,
  11. number_of_line_numbers: u16le,
  12. characteristics: IMAGE_SCN_CHARACTERISTICS,
  13. }
  14. Reloc :: struct {
  15. virtual_address: u32le,
  16. symbol_table_index: u32le,
  17. type: IMAGE_REL,
  18. }
  19. IMAGE_SCN_CHARACTERISTICS :: enum u32le {
  20. TYPE_NO_PAD = 0x00000008, // The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files. = 0x00000010, // Reserved for future use.
  21. CNT_CODE = 0x00000020, // The section contains executable code.
  22. CNT_INITIALIZED_DATA = 0x00000040, // The section contains initialized data.
  23. CNT_UNINITIALIZED_DATA = 0x00000080, // The section contains uninitialized data.
  24. LNK_OTHER = 0x00000100, // Reserved for future use.
  25. LNK_INFO = 0x00000200, // The section contains comments or other information. The .drectve section has this type. This is valid for object files only. = 0x00000400, // Reserved for future use.
  26. LNK_REMOVE = 0x00000800, // The section will not become part of the image. This is valid only for object files.
  27. LNK_COMDAT = 0x00001000, // The section contains COMDAT data. For more information, see COMDAT Sections (Object Only). This is valid only for object files.
  28. GPREL = 0x00008000, // The section contains data referenced through the global pointer (GP).
  29. MEM_PURGEABLE = 0x00020000, // Reserved for future use.
  30. MEM_16BIT = 0x00020000, // Reserved for future use.
  31. MEM_LOCKED = 0x00040000, // Reserved for future use.
  32. MEM_PRELOAD = 0x00080000, // Reserved for future use.
  33. ALIGN_1BYTES = 0x00100000, // Align data on a 1-byte boundary. Valid only for object files.
  34. ALIGN_2BYTES = 0x00200000, // Align data on a 2-byte boundary. Valid only for object files.
  35. ALIGN_4BYTES = 0x00300000, // Align data on a 4-byte boundary. Valid only for object files.
  36. ALIGN_8BYTES = 0x00400000, // Align data on an 8-byte boundary. Valid only for object files.
  37. ALIGN_16BYTES = 0x00500000, // Align data on a 16-byte boundary. Valid only for object files.
  38. ALIGN_32BYTES = 0x00600000, // Align data on a 32-byte boundary. Valid only for object files.
  39. ALIGN_64BYTES = 0x00700000, // Align data on a 64-byte boundary. Valid only for object files.
  40. ALIGN_128BYTES = 0x00800000, // Align data on a 128-byte boundary. Valid only for object files.
  41. ALIGN_256BYTES = 0x00900000, // Align data on a 256-byte boundary. Valid only for object files.
  42. ALIGN_512BYTES = 0x00A00000, // Align data on a 512-byte boundary. Valid only for object files.
  43. ALIGN_1024BYTES = 0x00B00000, // Align data on a 1024-byte boundary. Valid only for object files.
  44. ALIGN_2048BYTES = 0x00C00000, // Align data on a 2048-byte boundary. Valid only for object files.
  45. ALIGN_4096BYTES = 0x00D00000, // Align data on a 4096-byte boundary. Valid only for object files.
  46. ALIGN_8192BYTES = 0x00E00000, // Align data on an 8192-byte boundary. Valid only for object files.
  47. LNK_NRELOC_OVFL = 0x01000000, // The section contains extended relocations.
  48. MEM_DISCARDABLE = 0x02000000, // The section can be discarded as needed.
  49. MEM_NOT_CACHED = 0x04000000, // The section cannot be cached.
  50. MEM_NOT_PAGED = 0x08000000, // The section is not pageable.
  51. MEM_SHARED = 0x10000000, // The section can be shared in memory.
  52. MEM_EXECUTE = 0x20000000, // The section can be executed as code.
  53. MEM_READ = 0x40000000, // The section can be read.
  54. MEM_WRITE = 0x80000000, // The section can be written to.
  55. }
  56. IMAGE_REL :: enum u16le {
  57. I386_ABSOLUTE = 0x0000,
  58. I386_DIR16 = 0x0001,
  59. I386_REL16 = 0x0002,
  60. I386_DIR32 = 0x0006,
  61. I386_DIR32NB = 0x0007,
  62. I386_SEG12 = 0x0009,
  63. I386_SECTION = 0x000A,
  64. I386_SECREL = 0x000B,
  65. I386_TOKEN = 0x000C,
  66. I386_SECREL7 = 0x000D,
  67. I386_REL32 = 0x0014,
  68. AMD64_ABSOLUTE = 0x0000,
  69. AMD64_ADDR64 = 0x0001,
  70. AMD64_ADDR32 = 0x0002,
  71. AMD64_ADDR32NB = 0x0003,
  72. AMD64_REL32 = 0x0004,
  73. AMD64_REL32_1 = 0x0005,
  74. AMD64_REL32_2 = 0x0006,
  75. AMD64_REL32_3 = 0x0007,
  76. AMD64_REL32_4 = 0x0008,
  77. AMD64_REL32_5 = 0x0009,
  78. AMD64_SECTION = 0x000A,
  79. AMD64_SECREL = 0x000B,
  80. AMD64_SECREL7 = 0x000C,
  81. AMD64_TOKEN = 0x000D,
  82. AMD64_SREL32 = 0x000E,
  83. AMD64_PAIR = 0x000F,
  84. AMD64_SSPAN32 = 0x0010,
  85. ARM_ABSOLUTE = 0x0000,
  86. ARM_ADDR32 = 0x0001,
  87. ARM_ADDR32NB = 0x0002,
  88. ARM_BRANCH24 = 0x0003,
  89. ARM_BRANCH11 = 0x0004,
  90. ARM_SECTION = 0x000E,
  91. ARM_SECREL = 0x000F,
  92. ARM_MOV32 = 0x0010,
  93. THUMB_MOV32 = 0x0011,
  94. THUMB_BRANCH20 = 0x0012,
  95. THUMB_BRANCH24 = 0x0014,
  96. THUMB_BLX23 = 0x0015,
  97. ARM_PAIR = 0x0016,
  98. ARM64_ABSOLUTE = 0x0000,
  99. ARM64_ADDR32 = 0x0001,
  100. ARM64_ADDR32NB = 0x0002,
  101. ARM64_BRANCH26 = 0x0003,
  102. ARM64_PAGEBASE_REL21 = 0x0004,
  103. ARM64_REL21 = 0x0005,
  104. ARM64_PAGEOFFSET_12A = 0x0006,
  105. ARM64_PAGEOFFSET_12L = 0x0007,
  106. ARM64_SECREL = 0x0008,
  107. ARM64_SECREL_LOW12A = 0x0009,
  108. ARM64_SECREL_HIGH12A = 0x000A,
  109. ARM64_SECREL_LOW12L = 0x000B,
  110. ARM64_TOKEN = 0x000C,
  111. ARM64_SECTION = 0x000D,
  112. ARM64_ADDR64 = 0x000E,
  113. ARM64_BRANCH19 = 0x000F,
  114. ARM64_BRANCH14 = 0x0010,
  115. ARM64_REL32 = 0x0011,
  116. }
  117. PE_CODE_VIEW_SIGNATURE_RSDS :: u32le(0x5344_5352)