On Sun, 7 Aug 2016, Philip Guenther wrote:
> On Sun, 7 Aug 2016, Mark Kettenis wrote:
> ...
> > Going to give this a go on hppa to see if I can spot any issues there.
> 
> It works there just as well as before for me, with no new failures in my 
> "try lots of ld option combinations" test.  Since it has an executable 
> .plt, to make relro work will require a layout more like sparc64, with the 
> .plt section hoisted to before the data.  I need to see what the 
> limitations on .plt<-->.got distance are to see where .got goes for that.

New diff, adding relro support for hppa!  Yay!

Still need to fix powerpc!  Boo!


I'm looking for anyone with alpha or landisk that can test relro there.  
Just add "|| defined(__alpha__) || defined(__sh__)" to the #if in the 
first chunk below, then:
   cd gnu/usr.bin/binutils-2.17
   make -f Makefile.bsd-wrapper
   doas make -f Makefile.bsd-wrapper install

...and apply the lib/csu and libexec/ld.so diffs, rebuild and install in 
ld.so and lib/csu, then try building the world!


Philip

Index: gnu/usr.bin/binutils-2.17/ld/ldmain.c
===================================================================
RCS file: /data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/ldmain.c,v
retrieving revision 1.9
diff -u -p -r1.9 ldmain.c
--- gnu/usr.bin/binutils-2.17/ld/ldmain.c       21 Jun 2016 02:55:57 -0000      
1.9
+++ gnu/usr.bin/binutils-2.17/ld/ldmain.c       8 Aug 2016 02:31:00 -0000
@@ -299,7 +299,12 @@ main (int argc, char **argv)
   link_info.new_dtags = FALSE;
   link_info.combreloc = TRUE;
   link_info.eh_frame_hdr = FALSE;
+#if defined(__amd64__) || defined(__arm__) || defined(__i386__) || \
+    defined(__hppa__) || defined(__sparc64__)
+  link_info.relro = TRUE;
+#else
   link_info.relro = FALSE;
+#endif
   link_info.strip_discarded = TRUE;
   link_info.strip = strip_none;
   link_info.discard = discard_sec_merge;
Index: gnu/usr.bin/binutils-2.17/ld/emulparams/armelf_obsd.sh
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/emulparams/armelf_obsd.sh,v
retrieving revision 1.1
diff -u -p -r1.1 armelf_obsd.sh
--- gnu/usr.bin/binutils-2.17/ld/emulparams/armelf_obsd.sh      24 Apr 2011 
20:19:25 -0000      1.1
+++ gnu/usr.bin/binutils-2.17/ld/emulparams/armelf_obsd.sh      19 Jul 2016 
15:29:16 -0000
@@ -1,8 +1,10 @@
 . ${srcdir}/emulparams/armelf.sh
-. ${srcdir}/emulparams/elf_obsd.sh
 
 MAXPAGESIZE=0x8000
+COMMONPAGESIZE=0x1000
 TEXT_START_ADDR=0x00008000
 TARGET2_TYPE=got-rel
 
 unset EMBEDDED
+
+. ${srcdir}/emulparams/elf_obsd.sh
Index: gnu/usr.bin/binutils-2.17/ld/emulparams/elf32ppc_obsd.sh
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/emulparams/elf32ppc_obsd.sh,v
retrieving revision 1.3
diff -u -p -r1.3 elf32ppc_obsd.sh
--- gnu/usr.bin/binutils-2.17/ld/emulparams/elf32ppc_obsd.sh    23 Aug 2015 
15:19:32 -0000      1.3
+++ gnu/usr.bin/binutils-2.17/ld/emulparams/elf32ppc_obsd.sh    4 Jul 2016 
01:57:30 -0000
@@ -1,7 +1,2 @@
-. ${srcdir}/emulparams/elf32ppccommon.sh
-# We deliberately keep the traditional OpenBSD W^X layout for both the
-# old BSS-PLT and the new Secure-PLT ABI.
-BSS_PLT=
-OTHER_TEXT_SECTIONS="*(.glink)"
-EXTRA_EM_FILE=ppc32elf
+. ${srcdir}/emulparams/elf32ppc.sh
 . ${srcdir}/emulparams/elf_obsd.sh
