From b84a33b5dfb6e9d5fe3d2ebae21a92f1c542c843 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 11 Nov 2008 04:26:13 +0000 Subject: [PATCH] * elf.c (assign_file_positions_for_non_load_sections): Consolidate PT_GNU_RELRO handling. --- bfd/ChangeLog | 5 +++++ bfd/elf.c | 66 +++++++++++++++++++++++------------------------------------ 2 files changed, 31 insertions(+), 40 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 86aa276..c539cf7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2008-11-11 Alan Modra + * elf.c (assign_file_positions_for_non_load_sections): Consolidate + PT_GNU_RELRO handling. + +2008-11-11 Alan Modra + PR 7012 * dwarf2.c (find_line): Don't keep stale pointers into realloc'd memory. Return on errors. Fix memory leak. diff --git a/bfd/elf.c b/bfd/elf.c index 2f591f5..054fd2a 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -4633,71 +4633,57 @@ 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); if (link_info != NULL) { /* During linking the range of the RELRO segment is passed in link_info. */ - Elf_Internal_Phdr *lp; - for (lp = phdrs; lp < phdrs + count; ++lp) { if (lp->p_type == PT_LOAD - && lp->p_vaddr <= link_info->relro_end && lp->p_vaddr >= link_info->relro_start - && (lp->p_vaddr + lp->p_filesz - >= link_info->relro_end)) + && lp->p_vaddr < link_info->relro_end + && lp->p_vaddr + lp->p_filesz >= link_info->relro_end) break; } - - if (lp < phdrs + count - && link_info->relro_end > lp->p_vaddr) - { - p->p_vaddr = lp->p_vaddr; - p->p_paddr = lp->p_paddr; - p->p_offset = lp->p_offset; - p->p_filesz = link_info->relro_end - lp->p_vaddr; - p->p_memsz = p->p_filesz; - p->p_align = 1; - p->p_flags = (lp->p_flags & ~PF_W); - } - else - { - memset (p, 0, sizeof *p); - p->p_type = PT_NULL; - } } else { /* Otherwise we are copying an executable or shared - library. But we need to use the same linker logic. */ - Elf_Internal_Phdr *lp; - + library, but we need to use the same linker logic. */ for (lp = phdrs; lp < phdrs + count; ++lp) { if (lp->p_type == PT_LOAD && lp->p_paddr == p->p_paddr) break; } - - if (lp < phdrs + count) - { - /* We should use p_size if it is valid since it - may contain the first few bytes of the next - SEC_ALLOC section. */ - if (m->p_size_valid) - p->p_filesz = m->p_size; - else - abort (); - p->p_vaddr = lp->p_vaddr; - p->p_offset = lp->p_offset; - p->p_memsz = p->p_filesz; - p->p_align = 1; - } + } + + if (lp < phdrs + count) + { + p->p_vaddr = lp->p_vaddr; + p->p_paddr = lp->p_paddr; + p->p_offset = lp->p_offset; + if (link_info != NULL) + p->p_filesz = link_info->relro_end - lp->p_vaddr; + else if (m->p_size_valid) + p->p_filesz = m->p_size; else abort (); + p->p_memsz = p->p_filesz; + p->p_align = 1; + p->p_flags = (lp->p_flags & ~PF_W); } + else if (link_info != NULL) + { + memset (p, 0, sizeof *p); + p->p_type = PT_NULL; + } + else + abort (); } else if (m->count != 0) { -- 2.7.4