+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
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)
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;
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
{