diff options
author | Alan Modra <amodra@gmail.com> | 2020-09-28 09:30:19 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-09-28 09:35:20 +0930 |
commit | 12cf8b93da0ae155643d262235486fde5af72a80 (patch) | |
tree | a2de67951781427b0f1840354f858e5ce52a9e7d /bfd | |
parent | 5ecafd70201ac84228ed6a394e6fa72c0e08f62f (diff) | |
download | gdb-12cf8b93da0ae155643d262235486fde5af72a80.zip gdb-12cf8b93da0ae155643d262235486fde5af72a80.tar.gz gdb-12cf8b93da0ae155643d262235486fde5af72a80.tar.bz2 |
Re: PR26656, power10 libstdc++.so segfault in __cxxabiv1::__cxa_throw
Some missing NULL checks meant a stub for a local symbol used a stub
looking like the __tls_get_addr_opt stub.
PR 26656
* elf64-ppc.c (ppc_build_one_stub, ppc_size_one_stub): Check for
NULL stub_entry->h before calling is_tls_get_addr.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8d0e695..4222ebb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-09-28 Alan Modra <amodra@gmail.com> + + PR 26656 + * elf64-ppc.c (ppc_build_one_stub, ppc_size_one_stub): Check for + NULL stub_entry->h before calling is_tls_get_addr. + 2020-09-26 Alan Modra <amodra@gmail.com> * elf64-ppc.c (GLINK_PLTRESOLVE_SIZE): Depend on has_plt_localentry0. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 4194802..35f3cbe 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -11678,6 +11678,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) obfd = htab->params->stub_bfd; is_tga = ((stub_entry->stub_type == ppc_stub_plt_call_notoc || stub_entry->stub_type == ppc_stub_plt_call_both) + && stub_entry->h != NULL && is_tls_get_addr (&stub_entry->h->elf, htab) && htab->params->tls_get_addr_opt); if (is_tga) @@ -12188,7 +12189,8 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) case ppc_stub_plt_call_notoc: case ppc_stub_plt_call_both: lr_used = 0; - if (is_tls_get_addr (&stub_entry->h->elf, htab) + if (stub_entry->h != NULL + && is_tls_get_addr (&stub_entry->h->elf, htab) && htab->params->tls_get_addr_opt) { lr_used += 7 * 4; @@ -12258,6 +12260,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) } if ((stub_entry->stub_type == ppc_stub_plt_call_notoc || stub_entry->stub_type == ppc_stub_plt_call_both) + && stub_entry->h != NULL && is_tls_get_addr (&stub_entry->h->elf, htab) && htab->params->tls_get_addr_opt) { |