This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]