diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 47264f38..b4623c28 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1140,9 +1140,17 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) } else if (obj->header.machine != COFF_MachineType_Unknown) { NotImplemented; } + symbol_secnum = 0; symbol_secoff = 0; - symbol_voff = safe_cast_u32(symbol.value); + // There aren't enough bits in COFF symbol to store full image base address, + // so we special case __ImageBase. A better solution would be to add + // a 64-bit symbol format to COFF. + if (str8_match(symbol.name, str8_lit("__ImageBase"), 0)) { + symbol_voff = 0; + } else { + symbol_voff = symbol.value - task->image_base; + } } else if (interp == COFF_SymbolValueInterp_Weak) { // unresolved weak } else if (interp == COFF_SymbolValueInterp_Undefined) {