This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR binutils/3281: objcopy changes PT_GNU_RELRO when there is PT_TLS
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Thu, 28 Sep 2006 15:09:16 -0700
- Subject: PATCH: PR binutils/3281: objcopy changes PT_GNU_RELRO when there is PT_TLS
When linker creates PT_GNU_RELRO segment, it sets p_vaddr, p_paddr,
p_offset, p_filesz from the corresponding PT_LOAD segment and
set p_memsz to p_filesz, p_align to 1. My previous fix for PR 3015
only handles p_align for objcopy. PT_GNU_RELRO segment will be
different after objcopy if there is a PT_TLS segment. This patch
puts all PT_GNU_RELRO segment procossing for objcopy into
assign_file_positions_for_non_load_sections and uses the same logic
as linker.
H.J.
----
bfd/
2006-09-28 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/3281
* elf.c (assign_file_positions_for_load_sections): Don't set
PT_GNU_RELRO segment alignment here.
(assign_file_positions_for_non_load_sections): Properly set up
PT_GNU_RELRO segment for copying executable/shared library.
ld/testsuite/
2006-09-28 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/3281
* ld-elf/binutils.exp: Update "-z relro" tests to use relro.s.
Add "-z relro" tests with TLS for objcopy.
* ld-elf/relro.s: New file.
--- binutils/bfd/elf.c.relro 2006-09-28 14:40:40.000000000 -0700
+++ binutils/bfd/elf.c 2006-09-28 14:55:39.000000000 -0700
@@ -4604,11 +4604,9 @@ assign_file_positions_for_load_sections
p->p_memsz += o->offset + o->size;
}
- if (p->p_type == PT_GNU_RELRO)
- p->p_align = 1;
- else if (align > p->p_align
- && (p->p_type != PT_LOAD
- || (abfd->flags & D_PAGED) == 0))
+ if (align > p->p_align
+ && (p->p_type != PT_LOAD
+ || (abfd->flags & D_PAGED) == 0))
p->p_align = align;
}
@@ -4734,7 +4732,8 @@ assign_file_positions_for_non_load_secti
if (m->count != 0)
{
if (p->p_type != PT_LOAD
- && (p->p_type != PT_NOTE || bfd_get_format (abfd) != bfd_core))
+ && (p->p_type != PT_NOTE
+ || bfd_get_format (abfd) != bfd_core))
{
Elf_Internal_Shdr *hdr;
BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
@@ -4745,7 +4744,33 @@ assign_file_positions_for_non_load_secti
if (hdr->sh_type != SHT_NOBITS)
p->p_filesz += hdr->sh_size;
- p->p_offset = m->sections[0]->filepos;
+ if (p->p_type == PT_GNU_RELRO)
+ {
+ /* When we get here, we are copying executable
+ or shared library. But we need to use the same
+ linker logic. */
+ Elf_Internal_Phdr *lp;
+
+ for (lp = phdrs; lp < phdrs + count; ++lp)
+ {
+ if (lp->p_type == PT_LOAD
+ && lp->p_paddr == p->p_paddr)
+ break;
+ }
+
+ if (lp < phdrs + count)
+ {
+ p->p_filesz += p->p_vaddr - lp->p_vaddr;
+ p->p_vaddr = lp->p_vaddr;
+ p->p_offset = lp->p_offset;
+ p->p_memsz = p->p_filesz;
+ p->p_align = 1;
+ }
+ else
+ abort ();
+ }
+ else
+ p->p_offset = m->sections[0]->filepos;
}
}
else
--- binutils/ld/testsuite/ld-elf/binutils.exp.relro 2006-08-16 19:04:53.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/binutils.exp 2006-09-28 14:48:35.000000000 -0700
@@ -101,24 +101,33 @@ binutils_test strip "-shared" maxpage1
binutils_test objcopy "" maxpage1
binutils_test objcopy "-shared" maxpage1
-binutils_test strip "-z relro" maxpage1
-binutils_test strip "-z relro -shared" maxpage1
-binutils_test objcopy "-z relro" maxpage1
-binutils_test objcopy "-z relro -shared" maxpage1
+binutils_test strip "-z relro" relro
+binutils_test strip "-z relro -shared" relro
+binutils_test objcopy "-z relro" relro
+binutils_test objcopy "-z relro -shared" relro
binutils_test objcopy "" tbss1
+binutils_test objcopy "-z relro" tbss1
binutils_test objcopy "-shared" tbss1
+binutils_test objcopy "-shared -z relro" tbss1
binutils_test objcopy "-z max-page-size=0x100000" tbss1
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss1
binutils_test objcopy "" tdata1
+binutils_test objcopy "-z relro" tdata1
binutils_test objcopy "-shared" tdata1
+binutils_test objcopy "-shared -z relro" tdata1
binutils_test objcopy "-z max-page-size=0x100000" tdata1
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata1
binutils_test objcopy "" tbss2
+binutils_test objcopy "-z relro" tbss2
binutils_test objcopy "-shared" tbss2
+binutils_test objcopy "-shared -z relro" tbss2
binutils_test objcopy "-z max-page-size=0x100000" tbss2
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tbss2
-binutils_test objcopy "-z max-page-size=0x100000" tdata2
+
binutils_test objcopy "" tdata2
+binutils_test objcopy "-z relro" tdata2
binutils_test objcopy "-shared" tdata2
+binutils_test objcopy "-shared -z relro" tdata2
+binutils_test objcopy "-z max-page-size=0x100000" tdata2
binutils_test objcopy "-z max-page-size=0x100000 -z common-page-size=0x1000" tdata2
--- binutils/ld/testsuite/ld-elf/relro.s.relro 2006-09-28 14:40:40.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/relro.s 2006-09-28 14:40:40.000000000 -0700
@@ -0,0 +1,14 @@
+ .globl main
+ .globl start
+ .globl _start
+ .globl __start
+ .text
+main:
+start:
+_start:
+__start:
+ .long 0
+ .data
+ .long 0
+ .section .data.rel.ro,"aw",%progbits
+ .long 0