mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 22:08:41 +00:00
simplify COFF reloc apply helper
This commit is contained in:
committed by
Ryan Fleury
parent
a5b3df7d1b
commit
63a374cf54
+13
-20
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user