diff options
author | Alan Modra <amodra@bigpond.net.au> | 2008-11-11 04:26:13 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2008-11-11 04:26:13 +0000 |
commit | 470a797af9ea10307ee82dcc17fe9e15bef92fa6 (patch) | |
tree | 099f8c8ec6412562ea63bfc22eb9f742bcb5a2df | |
parent | bd7b05d7c05dc9ad6063f1113b84a8a22189f468 (diff) | |
download | gdb-470a797af9ea10307ee82dcc17fe9e15bef92fa6.tar.gz |
* elf.c (assign_file_positions_for_non_load_sections): Consolidate
PT_GNU_RELRO handling.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf.c | 66 |
2 files changed, 31 insertions, 40 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 86aa2765530..c539cf7f5ee 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2008-11-11 Alan Modra <amodra@bigpond.net.au> + * elf.c (assign_file_positions_for_non_load_sections): Consolidate + PT_GNU_RELRO handling. + +2008-11-11 Alan Modra <amodra@bigpond.net.au> + 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 2f591f52d5e..054fd2a4105 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) { |