PR26656, power10 libstdc++.so segfault in __cxxabiv1::__cxa_throw
authorAlan Modra <amodra@gmail.com>
Tue, 22 Sep 2020 13:21:42 +0000 (22:51 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 23 Sep 2020 22:24:05 +0000 (07:54 +0930)
commit294338867c268b6da43327b6cbe70e746bff1a04
tree5a92aab3be8a1fcc30d2778739111b09d2146a2c
parentc94053440e29421dd8846530da73f09c9ede2e0f
PR26656, power10 libstdc++.so segfault in __cxxabiv1::__cxa_throw

This adds missing support for a power10 version of the __tls_get_addr
call stub implementing DT_PPC64_OPT PPC64_OPT_TLS.  Without this,
power10 code using __tls_get_addr fails miserably at runtime unless
the --no-tls-get-addr-optimize option is given.

PR 26656
* elf64-ppc.c (plt_stub_size): Add "odd" param.  Use it with
size_power10_offset rather than calculating from start of stub.
Add size for notoc tls_get_addr_opt stub.
(plt_stub_pad): Add "odd" param, pass to plt_stub_size.
(build_tls_get_addr_head, build_tls_get_addr_tail): New functions.
(build_tls_get_addr_stub): Delete.
(ppc_build_one_stub): Use a temp for htab->params->stub_bfd.
Emit notoc tls_get_addr_opt stub.  Move eh_frame code to
suit.  Adjust code to use bfd_tls_get_addr_head/tail in place
of build_tls_get_addr_stub.
(ppc_size_one_stub): Size notoc tls_get_addr_opt stub.
Adjust plt_stub_size and plt_stub_pad calls.  Correct "odd"
when padding stub.  Size eh_frame for notoc stub too.
Correct lr_restore value.
(ppc64_elf_relocate_section): Don't skip over first insn of
notoc tls_get_addr_opt stub.
bfd/ChangeLog
bfd/elf64-ppc.c