ld: Add --enable-mark-plt configure option

Add --enable-mark-plt linker configure option to mark PLT entries with
DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT dynamic tags by
default.

	* NEWS: Mention -z mark-plt/-z nomark-plt and --enable-mark-plt.
	* config.in: Regenerated.
	* configure: Likewise.
	* configure.ac: Add --enable-mark-plt.
	(DEFAULT_LD_Z_MARK_PLT): New AC_DEFINE_UNQUOTED.
	* emulparams/x86-64-plt.sh (PARSE_AND_LIST_OPTIONS_X86_64_PLT):
	Support DEFAULT_LD_Z_MARK_PLT.
	* emultempl/elf-x86.em (elf_x86_64_before_parse): New function.
	(LDEMUL_BEFORE_PARSE): New.  Set to elf_x86_64_before_parse for
	x86-64 targets.
This commit is contained in:
H.J. Lu 2024-01-05 13:16:29 -08:00
parent 9167304255
commit f68c9d09a3
6 changed files with 73 additions and 3 deletions

View File

@ -1,5 +1,10 @@
-*- 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

View File

@ -45,6 +45,10 @@
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

26
ld/configure vendored
View File

@ -852,6 +852,7 @@ enable_new_dtags
enable_relro
enable_textrel_check
enable_separate_code
enable_mark_plt
enable_warn_execstack
enable_error_execstack
enable_warn_rwx_segments
@ -1546,6 +1547,7 @@ Optional Features:
--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
@ -11681,7 +11683,7 @@ else
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
@ -11787,7 +11789,7 @@ else
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
@ -15682,6 +15684,17 @@ esac
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.
@ -19365,6 +19378,15 @@ cat >>confdefs.h <<_ACEOF
_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

View File

@ -213,6 +213,16 @@ AC_ARG_ENABLE(separate-code,
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.
@ -562,6 +572,13 @@ AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_SEPARATE_CODE,
$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,

View File

@ -1,5 +1,10 @@
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"));
'

View File

@ -56,3 +56,20 @@ EOF
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