[GOLD] PowerPC64 __tls_get_addr_opt stub

This stub doesn't have the r2 store at the beginning.

	* powerpc.cc (Target_powerpc::Relocate::relocate): Don't skip
	first insn of __tls_get_addr_opt stub.
This commit is contained in:
Alan Modra 2020-09-23 22:54:01 +09:30
parent 294338867c
commit a993d270f8
2 changed files with 22 additions and 14 deletions

View File

@ -1,3 +1,8 @@
2020-09-24 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Relocate::relocate): Don't skip
first insn of __tls_get_addr_opt stub.
2020-08-24 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc): Add tprel_opt_ and accessors.

View File

@ -10401,21 +10401,24 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
value += ent->tocoff_;
if (size == 64
&& ent->r2save_
&& r_type == elfcpp::R_PPC64_REL24_NOTOC)
&& !(gsym != NULL
&& target->is_tls_get_addr_opt(gsym)))
{
if (!(target->power10_stubs()
&& target->power10_stubs_auto()))
value += 4;
}
else if (size == 64
&& ent->r2save_
&& relnum < reloc_count - 1)
{
Reltype next_rela(preloc + reloc_size);
if (elfcpp::elf_r_type<size>(next_rela.get_r_info())
== elfcpp::R_PPC64_TOCSAVE
&& next_rela.get_r_offset() == rela.get_r_offset() + 4)
value += 4;
if (r_type == elfcpp::R_PPC64_REL24_NOTOC)
{
if (!(target->power10_stubs()
&& target->power10_stubs_auto()))
value += 4;
}
else if (relnum < reloc_count - 1)
{
Reltype next_rela(preloc + reloc_size);
if (elfcpp::elf_r_type<size>(next_rela.get_r_info())
== elfcpp::R_PPC64_TOCSAVE
&& (next_rela.get_r_offset()
== rela.get_r_offset() + 4))
value += 4;
}
}
localentry0 = ent->localentry0_;
has_stub_value = true;