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:
parent
3da732519b
commit
3146fac428
|
@ -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
|
||||
|
|
18
bfd/elf.c
18
bfd/elf.c
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue