-*- text -*-
+* Add -z mark-plt/-z nomark-plt options to x86-64 ELF linker to mark PLT
+ entries with DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT dynamic
+ tags. Also added --enable-mark-plt configure option to mark PLT entries
+ by default.
+
* Support Intel APX relocations.
* On RISC-V, add ld target option --[no-]check-uleb128. Should rebuild the
default. */
#undef DEFAULT_LD_WARN_RWX_SEGMENTS
+/* Define to 1 if you want to enable -z mark-plt in ELF x86-64 linker by
+ default. */
+#undef DEFAULT_LD_Z_MARK_PLT
+
/* Define to 1 if you want to enable -z relro in ELF linker by default. */
#undef DEFAULT_LD_Z_RELRO
enable_relro
enable_textrel_check
enable_separate_code
+enable_mark_plt
enable_warn_execstack
enable_error_execstack
enable_warn_rwx_segments
--enable-textrel-check=[yes|no|warning|error]
enable DT_TEXTREL check in ELF linker
--enable-separate-code enable -z separate-code in ELF linker by default
+ --enable-mark-plt enable -z mark-plt in ELF x86-64 linker by default
--enable-warn-execstack enable warnings when creating an executable stack
--enable-error-execstack
turn executable stack warnings into errors
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11684 "configure"
+#line 11686 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11790 "configure"
+#line 11792 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
fi
+# Decide if -z mark-plt should be enabled in ELF x86-64 linker by default.
+ac_default_ld_z_mark_plt=unset
+# Check whether --enable-mark-plt was given.
+if test "${enable_mark_plt+set}" = set; then :
+ enableval=$enable_mark_plt; case "${enableval}" in
+ yes) ac_default_ld_z_mark_plt=1 ;;
+ no) ac_default_ld_z_mark_plt=0 ;;
+esac
+fi
+
+
# By default warn when an executable stack is created due to object files
# requesting such, not when the user specifies -z execstack.
_ACEOF
+if test "${ac_default_ld_z_mark_plt}" = unset; then
+ ac_default_ld_z_mark_plt=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_Z_MARK_PLT $ac_default_ld_z_mark_plt
+_ACEOF
+
+
cat >>confdefs.h <<_ACEOF
no) ac_default_ld_z_separate_code=0 ;;
esac])
+# Decide if -z mark-plt should be enabled in ELF x86-64 linker by default.
+ac_default_ld_z_mark_plt=unset
+AC_ARG_ENABLE(mark-plt,
+ AS_HELP_STRING([--enable-mark-plt],
+ [enable -z mark-plt in ELF x86-64 linker by default]),
+[case "${enableval}" in
+ yes) ac_default_ld_z_mark_plt=1 ;;
+ no) ac_default_ld_z_mark_plt=0 ;;
+esac])
+
# By default warn when an executable stack is created due to object files
# requesting such, not when the user specifies -z execstack.
$ac_default_ld_z_separate_code,
[Define to 1 if you want to enable -z separate-code in ELF linker by default.])
+if test "${ac_default_ld_z_mark_plt}" = unset; then
+ ac_default_ld_z_mark_plt=0
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_MARK_PLT,
+ $ac_default_ld_z_mark_plt,
+ [Define to 1 if you want to enable -z mark-plt in ELF x86-64 linker by default.])
+
AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_EXECSTACK,
$ac_default_ld_warn_execstack,
PARSE_AND_LIST_OPTIONS_X86_64_PLT='
- fprintf (file, _("\
+ if (DEFAULT_LD_Z_MARK_PLT != 0)
+ fprintf (file, _("\
+ -z mark-plt Mark PLT with dynamic tags (default)\n\
+ -z nomark-plt Do not mark PLT with dynamic tags\n"));
+ else
+ fprintf (file, _("\
-z mark-plt Mark PLT with dynamic tags\n\
-z nomark-plt Do not mark PLT with dynamic tags (default)\n"));
'
LDEMUL_BEFORE_PARSE=elf_x86_before_parse
fi
+
+case x${OUTPUT_FORMAT}${CALL_NOP_BYTE} in
+ x*x86-64*0x67)
+fragment <<EOF
+
+static void
+elf_x86_64_before_parse (void)
+{
+ params.mark_plt = DEFAULT_LD_Z_MARK_PLT;
+
+ elf_x86_before_parse ();
+}
+EOF
+
+ LDEMUL_BEFORE_PARSE=elf_x86_64_before_parse
+ ;;
+esac