diff options
author | Alan Modra <amodra@gmail.com> | 2018-05-21 21:29:25 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-05-22 14:45:15 +0930 |
commit | 7455c018e45766ab7193cbd45f98f781e0dc7d84 (patch) | |
tree | 2a7e93798a208be31ca6c0538389f49fad94798d /bfd | |
parent | 29e11a0437ec618a8799dd152ee8a7b9bb9c172b (diff) | |
download | gdb-7455c018e45766ab7193cbd45f98f781e0dc7d84.zip gdb-7455c018e45766ab7193cbd45f98f781e0dc7d84.tar.gz gdb-7455c018e45766ab7193cbd45f98f781e0dc7d84.tar.bz2 |
PR23207, hppa ld SIGSEGVs on invalid object files
We don't create PLT call stubs for anything in non-alloc sections,
so it doesn't pay to go looking for them. The problem is that
non-alloc sections aren't processed by group_sections and thus don't
get a link_sec set up for them.
PR 23207
* elf32-hppa.c (final_link_relocate): Don't look for plt call
stubs in non-alloc sections.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 23 |
2 files changed, 18 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0af7a24..b4caff9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-05-22 Alan Modra <amodra@gmail.com> + + PR 23207 + * elf32-hppa.c (final_link_relocate): Don't look for plt call + stubs in non-alloc sections. + 2018-05-21 H.J. Lu <hongjiu.lu@intel.com> PR ld/23201 diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 722452b..5ad49ab 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -3267,18 +3267,19 @@ final_link_relocate (asection *input_section, case R_PARISC_PCREL22F: /* If this call should go via the plt, find the import stub in the stub hash. */ - if (sym_sec == NULL - || sym_sec->output_section == NULL - || (hh != NULL - && hh->eh.plt.offset != (bfd_vma) -1 - && hh->eh.dynindx != -1 - && !hh->plabel - && (bfd_link_pic (info) - || !hh->eh.def_regular - || hh->eh.root.type == bfd_link_hash_defweak))) + if ((input_section->flags & SEC_ALLOC) != 0 + && (sym_sec == NULL + || sym_sec->output_section == NULL + || (hh != NULL + && hh->eh.plt.offset != (bfd_vma) -1 + && hh->eh.dynindx != -1 + && !hh->plabel + && (bfd_link_pic (info) + || !hh->eh.def_regular + || hh->eh.root.type == bfd_link_hash_defweak)))) { hsh = hppa_get_stub_entry (input_section, sym_sec, - hh, rela, htab); + hh, rela, htab); if (hsh != NULL) { value = (hsh->stub_offset @@ -3478,7 +3479,7 @@ final_link_relocate (asection *input_section, if (value + addend + max_branch_offset >= 2*max_branch_offset) { hsh = hppa_get_stub_entry (input_section, sym_sec, - hh, rela, htab); + hh, rela, htab); if (hsh == NULL) return bfd_reloc_undefined; |