simplify COFF reloc apply helper

This commit is contained in:
Nikita Smith
2025-06-25 10:53:22 -07:00
committed by Ryan Fleury
parent a5b3df7d1b
commit 63a374cf54
2 changed files with 21 additions and 20 deletions
+13 -20
View File
@@ -179,18 +179,17 @@ coff_apply_size_from_reloc(COFF_MachineType machine, COFF_RelocType x)
return 0; return 0;
} }
internal void internal COFF_RelocValue
coff_apply_reloc_x64(String8 data, coff_pick_reloc_value_x64(COFF_Reloc_X64 type,
COFF_Reloc_X64 type, U64 reloc_virtual_offset,
U64 apply_off, U32 symbol_section_number,
U64 reloc_virtual_offset, U32 symbol_section_offset,
U32 symbol_section_number, U32 symbol_virtual_offset,
U32 symbol_section_offset, U64 symbol_address)
U32 symbol_virtual_offset,
U64 symbol_address)
{ {
U64 reloc_value_size = 0; U64 reloc_value_size = 0;
S64 reloc_value = 0; S64 reloc_value = 0;
switch (type) { switch (type) {
case COFF_Reloc_X64_Abs: {} break; case COFF_Reloc_X64_Abs: {} break;
case COFF_Reloc_X64_Addr64: { case COFF_Reloc_X64_Addr64: {
@@ -199,7 +198,7 @@ coff_apply_reloc_x64(String8 data,
} break; } break;
case COFF_Reloc_X64_Addr32: { case COFF_Reloc_X64_Addr32: {
reloc_value_size = 4; reloc_value_size = 4;
reloc_value = safe_cast_u32(symbol_address); reloc_value = symbol_address;
} break; } break;
case COFF_Reloc_X64_Addr32Nb: { case COFF_Reloc_X64_Addr32Nb: {
reloc_value_size = 4; reloc_value_size = 4;
@@ -254,17 +253,11 @@ coff_apply_reloc_x64(String8 data,
} break; } break;
} }
// read addend COFF_RelocValue result = {0};
Assert(apply_off + reloc_value_size <= data.size); result.size = reloc_value_size;
U64 raw_addend = 0; result.value = reloc_value;
str8_deserial_read(data, apply_off, &raw_addend, reloc_value_size, reloc_value_size);
// compute new reloc value return result;
S64 addend = extend_sign64(raw_addend, reloc_value_size);
U64 reloc_result = reloc_value + addend;
// commit new reloc value
MemoryCopy(data.str + apply_off, &reloc_result, reloc_value_size);
} }
internal String8 internal String8
+8
View File
@@ -576,6 +576,12 @@ typedef struct COFF_ImportHeader
#pragma pack(pop) #pragma pack(pop)
typedef struct COFF_RelocValue
{
U64 size;
S64 value;
} COFF_RelocValue;
//////////////////////////////// ////////////////////////////////
// Section // Section
@@ -596,6 +602,8 @@ internal String8 coff_read_symbol_name(String8 string_table, COFF_SymbolName *na
internal U64 coff_apply_size_from_reloc_x64(COFF_Reloc_X64 x); internal U64 coff_apply_size_from_reloc_x64(COFF_Reloc_X64 x);
internal U64 coff_apply_size_from_reloc_x86(COFF_Reloc_X86 x); internal U64 coff_apply_size_from_reloc_x86(COFF_Reloc_X86 x);
internal COFF_RelocValue coff_pick_reloc_valuex64(COFF_Reloc_X64 type, U64 reloc_virtual_offset, U32 symbol_section_number, U32 symbol_section_offset, U32 symbol_virtual_offset, U64 symbol_address);
//////////////////////////////// ////////////////////////////////
// Import // Import