diff options
author | Nick Clifton <nickc@redhat.com> | 2011-06-10 14:04:23 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2011-06-10 14:04:23 +0000 |
commit | 1f1f769d367925f35765c3b683caff6e592372f3 (patch) | |
tree | 508934f3fea0090bdc2d6cbc68781bc9e92a270b /bfd/elf32-hppa.c | |
parent | 4725c921b7bee688081b6d63c3c96a6c1c6037d1 (diff) | |
download | binutils-redhat-1f1f769d367925f35765c3b683caff6e592372f3.tar.gz |
* elflink.c (_bfd_elf_link_create_dynamic_sections): If the
backend does not provide a function for creating dynamic sections
then fail.
(bfd_elf_final_link): Issue a warning message if a dynamic section
has the SHT_NOTE type.
(bfd_elf_final_link): Do not look for dynamic strings in a section
that does not have the SHT_STRTAB type or the name .dynstr.
* elf32-arm.c (elf32_arm_finish_dynamic_sections): Fail if the got
section is not in the output binary.
* elf32-hppa.c (elf32_hppa_finish_dynamic_sections): Likewise.
* ld-elf/elf.exp: Add test for linking a shared library with a
broken linker script that marks dynamic sections as being notes.
* ld-elf/note-3.s: New test source file.
* ld-elf/note-3.t: New test linker script.
* ld-elf/note-3.l: Expected output from the linker.
* lib/ld-lib.exp (run_ld_link_tests): Improve description.
Diffstat (limited to 'bfd/elf32-hppa.c')
-rw-r--r-- | bfd/elf32-hppa.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 81bc042a61..e70d7e52f3 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -4498,6 +4498,7 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, bfd *dynobj; struct elf32_hppa_link_hash_table *htab; asection *sdyn; + asection * sgot; htab = hppa_link_hash_table (info); if (htab == NULL) @@ -4505,6 +4506,12 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, dynobj = htab->etab.dynobj; + sgot = htab->sgot; + /* A broken linker script might have discarded the dynamic sections. + Catch this here so that we do not seg-fault later on. */ + if (sgot != NULL && bfd_is_abs_section (sgot->output_section)) + return FALSE; + sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); if (htab->etab.dynamic_sections_created) @@ -4569,19 +4576,19 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, } } - if (htab->sgot != NULL && htab->sgot->size != 0) + if (sgot != NULL && sgot->size != 0) { /* Fill in the first entry in the global offset table. We use it to point to our dynamic section, if we have one. */ bfd_put_32 (output_bfd, sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0, - htab->sgot->contents); + sgot->contents); /* The second entry is reserved for use by the dynamic linker. */ - memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE); + memset (sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE); /* Set .got entry size. */ - elf_section_data (htab->sgot->output_section) + elf_section_data (sgot->output_section) ->this_hdr.sh_entsize = GOT_ENTRY_SIZE; } @@ -4601,8 +4608,8 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, if ((htab->splt->output_offset + htab->splt->output_section->vma + htab->splt->size) - != (htab->sgot->output_offset - + htab->sgot->output_section->vma)) + != (sgot->output_offset + + sgot->output_section->vma)) { (*_bfd_error_handler) (_(".got section not immediately after .plt section")); |