[GOLD] PowerPC linkage table error

This fixes a segfault when attempring to output a "linkage table
error".  "object" is only non-NULL in the local symbol case.

	* powerpc.cc (Stub_table::plt_error): New function.
	(Stub_table::do_write): Use it.
	(Output_data_glink::do_write): Don't segfault emitting linkage
	table error.
This commit is contained in:
Alan Modra 2019-06-28 10:17:45 +09:30
parent c432bbbaaa
commit f073a3e8c6
2 changed files with 25 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2019-06-28 Alan Modra <amodra@gmail.com>
* powerpc.cc (Stub_table::plt_error): New function.
(Stub_table::do_write): Use it.
(Output_data_glink::do_write): Don't segfault emitting linkage
table error.
2019-06-28 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Scan::get_reference_flags): Handle

View File

@ -4733,6 +4733,9 @@ class Stub_table : public Output_relaxed_input_section
return bytes;
}
void
plt_error(const Plt_stub_key& p);
// Write out stubs.
void
do_write(Output_file*);
@ -5384,6 +5387,19 @@ Stub_table<size, big_endian>::define_stub_syms(Symbol_table* symtab)
}
}
template<int size, bool big_endian>
void
Stub_table<size, big_endian>::plt_error(const Plt_stub_key& p)
{
if (p.sym_)
gold_error(_("linkage table error against `%s'"),
p.sym_->demangled_name().c_str());
else
gold_error(_("linkage table error against `%s:[local %u]'"),
p.object_->name().c_str(),
p.locsym_);
}
// Write out plt and long branch stub code.
template<int size, bool big_endian>
@ -5424,9 +5440,7 @@ Stub_table<size, big_endian>::do_write(Output_file* of)
Address off = plt_addr - got_addr;
if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
gold_error(_("%s: linkage table error against `%s'"),
cs->first.object_->name().c_str(),
cs->first.sym_->demangled_name().c_str());
this->plt_error(cs->first);
bool plt_load_toc = this->targ_->abiversion() < 2;
bool static_chain
@ -5871,8 +5885,7 @@ Output_data_glink<size, big_endian>::do_write(Output_file* of)
Address off = plt_addr - my_addr;
if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
gold_error(_("%s: linkage table error against `%s'"),
ge->first->object()->name().c_str(),
gold_error(_("linkage table error against `%s'"),
ge->first->demangled_name().c_str());
write_insn<big_endian>(p, addis_12_12 + ha(off)), p += 4;