Index: gnu/usr.bin/binutils-2.17/ld/emulparams/elf64btsmip_obsd.sh
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/emulparams/elf64btsmip_obsd.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf64btsmip_obsd.sh
--- gnu/usr.bin/binutils-2.17/ld/emulparams/elf64btsmip_obsd.sh 16 Jun 2015 
20:25:35 -0000      1.2
+++ gnu/usr.bin/binutils-2.17/ld/emulparams/elf64btsmip_obsd.sh 4 Jul 2016 
01:57:30 -0000
@@ -1,5 +1,6 @@
 . ${srcdir}/emulparams/elf64btsmip.sh
 MAXPAGESIZE=0x10000
+COMMONPAGESIZE=0x1000
 TEXT_START_ADDR="0x10000000"
 . ${srcdir}/emulparams/elf_obsd.sh
 # XXX causes GOT oflows
Index: gnu/usr.bin/binutils-2.17/ld/emulparams/elf64ltsmip_obsd.sh
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/emulparams/elf64ltsmip_obsd.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf64ltsmip_obsd.sh
--- gnu/usr.bin/binutils-2.17/ld/emulparams/elf64ltsmip_obsd.sh 16 Jun 2015 
20:25:35 -0000      1.2
+++ gnu/usr.bin/binutils-2.17/ld/emulparams/elf64ltsmip_obsd.sh 4 Jul 2016 
01:57:30 -0000
@@ -1,5 +1,6 @@
 . ${srcdir}/emulparams/elf64ltsmip.sh
 MAXPAGESIZE=0x10000
+COMMONPAGESIZE=0x1000
 TEXT_START_ADDR="0x10000000"
 . ${srcdir}/emulparams/elf_obsd.sh
 # XXX causes GOT oflows
Index: gnu/usr.bin/binutils-2.17/ld/emulparams/hppaobsd.sh
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/emulparams/hppaobsd.sh,v
retrieving revision 1.3
diff -u -p -r1.3 hppaobsd.sh
--- gnu/usr.bin/binutils-2.17/ld/emulparams/hppaobsd.sh 21 Mar 2013 22:32:30 
-0000      1.3
+++ gnu/usr.bin/binutils-2.17/ld/emulparams/hppaobsd.sh 8 Aug 2016 01:58:55 
-0000
@@ -7,6 +7,7 @@ OUTPUT_FORMAT="elf32-hppa"
 
 # other necessary defines, similar but not the same as linux.
 MAXPAGESIZE=0x1000
+COMMONPAGESIZE=0x1000
 ENTRY="__start"
 MACHINE=hppa1.1    # We use 1.1 specific features.
 OTHER_READONLY_SECTIONS=".PARISC.unwind ${RELOCATING-0} : { *(.PARISC.unwind) 
}"
Index: gnu/usr.bin/binutils-2.17/ld/scripttempl/elf.sc
===================================================================
RCS file: 
/data/src/openbsd/src/gnu/usr.bin/binutils-2.17/ld/scripttempl/elf.sc,v
retrieving revision 1.8
diff -u -p -r1.8 elf.sc
--- gnu/usr.bin/binutils-2.17/ld/scripttempl/elf.sc     9 Aug 2014 04:49:47 
-0000       1.8
+++ gnu/usr.bin/binutils-2.17/ld/scripttempl/elf.sc     8 Aug 2016 02:22:54 
-0000
@@ -267,6 +267,35 @@ SECTIONS
   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = 
${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + 
SIZEOF_HEADERS;}}
   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
