Set DF_1_PIE in gld${EMULATION_NAME}_after_parse
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 22 Sep 2015 13:08:55 +0000 (06:08 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 22 Sep 2015 13:08:55 +0000 (06:08 -0700)
We can't add OPTION_PIE to gld${EMULATION_NAME}_handle_option since
it has been handled in parse_args in lexsup.c.  This patch moves
setting DF_1_PIE to gld${EMULATION_NAME}_after_parse.

ld/

* emultempl/alphaelf.em (alpha_after_parse): Call
gld${EMULATION_NAME}_after_parse instead of
after_parse_default.
* emultempl/cr16elf.em (cr16elf_after_parse): Likewise.
* emultempl/crxelf.em (crxelf_after_parse); Likewise.
* emultempl/hppaelf.em (hppaelf_after_parse): Likewise.
* emultempl/mipself.em (mips_after_parse): Likewise.
* emultempl/nds32elf.em (nds32_elf_after_parse): Likewise.
* emultempl/elf32.em: Don't include ldlex.h.
(gld${EMULATION_NAME}_after_parse): New function.
(gld${EMULATION_NAME}_handle_option) [GENERATE_PIE_SCRIPT]
<OPTION_PIE>: Removed.
(ld_${EMULATION_NAME}_emulation): Replace after_parse_default
with gld${EMULATION_NAME}_after_parse.
* emultempl/ia64elf.em (gld${EMULATION_NAME}_after_parse):
Renamed to ...
(ia64elf_after_parse): This.  Call
gld${EMULATION_NAME}_after_parse instead of after_parse_default.
(LDEMUL_AFTER_PARSE): Replace gld${EMULATION_NAME}_after_parse
with ia64elf_after_parse.

ld/testsuite/

* ld-elf/pie.d: New test.

ld/ChangeLog
ld/emultempl/alphaelf.em
ld/emultempl/cr16elf.em
ld/emultempl/crxelf.em
ld/emultempl/elf32.em
ld/emultempl/hppaelf.em
ld/emultempl/ia64elf.em
ld/emultempl/mipself.em
ld/emultempl/nds32elf.em
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/pie.d [new file with mode: 0644]

index 88a46c5..93a852a 100644 (file)
@@ -1,3 +1,26 @@
+2015-09-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * emultempl/alphaelf.em (alpha_after_parse): Call
+       gld${EMULATION_NAME}_after_parse instead of
+       after_parse_default.
+       * emultempl/cr16elf.em (cr16elf_after_parse): Likewise.
+       * emultempl/crxelf.em (crxelf_after_parse); Likewise.
+       * emultempl/hppaelf.em (hppaelf_after_parse): Likewise.
+       * emultempl/mipself.em (mips_after_parse): Likewise.
+       * emultempl/nds32elf.em (nds32_elf_after_parse): Likewise.
+       * emultempl/elf32.em: Don't include ldlex.h.
+       (gld${EMULATION_NAME}_after_parse): New function.
+       (gld${EMULATION_NAME}_handle_option) [GENERATE_PIE_SCRIPT]
+       <OPTION_PIE>: Removed.
+       (ld_${EMULATION_NAME}_emulation): Replace after_parse_default
+       with gld${EMULATION_NAME}_after_parse.
+       * emultempl/ia64elf.em (gld${EMULATION_NAME}_after_parse):
+       Renamed to ...
+       (ia64elf_after_parse): This.  Call
+       gld${EMULATION_NAME}_after_parse instead of after_parse_default.
+       (LDEMUL_AFTER_PARSE): Replace gld${EMULATION_NAME}_after_parse
+       with ia64elf_after_parse.
+
 2015-09-22  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * emulparams/solaris2.sh (GENERATE_PIE_SCRIPT): Set to yes.
index 1301c6f..1db94c7 100644 (file)
@@ -82,7 +82,7 @@ alpha_after_parse (void)
                                   exp_nameop (SIZEOF_HEADERS, NULL)),
                        NULL);
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 static void
index 276dce4..48dcf14 100644 (file)
@@ -119,7 +119,7 @@ cr16elf_after_parse (void)
      is true the link sometimes fails.  */
   config.magic_demand_paged = FALSE;
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 /* This is called after the sections have been attached to output
index 8fefb82..172aa9b 100644 (file)
@@ -42,7 +42,7 @@ crxelf_after_parse (void)
      is true the link sometimes fails.  */
   config.magic_demand_paged = FALSE;
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 /* This is called after the sections have been attached to output
index 5fe576e..b7ddca3 100644 (file)
@@ -49,7 +49,6 @@ fragment <<EOF
 #include "ldmain.h"
 #include "ldmisc.h"
 #include "ldexp.h"
-#include "ldlex.h"
 #include "ldlang.h"
 #include "ldfile.h"
 #include "ldemul.h"
@@ -61,6 +60,7 @@ fragment <<EOF
 
 /* Declare functions used by various EXTRA_EM_FILEs.  */
 static void gld${EMULATION_NAME}_before_parse (void);
