diff options
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/elf.c | 18 |
2 files changed, 19 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b594c66c0a..fc9c38632c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2012-07-03 Alan Modra <amodra@gmail.com> + + PR ld/14207 + * elf.c (assign_file_positions_for_load_sections): Remove assertions + that only PT_LOAD headers include file header and section headers. + (assign_file_positions_for_non_load_sections): Similarly don't + assert PT_GNU_RELRO header does not include file and section headers. + Compare first section vma rather than PT_LOAD p_vaddr against + relro_start when looking for PT_LOAD covering PT_GNU_RELRO. Replace + abort with assertion. + 2012-07-02 Alan Modra <amodra@gmail.com> * elf32-m32c.c (m32c_elf_check_relocs): Use bfd_make_section @@ -4575,8 +4575,6 @@ assign_file_positions_for_load_sections (bfd *abfd, p->p_memsz = bed->s->sizeof_ehdr; if (m->count > 0) { - BFD_ASSERT (p->p_type == PT_LOAD); - if (p->p_vaddr < (bfd_vma) off) { (*_bfd_error_handler) @@ -4603,7 +4601,6 @@ assign_file_positions_for_load_sections (bfd *abfd, if (m->count > 0) { - BFD_ASSERT (p->p_type == PT_LOAD); p->p_vaddr -= off - p->p_offset; if (!m->p_paddr_valid) p->p_paddr -= off - p->p_offset; @@ -4965,26 +4962,27 @@ assign_file_positions_for_non_load_sections (bfd *abfd, if (p->p_type == PT_GNU_RELRO) { const Elf_Internal_Phdr *lp; - - BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs); + struct elf_segment_map *lm; if (link_info != NULL) { /* During linking the range of the RELRO segment is passed in link_info. */ - for (lp = phdrs; lp < phdrs + count; ++lp) + for (lm = elf_tdata (abfd)->segment_map, lp = phdrs; + lm != NULL; + lm = lm->next, lp++) { if (lp->p_type == PT_LOAD - && lp->p_vaddr >= link_info->relro_start && lp->p_vaddr < link_info->relro_end - && lp->p_vaddr + lp->p_filesz >= link_info->relro_end) + && lp->p_vaddr + lp->p_filesz >= link_info->relro_end + && lm->count != 0 + && lm->sections[0]->vma >= link_info->relro_start) break; } /* PR ld/14207. If the RELRO segment doesn't fit in the LOAD segment, it should be removed. */ - if (lp == (phdrs + count)) - abort (); + BFD_ASSERT (lm != NULL); } else { |