From a3bcfe01e11cc828186521c6342963108fc0a20d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 19 May 2025 13:13:44 -0700 Subject: [PATCH] fix signedness issue --- src/coff/coff.c | 8 ++++---- src/coff/coff.h | 2 +- src/linker/lnk.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/coff/coff.c b/src/coff/coff.c index a8a1fb57..9291a4b0 100644 --- a/src/coff/coff.c +++ b/src/coff/coff.c @@ -178,7 +178,7 @@ coff_pick_reloc_value_x64(COFF_Reloc_X64 type, U64 reloc_virtual_offset, U32 symbol_section_number, U32 symbol_section_offset, - U32 symbol_virtual_offset) + S64 symbol_virtual_offset) { U64 reloc_value_size = 0; S64 reloc_value = 0; @@ -187,15 +187,15 @@ coff_pick_reloc_value_x64(COFF_Reloc_X64 type, case COFF_Reloc_X64_Abs: {} break; case COFF_Reloc_X64_Addr64: { reloc_value_size = 8; - reloc_value = symbol_virtual_offset + image_base; + reloc_value = symbol_virtual_offset + (S64)image_base; } break; case COFF_Reloc_X64_Addr32: { reloc_value_size = 4; - reloc_value = symbol_virtual_offset + image_base; + reloc_value = safe_cast_s32(symbol_virtual_offset + (S64)image_base); } break; case COFF_Reloc_X64_Addr32Nb: { reloc_value_size = 4; - reloc_value = safe_cast_u32(symbol_virtual_offset); + reloc_value = symbol_virtual_offset; } break; case COFF_Reloc_X64_Rel32: { reloc_value_size = 4; diff --git a/src/coff/coff.h b/src/coff/coff.h index 5cf6abc6..32f8bc7b 100644 --- a/src/coff/coff.h +++ b/src/coff/coff.h @@ -601,7 +601,7 @@ 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_x86(COFF_Reloc_X86 x); -internal COFF_RelocValue coff_pick_reloc_value_x64(COFF_Reloc_X64 type, U64 image_base, U64 reloc_virtual_offset, U32 symbol_section_number, U32 symbol_section_offset, U32 symbol_virtual_offset); +internal COFF_RelocValue coff_pick_reloc_value_x64(COFF_Reloc_X64 type, U64 image_base, U64 reloc_virtual_offset, U32 symbol_section_number, U32 symbol_section_offset, S64 symbol_virtual_offset); //////////////////////////////// // Import diff --git a/src/linker/lnk.c b/src/linker/lnk.c index b4623c28..ea7505c2 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1117,7 +1117,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) // compute symbol location values U32 symbol_secnum = 0; U32 symbol_secoff = 0; - U32 symbol_voff = 0; + S64 symbol_voff = 0; { COFF_ParsedSymbol symbol; if (obj_header.is_big_obj) { @@ -1149,7 +1149,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) if (str8_match(symbol.name, str8_lit("__ImageBase"), 0)) { symbol_voff = 0; } else { - symbol_voff = symbol.value - task->image_base; + symbol_voff = (S64)symbol.value - (S64)task->image_base; } } else if (interp == COFF_SymbolValueInterp_Weak) { // unresolved weak