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.
This commit is contained in:
Alan Modra 2012-07-03 05:47:35 +00:00
parent 3da732519b
commit 3146fac428
2 changed files with 19 additions and 10 deletions

View File

@ -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

View File

@ -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
{