mirror of
https://github.com/rui314/mold.git
synced 2024-09-19 08:57:39 +03:00
Do not crash if defsym'ed symbol didn't exist
Fixes https://github.com/rui314/mold/issues/1108
This commit is contained in:
parent
0804fbd095
commit
5c7a75b3e4
@ -645,6 +645,7 @@ void create_internal_file(Context<E> &ctx) {
|
||||
|
||||
auto add = [&](Symbol<E> *sym, bool is_undef) {
|
||||
obj->symbols.push_back(sym);
|
||||
sym->sym_idx = ctx.internal_esyms.size();
|
||||
|
||||
// An actual value will be set to a linker-synthesized symbol by
|
||||
// fix_synthetic_symbols(). Until then, `value` doesn't have a valid
|
||||
@ -812,20 +813,20 @@ void add_synthetic_symbols(Context<E> &ctx) {
|
||||
Symbol<E> *sym = ctx.arg.defsyms[i].first;
|
||||
std::variant<Symbol<E> *, u64> val = ctx.arg.defsyms[i].second;
|
||||
|
||||
Symbol<E> *target = nullptr;
|
||||
Symbol<E> *sym2 = nullptr;
|
||||
if (Symbol<E> **ref = std::get_if<Symbol<E> *>(&val))
|
||||
target = *ref;
|
||||
sym2 = *ref;
|
||||
|
||||
// If the alias refers another symobl, copy ELF symbol attributes.
|
||||
if (target) {
|
||||
ElfSym<E> &esym = obj.elf_syms[i + 1];
|
||||
esym.st_type = target->esym().st_type;
|
||||
if (sym2 && sym2->file) {
|
||||
ElfSym<E> &esym = (ElfSym<E> &)sym->esym();
|
||||
esym.st_type = sym2->esym().st_type;
|
||||
if constexpr (is_ppc64v2<E>)
|
||||
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())
|
||||
// Make the defsym'ed symbol absolute if necessary.
|
||||
if (!sym2 || sym2->is_absolute())
|
||||
sym->origin = 0;
|
||||
}
|
||||
|
||||
@ -2584,7 +2585,7 @@ void fix_synthetic_symbols(Context<E> &ctx) {
|
||||
}
|
||||
|
||||
Symbol<E> *sym2 = std::get<Symbol<E> *>(val);
|
||||
if (!sym2->file) {
|
||||
if (sym2->file == ctx.internal_obj) {
|
||||
Error(ctx) << "--defsym: undefined symbol: " << *sym2;
|
||||
continue;
|
||||
}
|
||||
|
9
test/elf/defsym-missing-symbol.sh
Executable file
9
test/elf/defsym-missing-symbol.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
. $(dirname $0)/common.inc
|
||||
|
||||
cat <<EOF | $CC -o $t/a.o -c -xc -
|
||||
int main() { return 0; }
|
||||
EOF
|
||||
|
||||
! $CC -B. -o $t/exe $t/a.o -Wl,--defsym=foo=bar >& $t/log
|
||||
grep -Fq 'defsym: undefined symbol: bar' $t/log
|
Loading…
Reference in New Issue
Block a user