diff options
author | Alan Modra <amodra@gmail.com> | 2015-01-29 19:38:28 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-02-09 14:06:27 +1030 |
commit | 989f98793c06132bb5cdc2f7807b7eee5108342f (patch) | |
tree | 55837e1e0a367fa4492dcde295e84c9ed2465cef /bfd/elf64-ppc.c | |
parent | ca4be51cd81b0bfff2ada60c98e7c67c936045b7 (diff) | |
download | gdb-989f98793c06132bb5cdc2f7807b7eee5108342f.zip gdb-989f98793c06132bb5cdc2f7807b7eee5108342f.tar.gz gdb-989f98793c06132bb5cdc2f7807b7eee5108342f.tar.bz2 |
Don't segfault or assert on NULL tls_sec
Real code won't hit these, but it's possible to contrive a testcase..
* elf32-ppc.c (ppc_elf_relocate_section): Don't segfault on NULL
tls_sec.
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
* elflink.c (elf_link_output_extsym): Don't assert on NULL tls_sec.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index d597fec..f821231 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -14121,7 +14121,12 @@ ppc64_elf_relocate_section (bfd *output_bfd, { outrel.r_addend += relocation; if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL)) - outrel.r_addend -= htab->elf.tls_sec->vma; + { + if (htab->elf.tls_sec == NULL) + outrel.r_addend = 0; + else + outrel.r_addend -= htab->elf.tls_sec->vma; + } } loc = relgot->contents; loc += (relgot->reloc_count++ @@ -14138,9 +14143,14 @@ ppc64_elf_relocate_section (bfd *output_bfd, relocation = 1; else if (tls_type != 0) { - relocation -= htab->elf.tls_sec->vma + DTP_OFFSET; - if (tls_type == (TLS_TLS | TLS_TPREL)) - relocation += DTP_OFFSET - TP_OFFSET; + if (htab->elf.tls_sec == NULL) + relocation = 0; + else + { + relocation -= htab->elf.tls_sec->vma + DTP_OFFSET; + if (tls_type == (TLS_TLS | TLS_TPREL)) + relocation += DTP_OFFSET - TP_OFFSET; + } if (tls_type == (TLS_TLS | TLS_GD)) { @@ -14273,7 +14283,8 @@ ppc64_elf_relocate_section (bfd *output_bfd, bfd_put_32 (output_bfd, insn, p); break; } - addend -= htab->elf.tls_sec->vma + TP_OFFSET; + if (htab->elf.tls_sec != NULL) + addend -= htab->elf.tls_sec->vma + TP_OFFSET; if (info->shared) /* The TPREL16 relocs shouldn't really be used in shared libs as they will result in DT_TEXTREL being set, but @@ -14293,7 +14304,8 @@ ppc64_elf_relocate_section (bfd *output_bfd, case R_PPC64_DTPREL16_HIGHERA: case R_PPC64_DTPREL16_HIGHEST: case R_PPC64_DTPREL16_HIGHESTA: - addend -= htab->elf.tls_sec->vma + DTP_OFFSET; + if (htab->elf.tls_sec != NULL) + addend -= htab->elf.tls_sec->vma + DTP_OFFSET; break; case R_PPC64_ADDR64_LOCAL: @@ -14308,11 +14320,13 @@ ppc64_elf_relocate_section (bfd *output_bfd, goto dodyn; case R_PPC64_TPREL64: - addend -= htab->elf.tls_sec->vma + TP_OFFSET; + if (htab->elf.tls_sec != NULL) + addend -= htab->elf.tls_sec->vma + TP_OFFSET; goto dodyn; case R_PPC64_DTPREL64: - addend -= htab->elf.tls_sec->vma + DTP_OFFSET; + if (htab->elf.tls_sec != NULL) + addend -= htab->elf.tls_sec->vma + DTP_OFFSET; /* Fall thru */ /* Relocations that may need to be propagated if this is a |