+  .init         ${RELOCATING-0} : 
+  { 
+    ${RELOCATING+${INIT_START}}
+    KEEP (*(.init))
+    ${RELOCATING+${INIT_END}}
+  } =${NOP-0}
+
+  ${TEXT_PLT+${PLT}}
+  ${TINY_READONLY_SECTION}
+  .text         ${RELOCATING-0} :
+  {
+    ${RELOCATING+${TEXT_START_SYMBOLS}}
+    *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
+    KEEP (*(.text.*personality*))
+    /* .gnu.warning sections are handled specially by elf32.em.  */
+    *(.gnu.warning)
+    ${RELOCATING+${OTHER_TEXT_SECTIONS}}
+  } =${NOP-0}
+  .fini         ${RELOCATING-0} :
+  {
+    ${RELOCATING+${FINI_START}}
+    KEEP (*(.fini))
+    ${RELOCATING+${FINI_END}}
+  } =${NOP-0}
+  ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
+  ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
+  ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
+
+  ${PAD_RO+${PAD_RO0}}
   ${CREATE_SHLIB-${INTERP}}
   ${INITIAL_READONLY_SECTIONS}
   ${TEXT_DYNAMIC+${DYNAMIC}}
@@ -337,34 +366,6 @@ cat <<EOF
   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) }
   ${OTHER_PLT_RELOC_SECTIONS}
 
-  .init         ${RELOCATING-0} : 
-  { 
-    ${RELOCATING+${INIT_START}}
-    KEEP (*(.init))
-    ${RELOCATING+${INIT_END}}
-  } =${NOP-0}
-
-  ${TEXT_PLT+${PLT}}
-  ${TINY_READONLY_SECTION}
-  .text         ${RELOCATING-0} :
-  {
-    ${RELOCATING+${TEXT_START_SYMBOLS}}
-    *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
-    KEEP (*(.text.*personality*))
-    /* .gnu.warning sections are handled specially by elf32.em.  */
-    *(.gnu.warning)
-    ${RELOCATING+${OTHER_TEXT_SECTIONS}}
-  } =${NOP-0}
-  .fini         ${RELOCATING-0} :
-  {
-    ${RELOCATING+${FINI_START}}
-    KEEP (*(.fini))
-    ${RELOCATING+${FINI_END}}
-  } =${NOP-0}
-  ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
-  ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
-  ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
-  ${PAD_RO+${PAD_RO0}}
   ${WRITABLE_RODATA-${RODATA}}
   .rodata1      ${RELOCATING-0} : { *(.rodata1) }
   ${CREATE_SHLIB-${SDATA2}}
@@ -374,11 +375,21 @@ cat <<EOF
   .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
   .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table 
.gcc_except_table.*) }
 
+  ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT-${PAD_PLT+${PAD_PLT0}}}}}
+  ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${PAD_GOT+${PAD_GOT0}}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${PLT}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${GOT}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${OTHER_GOT_SECTIONS}}}
+  ${DATA_NONEXEC_PLT+${SDATA_GOT+${PAD_GOT+${PAD_GOT1}}}}
+
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = 
${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
+  ${DATA_GOT+${RELRO_NOW+${PAD_GOT+${RELOCATING+PROVIDE_HIDDEN(__got_start = 
.);}}}}
 
   /* Exception handling  */
   .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
@@ -419,17 +430,21 @@ cat <<EOF
   ${RELOCATING+${DATARELRO}}
   ${OTHER_RELRO_SECTIONS}
   ${TEXT_DYNAMIC-${DYNAMIC}}
-  ${DATA_GOT+${PAD_GOT+${PAD_GOT0}}}
+  ${DATA_GOT+${RELRO_NOW-${PAD_GOT+${PAD_GOT0}}}}
   ${DATA_GOT+${DATA_NONEXEC_PLT+${PLT}}}
   ${DATA_GOT+${RELRO_NOW+${GOT}}}
   ${DATA_GOT+${RELRO_NOW+${GOTPLT}}}
-  ${DATA_GOT+${RELRO_NOW+${PAD_GOT+${PAD_GOT1}}}}
+  ${DATA_GOT+${RELRO_NOW+${PAD_CDTOR+${RELOCATING+${CTOR}}}}}
+  ${DATA_GOT+${RELRO_NOW+${PAD_CDTOR+${RELOCATING+${DTOR}}}}}
+  ${DATA_GOT+${RELRO_NOW+${PAD_GOT+${RELOCATING+PROVIDE_HIDDEN(__got_end = 
.);}}}}
   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${GOT}}}}
   /* If PAD_CDTOR, and separate .got and .got.plt sections, CTOR and DTOR
      are relocated here to receive the same mprotect protection as .got */
   
