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]

Re: PATCH: PR ld/14215: ld creates bad GNU_RELRO segment


On Sun, Jun 10, 2012 at 06:52:42AM -0700, H.J. Lu wrote:
> > We should check if .got.plt section exists before putting the first N
> > bytes in PT_GNU_RELRO segment.

Hard coding .got.plt into DATA_SEGMENT_RELRO_END evaluation isn't
really nice.  How about doing the size test in the script instead?
Since .got.plt is after the occurrence of DATA_SEGMENT_RELRO_END, we
just need to allow forward references when evaluating SIZEOF.  This
should be OK now that we always run a preliminary section sizing pass
for strip_excluded_output_sections.

I haven't given this patch much of a test.  Please try it out and
commit if you think the idea is good.

	PR ld/14215
	* ldexp.c (fold_name <SIZEOF, ALIGNOF>): Allow forward section
	references.
	* emulparams/elf32_x86_64.sh (SEPARATE_GOTPLT): Depend on size of
	.got.plt.
	* emulparams/elf32mb_linux.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf32tilegx.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf32tilepro.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf64tilegx.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf_i386.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf_k1om.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf_l1om.sh (SEPARATE_GOTPLT): Likewise.
	* emulparams/elf_x86_64.sh (SEPARATE_GOTPLT): Likewise.

Index: ld/ldexp.c
===================================================================
RCS file: /cvs/src/src/ld/ldexp.c,v
retrieving revision 1.99
diff -u -p -r1.99 ldexp.c
--- ld/ldexp.c	14 Mar 2012 05:24:02 -0000	1.99
+++ ld/ldexp.c	10 Jun 2012 22:38:57 -0000
@@ -681,7 +681,7 @@ fold_name (etree_type *tree)
 		       tree, tree->name.name);
 	      new_number (0);
 	    }
-	  else if (os->processed_vma)
+	  else if (os->bfd_section != NULL)
 	    {
 	      bfd_vma val;
 
@@ -693,6 +693,8 @@ fold_name (etree_type *tree)
 	      
 	      new_number (val);
 	    }
+	  else
+	    new_number (0);
 	}
       break;
 
Index: ld/emulparams/elf32_x86_64.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32_x86_64.sh,v
retrieving revision 1.4
diff -u -p -r1.4 elf32_x86_64.sh
--- ld/emulparams/elf32_x86_64.sh	31 Jan 2012 17:54:36 -0000	1.4
+++ ld/emulparams/elf32_x86_64.sh	10 Jun 2012 22:38:57 -0000
@@ -13,7 +13,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
 LARGE_SECTIONS=yes
-SEPARATE_GOTPLT=24
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 24 ? 24 : 0"
 IREL_IN_PLT=
 
 if [ "x${host}" = "x${target}" ]; then
Index: ld/emulparams/elf32mb_linux.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32mb_linux.sh,v
retrieving revision 1.1
diff -u -p -r1.1 elf32mb_linux.sh
--- ld/emulparams/elf32mb_linux.sh	6 Aug 2009 17:38:03 -0000	1.1
+++ ld/emulparams/elf32mb_linux.sh	10 Jun 2012 22:38:57 -0000
@@ -13,5 +13,5 @@ TEMPLATE_NAME=elf32
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
-SEPARATE_GOTPLT=12
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 12 ? 12 : 0"
       
Index: ld/emulparams/elf32tilegx.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32tilegx.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf32tilegx.sh
--- ld/emulparams/elf32tilegx.sh	25 Feb 2012 19:51:34 -0000	1.2
+++ ld/emulparams/elf32tilegx.sh	10 Jun 2012 22:38:57 -0000
@@ -16,7 +16,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_COMBRELOC_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
-SEPARATE_GOTPLT=8
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 8 ? 8 : 0"
 # Look for 32 bit target libraries in /lib32, /usr/lib32 etc., first.
 LIBPATH_SUFFIX=32
 OTHER_SECTIONS="
Index: ld/emulparams/elf32tilepro.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32tilepro.sh,v
retrieving revision 1.1
diff -u -p -r1.1 elf32tilepro.sh
--- ld/emulparams/elf32tilepro.sh	13 Jun 2011 15:18:49 -0000	1.1
+++ ld/emulparams/elf32tilepro.sh	10 Jun 2012 22:38:57 -0000
@@ -17,7 +17,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_COMBRELOC_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
-SEPARATE_GOTPLT=8
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 8 ? 8 : 0"
 OTHER_SECTIONS="
   /* TILEPRO architecture interrupt vector areas */
   .intrpt0 0xfc000000 : { KEEP(*(.intrpt0)) }
Index: ld/emulparams/elf64tilegx.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf64tilegx.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf64tilegx.sh
--- ld/emulparams/elf64tilegx.sh	25 Feb 2012 19:51:34 -0000	1.2
+++ ld/emulparams/elf64tilegx.sh	10 Jun 2012 22:38:57 -0000
@@ -17,7 +17,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_COMBRELOC_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
-SEPARATE_GOTPLT=16
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 16 ? 16 : 0"
 OTHER_SECTIONS="
   /* TILE architecture interrupt vector areas */
   .intrpt0 0xfffffffffc000000 : { KEEP(*(.intrpt0)) }
Index: ld/emulparams/elf_i386.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf_i386.sh,v
retrieving revision 1.12
diff -u -p -r1.12 elf_i386.sh
--- ld/emulparams/elf_i386.sh	31 Jan 2012 17:54:36 -0000	1.12
+++ ld/emulparams/elf_i386.sh	10 Jun 2012 22:38:57 -0000
@@ -11,5 +11,5 @@ TEMPLATE_NAME=elf32
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
-SEPARATE_GOTPLT=12
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 12 ? 12 : 0"
 IREL_IN_PLT=
Index: ld/emulparams/elf_k1om.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf_k1om.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf_k1om.sh
--- ld/emulparams/elf_k1om.sh	31 Jan 2012 17:54:36 -0000	1.2
+++ ld/emulparams/elf_k1om.sh	10 Jun 2012 22:38:57 -0000
@@ -14,7 +14,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
 LARGE_SECTIONS=yes
-SEPARATE_GOTPLT=24
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 24 ? 24 : 0"
 
 if [ "x${host}" = "x${target}" ]; then
   case " $EMULATION_LIBPATH " in
Index: ld/emulparams/elf_l1om.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf_l1om.sh,v
retrieving revision 1.4
diff -u -p -r1.4 elf_l1om.sh
--- ld/emulparams/elf_l1om.sh	31 Jan 2012 17:54:36 -0000	1.4
+++ ld/emulparams/elf_l1om.sh	10 Jun 2012 22:38:57 -0000
@@ -14,7 +14,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
 LARGE_SECTIONS=yes
-SEPARATE_GOTPLT=24
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 24 ? 24 : 0"
 
 if [ "x${host}" = "x${target}" ]; then
   case " $EMULATION_LIBPATH " in
Index: ld/emulparams/elf_x86_64.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf_x86_64.sh,v
retrieving revision 1.24
diff -u -p -r1.24 elf_x86_64.sh
--- ld/emulparams/elf_x86_64.sh	31 Jan 2012 17:54:36 -0000	1.24
+++ ld/emulparams/elf_x86_64.sh	10 Jun 2012 22:38:57 -0000
@@ -13,7 +13,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 NO_SMALL_DATA=yes
 LARGE_SECTIONS=yes
-SEPARATE_GOTPLT=24
+SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 24 ? 24 : 0"
 IREL_IN_PLT=
 
 if [ "x${host}" = "x${target}" ]; then

-- 
Alan Modra
Australia Development Lab, IBM


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