summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2008-11-11 04:26:13 +0000
committerAlan Modra <amodra@bigpond.net.au>2008-11-11 04:26:13 +0000
commit470a797af9ea10307ee82dcc17fe9e15bef92fa6 (patch)
tree099f8c8ec6412562ea63bfc22eb9f742bcb5a2df
parentbd7b05d7c05dc9ad6063f1113b84a8a22189f468 (diff)
downloadgdb-470a797af9ea10307ee82dcc17fe9e15bef92fa6.tar.gz
* elf.c (assign_file_positions_for_non_load_sections): Consolidate
PT_GNU_RELRO handling.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf.c66
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)
{