authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-08-30 23:07:28+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-08-30 23:07:28+02:00
logd3eaabd2855f21d0c7cf4a4e1fe52dfc50a2b07f
tree5a98d161ad4ff1f00c9302514d773576185156b7
parentf559ea95b1c37fd6ede8fff6ffb2d74d5c2abc4e

coff: add base relocation related types


1 files changed, 78 insertions(+), 0 deletions(-)

lib/std/coff.zig+78
...@@ -310,6 +310,84 @@ pub const ImageDataDirectory = extern struct {...@@ -310,6 +310,84 @@ pub const ImageDataDirectory = extern struct {
310 size: u32,310 size: u32,
311};311};
312312
313pub const BaseRelocationDirectoryEntry = extern struct {
314 /// The image base plus the page RVA is added to each offset to create the VA where the base relocation must be applied.
315 page_rva: u32,
316
317 /// The total number of bytes in the base relocation block, including the Page RVA and Block Size fields and the Type/Offset fields that follow.
318 block_size: u32,
319};
320
321pub const BaseRelocation = packed struct {
322 /// Stored in the remaining 12 bits of the WORD, an offset from the starting address that was specified in the Page RVA field for the block.
323 /// This offset specifies where the base relocation is to be applied.
324 offset: u12,
325
326 /// Stored in the high 4 bits of the WORD, a value that indicates the type of base relocation to be applied.
327 @"type": BaseRelocationType,
328};
329
330pub const BaseRelocationType = enum(u4) {
331 /// The base relocation is skipped. This type can be used to pad a block.
332 ABSOLUTE = 0,
333
334 /// The base relocation adds the high 16 bits of the difference to the 16-bit field at offset. The 16-bit field represents the high value of a 32-bit word.
335 HIGH = 1,
336
337 /// The base relocation adds the low 16 bits of the difference to the 16-bit field at offset. The 16-bit field represents the low half of a 32-bit word.
338 LOW = 2,
339
340 /// The base relocation applies all 32 bits of the difference to the 32-bit field at offset.
341 HIGHLOW = 3,
342
343 /// The base relocation adds the high 16 bits of the difference to the 16-bit field at offset.
344 /// The 16-bit field represents the high value of a 32-bit word.
345 /// The low 16 bits of the 32-bit value are stored in the 16-bit word that follows this base relocation.
346 /// This means that this base relocation occupies two slots.
347 HIGHADJ = 4,
348
349 /// When the machine type is MIPS, the base relocation applies to a MIPS jump instruction.
350 MIPS_JMPADDR = 5,
351
352 /// This relocation is meaningful only when the machine type is ARM or Thumb.
353 /// The base relocation applies the 32-bit address of a symbol across a consecutive MOVW/MOVT instruction pair.
354 // ARM_MOV32 = 5,
355
356 /// This relocation is only meaningful when the machine type is RISC-V.
357 /// The base relocation applies to the high 20 bits of a 32-bit absolute address.
358 // RISCV_HIGH20 = 5,
359
360 /// Reserved, must be zero.
361 RESERVED = 6,
362
363 /// This relocation is meaningful only when the machine type is Thumb.
364 /// The base relocation applies the 32-bit address of a symbol to a consecutive MOVW/MOVT instruction pair.
365 THUMB_MOV32 = 7,
366
367 /// This relocation is only meaningful when the machine type is RISC-V.
368 /// The base relocation applies to the low 12 bits of a 32-bit absolute address formed in RISC-V I-type instruction format.
369 // RISCV_LOW12I = 7,
370
371 /// This relocation is only meaningful when the machine type is RISC-V.
372 /// The base relocation applies to the low 12 bits of a 32-bit absolute address formed in RISC-V S-type instruction format.
373 RISCV_LOW12S = 8,
374
375 /// This relocation is only meaningful when the machine type is LoongArch 32-bit.
376 /// The base relocation applies to a 32-bit absolute address formed in two consecutive instructions.
377 // LOONGARCH32_MARK_LA = 8,
378
379 /// This relocation is only meaningful when the machine type is LoongArch 64-bit.
380 /// The base relocation applies to a 64-bit absolute address formed in four consecutive instructions.
381 // LOONGARCH64_MARK_LA = 8,
382
383 /// The relocation is only meaningful when the machine type is MIPS.
384 /// The base relocation applies to a MIPS16 jump instruction.
385 MIPS_JMPADDR16 = 9,
386
387 /// The base relocation applies the difference to the 64-bit field at offset.
388 DIR64 = 10,
389};
390
313pub const DebugDirectoryEntry = extern struct {391pub const DebugDirectoryEntry = extern struct {
314 characteristics: u32,392 characteristics: u32,
315 time_date_stamp: u32,393 time_date_stamp: u32,