${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${PAD_CDTOR+${RELOCATING+${CTOR}}}}}}
   
${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${PAD_CDTOR+${RELOCATING+${DTOR}}}}}}
   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${PAD_GOT+${PAD_GOT1}}}}}
+  ${DATA_NONEXEC_PLT+${DATA_GOT-${PAD_CDTOR+${RELOCATING+${CTOR}}}}}
+  ${DATA_NONEXEC_PLT+${DATA_GOT-${PAD_CDTOR+${RELOCATING+${DTOR}}}}}
   ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${GOT}}}}
   
${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${PAD_CDTOR+${RELOCATING+${CTOR}}}}}}
@@ -437,10 +452,6 @@ cat <<EOF
   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${PAD_GOT+${PAD_GOT1}}}}}
   ${DATA_GOT+${RELRO_NOW-${GOTPLT}}}
 
-  ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT-${PAD_PLT+${PAD_PLT0}}}}}
-  ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}}
-  ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT-${PAD_PLT+${PAD_PLT1}}}}}
-
   .data         ${RELOCATING-0} :
   {
     ${RELOCATING+${DATA_START_SYMBOLS}}
@@ -457,18 +468,15 @@ cat <<EOF
   ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT+${PAD_PLT+${PAD_PLT0}}}}}
   ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}}
   ${DATA_NONEXEC_PLT-${DATA_PLT+${PLT_BEFORE_GOT+${PAD_PLT+${PAD_PLT1}}}}}
-  ${SDATA_GOT+${PAD_GOT+${PAD_GOT0}}}
-  ${SDATA_GOT+${DATA_NONEXEC_PLT+${PLT}}}
-  ${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}
-  ${SDATA_GOT+${GOT}}
+  ${DATA_NONEXEC_PLT-${SDATA_GOT+${PAD_GOT+${PAD_GOT0}}}}
+  ${DATA_NONEXEC_PLT-${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}}
+  ${DATA_NONEXEC_PLT-${SDATA_GOT+${GOT}}}
 
-  ${DATA_GOT+${RELRO_NOW+${PAD_CDTOR+${RELOCATING+${CTOR}}}}}
-  ${DATA_GOT+${RELRO_NOW+${PAD_CDTOR+${RELOCATING+${DTOR}}}}}
-  ${DATA_GOT-${PAD_CDTOR+${RELOCATING+${CTOR}}}}
-  ${DATA_GOT-${PAD_CDTOR+${RELOCATING+${DTOR}}}}
+  ${DATA_NONEXEC_PLT-${DATA_GOT-${PAD_CDTOR+${RELOCATING+${CTOR}}}}}
+  ${DATA_NONEXEC_PLT-${DATA_GOT-${PAD_CDTOR+${RELOCATING+${DTOR}}}}}
 
-  ${SDATA_GOT+${OTHER_GOT_SECTIONS}}
-  ${SDATA_GOT+${PAD_GOT+${PAD_GOT1}}}
+  ${DATA_NONEXEC_PLT-${SDATA_GOT+${OTHER_GOT_SECTIONS}}}
+  ${DATA_NONEXEC_PLT-${SDATA_GOT+${PAD_GOT+${PAD_GOT1}}}}
 
   ${SDATA}
   ${OTHER_SDATA_SECTIONS}

Reply via email to