summaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2013-02-05 01:36:04 +0000
committerH.J. Lu <hjl.tools@gmail.com>2013-02-05 01:36:04 +0000
commit35a2c08b3b72fb40b7e805558667342667d5d76c (patch)
tree6b7ad0c7df3cf12ddf6f06a0144a734902b8053e /ld/emultempl
parentc3f391433dacc30b0a3ddc3e161ac9d344dfeef0 (diff)
downloadbinutils-redhat-35a2c08b3b72fb40b7e805558667342667d5d76c.tar.gz
Don't enable new dtags by default with -rpath
ld/ 2013-02-04 H.J. Lu <hongjiu.lu@intel.com> PR ld/15096 * 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/ia64elf.em (gld${EMULATION_NAME}_after_parse): Renamed to ... (gld_${EMULATION_NAME}_after_parse): This. Call gld${EMULATION_NAME}_after_parse instead of after_parse_default. (LDEMUL_AFTER_PARSE): Set to gld_${EMULATION_NAME}_after_parse. * emultempl/elf32.em (new_dtags_set): New variable. (gld${EMULATION_NAME}_before_parse): Don't set link_info.new_dtags here. (gld${EMULATION_NAME}_after_parse): New function. (ld_${EMULATION_NAME}_emulation): Replace after_parse_default' with gld${EMULATION_NAME}_after_parse. (gld${EMULATION_NAME}_handle_option): Set new_dtags_set to TRUE when setting link_info.new_dtags. ld/testsuite/ 2013-02-04 H.J. Lu <hongjiu.lu@intel.com> PR ld/15096 * ld-elf/new-dtags-1.d: New test. * ld-elf/new-dtags-2.d: Likewise. * ld-elf/new-dtags-3.d: Likewise. * ld-elf/new-dtags-4.d: Likewise. * ld-elf/new-dtags-5.d: Likewise. * ld-elf/new-dtags-6.d: Likewise. * ld-elf/new-dtags-7.d: Likewise. * ld-elf/new-dtags-8.d: Likewise.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/alphaelf.em2
-rw-r--r--ld/emultempl/cr16elf.em2
-rw-r--r--ld/emultempl/crxelf.em2
-rw-r--r--ld/emultempl/elf32.em37
-rw-r--r--ld/emultempl/hppaelf.em2
-rw-r--r--ld/emultempl/ia64elf.em6
-rw-r--r--ld/emultempl/mipself.em2
7 files changed, 42 insertions, 11 deletions
diff --git a/ld/emultempl/alphaelf.em b/ld/emultempl/alphaelf.em
index 21064ad8fb..d44de52abd 100644
--- a/ld/emultempl/alphaelf.em
+++ b/ld/emultempl/alphaelf.em
@@ -80,7 +80,7 @@ alpha_after_parse (void)
exp_nameop (SIZEOF_HEADERS, NULL)),
NULL);
- after_parse_default ();
+ gld${EMULATION_NAME}_after_parse ();
}
static void
diff --git a/ld/emultempl/cr16elf.em b/ld/emultempl/cr16elf.em
index f76b95e2df..0cf5e39840 100644
--- a/ld/emultempl/cr16elf.em
+++ b/ld/emultempl/cr16elf.em
@@ -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
diff --git a/ld/emultempl/crxelf.em b/ld/emultempl/crxelf.em
index c6d5a8dd64..ae12f5ed45 100644
--- a/ld/emultempl/crxelf.em
+++ b/ld/emultempl/crxelf.em
@@ -43,7 +43,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
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 13a1a414fb..482e9ca918 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -63,6 +63,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);
@@ -70,6 +71,15 @@ static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
(asection *, const char *, int);
EOF
+if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
+ fragment <<EOF
+
+/* TRUE if link_info.new_dtags is set. */
+static bfd_boolean new_dtags_set;
+
+EOF
+fi
+
if [ "x${USE_LIBPATH}" = xyes ] ; then
case ${target} in
*-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
@@ -105,16 +115,35 @@ gld${EMULATION_NAME}_before_parse (void)
input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
+}
+
EOF
+fi
+fragment <<EOF
+static void
+gld${EMULATION_NAME}_after_parse (void)
+{
+EOF
+
+if test x"$LDEMUL_AFTER_PARSE" != xgld"$EMULATION_NAME"_after_parse; then
+# Enable the "new" dtags by default only for Linux target emulation if
+# -rpath isn't used.
case ${target} in
*-*-linux-* | *-*-k*bsd*-* | *-*-gnu* | *-*-nacl*)
- fragment <<EOF
- link_info.new_dtags = TRUE;
+ case " ${EMULATION_LIBPATH} " in
+ *" ${EMULATION_NAME} "*)
+fragment <<EOF
+ if (!new_dtags_set && command_line.rpath == NULL)
+ link_info.new_dtags = TRUE;
EOF
+ ;;
+ esac
;;
esac
+
fragment <<EOF
+ after_parse_default ();
}
EOF
@@ -2227,10 +2256,12 @@ fragment <<EOF
case OPTION_DISABLE_NEW_DTAGS:
link_info.new_dtags = FALSE;
+ new_dtags_set = TRUE;
break;
case OPTION_ENABLE_NEW_DTAGS:
link_info.new_dtags = TRUE;
+ new_dtags_set = TRUE;
break;
case OPTION_EH_FRAME_HDR:
@@ -2515,7 +2546,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},
diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
index 65c1ea5e87..b315e51747 100644
--- a/ld/emultempl/hppaelf.em
+++ b/ld/emultempl/hppaelf.em
@@ -60,7 +60,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
diff --git a/ld/emultempl/ia64elf.em b/ld/emultempl/ia64elf.em
index 88d57480af..8eca7631ff 100644
--- a/ld/emultempl/ia64elf.em
+++ b/ld/emultempl/ia64elf.em
@@ -31,12 +31,12 @@ fragment <<EOF
static int itanium = 0;
static void
-gld${EMULATION_NAME}_after_parse (void)
+gld_${EMULATION_NAME}_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=gld_${EMULATION_NAME}_after_parse
source_em ${srcdir}/emultempl/needrelax.em
diff --git a/ld/emultempl/mipself.em b/ld/emultempl/mipself.em
index 9ac61a2a47..d685b87b7c 100644
--- a/ld/emultempl/mipself.em
+++ b/ld/emultempl/mipself.em
@@ -45,7 +45,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