diff options
author | Alan Modra <amodra@gmail.com> | 2012-07-03 05:47:35 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2012-07-03 05:47:35 +0000 |
commit | 3146fac42836137f284d541266ece045d56b5895 (patch) | |
tree | 50a09c8b2f6b613afeef7cee8e49b266351c500e /bfd/elf.c | |
parent | 3da732519bf1fe8ccacbd68d2f5ebae23ad8546d (diff) | |
download | gdb-3146fac42836137f284d541266ece045d56b5895.zip gdb-3146fac42836137f284d541266ece045d56b5895.tar.gz gdb-3146fac42836137f284d541266ece045d56b5895.tar.bz2 |
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 18 |
1 files changed, 8 insertions, 10 deletions
@@ -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 { |