+static void gld${EMULATION_NAME}_after_parse (void);
 static void gld${EMULATION_NAME}_after_open (void);
 static void gld${EMULATION_NAME}_before_allocation (void);
 static void gld${EMULATION_NAME}_after_allocation (void);
@@ -108,6 +108,21 @@ gld${EMULATION_NAME}_before_parse (void)
 EOF
 fi
 
+if test x"$LDEMUL_AFTER_PARSE" != xgld"$EMULATION_NAME"_after_parse; then
+fragment <<EOF
+
+static void
+gld${EMULATION_NAME}_after_parse (void)
+{
+  if (bfd_link_pie (&link_info))
+    link_info.flags_1 |= (bfd_vma) DF_1_PIE;
+
+  after_parse_default ();
+}
+
+EOF
+fi
+
 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
 fragment <<EOF
 /* Handle the generation of DT_NEEDED tags.  */
@@ -2290,13 +2305,6 @@ fragment <<EOF
 
 EOF
 fi
-if test x"$GENERATE_PIE_SCRIPT" = xyes; then
-fragment <<EOF
-    case OPTION_PIE:
-      link_info.flags_1 |= (bfd_vma) DF_1_PIE;
-      break;
-EOF
-fi
 fragment <<EOF
     case 'z':
       if (strcmp (optarg, "defs") == 0)
@@ -2459,7 +2467,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
   ${LDEMUL_SYSLIB-syslib_default},
   ${LDEMUL_HLL-hll_default},
-  ${LDEMUL_AFTER_PARSE-after_parse_default},
+  ${LDEMUL_AFTER_PARSE-gld${EMULATION_NAME}_after_parse},
   ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open},
   ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation},
   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
index 26ccc0f..0807149 100644 (file)
@@ -59,7 +59,7 @@ hppaelf_after_parse (void)
                          NULL);
   */
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 /* This is called before the input files are opened.  We create a new
index 4de45e8..ddfa4b5 100644 (file)
@@ -31,12 +31,12 @@ fragment <<EOF
 static int itanium = 0;
 
 static void
-gld${EMULATION_NAME}_after_parse (void)
+ia64elf_after_parse (void)
 {
   link_info.relax_pass = 2;
   bfd_elf${ELFSIZE}_ia64_after_parse (itanium);
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 EOF
@@ -61,5 +61,5 @@ PARSE_AND_LIST_ARGS_CASES='
       break;
 '
 
-LDEMUL_AFTER_PARSE=gld${EMULATION_NAME}_after_parse
+LDEMUL_AFTER_PARSE=ia64elf_after_parse
 source_em ${srcdir}/emultempl/needrelax.em
index 0eb0813..1c60c66 100644 (file)
@@ -47,7 +47,7 @@ mips_after_parse (void)
       link_info.emit_hash = TRUE;
       link_info.emit_gnu_hash = FALSE;
     }
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 struct hook_stub_info
index e74652a..73a49f7 100644 (file)
@@ -94,7 +94,7 @@ nds32_elf_after_parse (void)
       target_optimize = target_optimize & (!NDS32_RELAX_EX9_ON);
     }
 
-  after_parse_default ();
+  gld${EMULATION_NAME}_after_parse ();
 }
 
 static void
index 575d048..78de2b2 100644 (file)
@@ -1,3 +1,7 @@
+2015-09-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * ld-elf/pie.d: New test.
+
 2015-09-18  Alan Modra  <amodra@gmail.com>
 
        PR ld/18963
diff --git a/ld/testsuite/ld-elf/pie.d b/ld/testsuite/ld-elf/pie.d
new file mode 100644 (file)
index 0000000..d68b962
--- /dev/null
@@ -0,0 +1,8 @@
+#source: start.s
+#readelf: -d -W
+#ld: -pie
+#target: *-*-linux* *-*-gnu* *-*-solaris*
+
+#...
+ +0x[0-9a-f]+ +\(FLAGS_1\) +Flags: +PIE
+#pass