From ff3d54d26f2f9adc17f7d18ecb5ac5ba11fa32ec Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 13 Nov 2023 19:58:35 +0900 Subject: [PATCH] Fix a crash bug in --defsym Fixes https://github.com/rui314/mold/issues/1108 --- elf/passes.cc | 43 ++++++++++++++----------------- test/elf/defsym-missing-symbol.sh | 9 +++++++ 2 files changed, 28 insertions(+), 24 deletions(-) create mode 100755 test/elf/defsym-missing-symbol.sh diff --git a/elf/passes.cc b/elf/passes.cc index ad02c14474..20f1a40693 100644 --- a/elf/passes.cc +++ b/elf/passes.cc @@ -817,26 +817,27 @@ void add_synthetic_symbols(Context &ctx) { // Handle --defsym symbols. for (i64 i = 0; i < ctx.arg.defsyms.size(); i++) { - Symbol *sym = ctx.arg.defsyms[i].first; + Symbol *sym1 = ctx.arg.defsyms[i].first; std::variant *, u64> val = ctx.arg.defsyms[i].second; - Symbol *target = nullptr; - if (Symbol **ref = std::get_if *>(&val)) - target = *ref; + if (Symbol **ref = std::get_if *>(&val)) { + Symbol *sym2 = *ref; + if (!sym2->file) { + Error(ctx) << "--defsym: undefined symbol: " << *sym2; + continue; + } - // If the alias refers another symobl, copy ELF symbol attributes. - if (target) { ElfSym &esym = obj.elf_syms[i + 1]; - esym.st_type = target->esym().st_type; + esym.st_type = sym2->esym().st_type; if constexpr (is_ppc64v2) - esym.ppc_local_entry = target->esym().ppc_local_entry; - } + esym.ppc_local_entry = sym2->esym().ppc_local_entry; - // Make the target absolute if necessary. - if (!target || target->is_absolute()) - sym->origin = 0; + if (sym2->is_absolute()) + sym1->origin = 0; + } else { + sym1->origin = 0; + } } - } template @@ -2715,18 +2716,12 @@ void fix_synthetic_symbols(Context &ctx) { if (u64 *addr = std::get_if(&val)) { sym->origin = 0; sym->value = *addr; - continue; - } - - Symbol *sym2 = std::get *>(val); - if (!sym2->file) { - Error(ctx) << "--defsym: undefined symbol: " << *sym2; - continue; + } else { + Symbol *sym2 = std::get *>(val); + sym->value = sym2->value; + sym->origin = sym2->origin; + sym->visibility = sym2->visibility.load(); } - - sym->value = sym2->value; - sym->origin = sym2->origin; - sym->visibility = sym2->visibility.load(); } diff --git a/test/elf/defsym-missing-symbol.sh b/test/elf/defsym-missing-symbol.sh new file mode 100755 index 0000000000..a2aa54378e --- /dev/null +++ b/test/elf/defsym-missing-symbol.sh @@ -0,0 +1,9 @@ +#!/bin/bash +. $(dirname $0)/common.inc + +cat < $t/log +grep -q 'undefined symbol: bar' $t/log