aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-02-27 11:34:20 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-02-27 11:34:29 -0800
commitf6aec96dce1ddbd8961a3aa8a2925db2021719bb (patch)
tree0837083a3f8011754f0fa415afa4a6fb27795580 /ld
parent55089490f79ce1ddb9610fd6abeeaf896825fb71 (diff)
downloadgdb-f6aec96dce1ddbd8961a3aa8a2925db2021719bb.zip
gdb-f6aec96dce1ddbd8961a3aa8a2925db2021719bb.tar.gz
gdb-f6aec96dce1ddbd8961a3aa8a2925db2021719bb.tar.bz2
ld: Add --enable-separate-code
This patch adds --enable-separate-code to ld configure to turn on -z separate-code by default and enables it by default for Linux/x86. This avoids mixing code pages with data to improve cache performance as well as security. To reduce x86-64 executable and shared object sizes, the maximum page size is reduced from 2MB to 4KB when -z separate-code is turned on by default. Note: -z max-page-size= can be used to set the maximum page size. We compared SPEC CPU 2017 performance before and after this change on Skylake server. There are no any significant performance changes. Everything is mostly below +/-1%. bfd/ * config.in: Regenerated. * configure: Likewise. * configure.ac: Add --enable-separate-code. (DEFAULT_LD_Z_SEPARATE_CODE): New AC_DEFINE_UNQUOTED. Default to 1 for Linux/x86 targets, * elf64-x86-64.c (ELF_MAXPAGESIZE): Set to 0x1000 if DEFAULT_LD_Z_SEPARATE_CODE is 1. ld/ * NEWS: Mention --enable-separate-code. * configure.ac: Add --enable-separate-code. (DEFAULT_LD_Z_SEPARATE_CODE): New AC_DEFINE_UNQUOTED. * configure.tgt: Default ac_default_ld_z_separate_code to 1 for Linux/x86 targets. * config.in: Regenerated. * configure: Likewise. * emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Set link_info.separate_code DEFAULT_LD_Z_SEPARATE_CODE.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog12
-rw-r--r--ld/NEWS5
-rw-r--r--ld/config.in4
-rwxr-xr-xld/configure26
-rw-r--r--ld/configure.ac17
-rw-r--r--ld/configure.tgt9
-rw-r--r--ld/emultempl/elf32.em1
7 files changed, 72 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index d117b7e..07c86ef 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,15 @@
+2018-02-27 H.J. Lu <hongjiu.lu@intel.com>
+
+ * NEWS: Mention --enable-separate-code.
+ * configure.ac: Add --enable-separate-code.
+ (DEFAULT_LD_Z_SEPARATE_CODE): New AC_DEFINE_UNQUOTED.
+ * configure.tgt: Default ac_default_ld_z_separate_code to 1 for
+ Linux/x86 targets.
+ * config.in: Regenerated.
+ * configure: Likewise.
+ * emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Set
+ link_info.separate_code DEFAULT_LD_Z_SEPARATE_CODE.
+
2018-02-26 Alan Modra <amodra@gmail.com>
* emulparams/call_nop.sh, * emulparams/cet.sh,
diff --git a/ld/NEWS b/ld/NEWS
index eafcaf3..75f8100 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,10 @@
-*- text -*-
+* Add a configure option --enable-separate-code to decide whether
+ -z separate-code should be enabled in ELF linker by default. Default
+ to yes for Linux/x86 targets. Note that -z separate-code can increase
+ disk and memory size.
+
Changes in 2.30:
* Add -z separate-code to generate separate code PT_LOAD segment.
diff --git a/ld/config.in b/ld/config.in
index a846743..b227a53 100644
--- a/ld/config.in
+++ b/ld/config.in
@@ -19,6 +19,10 @@
/* Define to 1 if you want to enable -z relro in ELF linker by default. */
#undef DEFAULT_LD_Z_RELRO
+/* Define to 1 if you want to enable -z separate-code in ELF linker by
+ default. */
+#undef DEFAULT_LD_Z_SEPARATE_CODE
+
/* Define to 1 if you want to set DT_RUNPATH instead of DT_RPATH by default.
*/
#undef DEFAULT_NEW_DTAGS
diff --git a/ld/configure b/ld/configure
index 17604bb..38f9739 100755
--- a/ld/configure
+++ b/ld/configure
@@ -790,6 +790,7 @@ enable_got
enable_compressed_debug_sections
enable_new_dtags
enable_relro
+enable_separate_code
enable_default_hash_style
enable_werror
enable_build_warnings
@@ -1451,6 +1452,7 @@ Optional Features:
compress debug sections by default]
--enable-new-dtags set DT_RUNPATH instead of DT_RPATH by default]
--enable-relro enable -z relro in ELF linker by default
+ --enable-separate-code enable -z separate-code in ELF linker by default
--enable-default-hash-style={sysv,gnu,both}
use this default hash style
--enable-werror treat compile warnings as errors
@@ -11725,7 +11727,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11728 "configure"
+#line 11730 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11831,7 +11833,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11834 "configure"
+#line 11836 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -15567,6 +15569,17 @@ if test "${enable_relro+set}" = set; then :
esac
fi
+# Decide if -z separate-code should be enabled in ELF linker by default.
+ac_default_ld_z_separate_code=unset
+# Check whether --enable-separate-code was given.
+if test "${enable_separate_code+set}" = set; then :
+ enableval=$enable_separate_code; case "${enableval}" in
+ yes) ac_default_ld_z_separate_code=1 ;;
+ no) ac_default_ld_z_separate_code=0 ;;
+esac
+fi
+
+
# Decide which "--hash-style" to use by default
# Provide a configure time option to override our default.
# Check whether --enable-default-hash-style was given.
@@ -17258,6 +17271,15 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
+if test "${ac_default_ld_z_separate_code}" = unset; then
+ ac_default_ld_z_separate_code=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LD_Z_SEPARATE_CODE $ac_default_ld_z_separate_code
+_ACEOF
+
+
cat >>confdefs.h <<_ACEOF
#define DEFAULT_EMIT_SYSV_HASH $ac_default_emit_sysv_hash
diff --git a/ld/configure.ac b/ld/configure.ac
index 6da8c8e..3552926 100644
--- a/ld/configure.ac
+++ b/ld/configure.ac
@@ -177,6 +177,16 @@ AC_ARG_ENABLE(relro,
no) ac_default_ld_z_relro=0 ;;
esac])dnl
+# Decide if -z separate-code should be enabled in ELF linker by default.
+ac_default_ld_z_separate_code=unset
+AC_ARG_ENABLE(separate-code,
+ AS_HELP_STRING([--enable-separate-code],
+ [enable -z separate-code in ELF linker by default]),
+[case "${enableval}" in
+ yes) ac_default_ld_z_separate_code=1 ;;
+ no) ac_default_ld_z_separate_code=0 ;;
+esac])
+
# Decide which "--hash-style" to use by default
# Provide a configure time option to override our default.
AC_ARG_ENABLE([default-hash-style],
@@ -434,6 +444,13 @@ AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_RELRO,
$ac_default_ld_z_relro,
[Define to 1 if you want to enable -z relro in ELF linker by default.])
+if test "${ac_default_ld_z_separate_code}" = unset; then
+ ac_default_ld_z_separate_code=0
+fi
+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.])
+
AC_DEFINE_UNQUOTED([DEFAULT_EMIT_SYSV_HASH],
[$ac_default_emit_sysv_hash],
[Define to 1 if you want to emit sysv hash in the ELF linker by default.])
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 6183a85..7897448 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -968,3 +968,12 @@ frv-*-* | hppa*-*-* | ia64-*-* | mips*-*-*)
fi
;;
esac
+
+# Enable -z separate-code by default for Linux/x86.
+case "${target}" in
+i[3-7]86-*-linux-* | x86_64-*-linux-*)
+ if test ${ac_default_ld_z_separate_code} = unset; then
+ ac_default_ld_z_separate_code=1
+ fi
+ ;;
+esac
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index aae9d1f..9b8971e 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -106,6 +106,7 @@ gld${EMULATION_NAME}_before_parse (void)
`if test -n "$CALL_NOP_BYTE" ; then echo link_info.call_nop_byte = $CALL_NOP_BYTE; fi`;
link_info.check_relocs_after_open_input = TRUE;
link_info.relro = DEFAULT_LD_Z_RELRO;
+ link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
}
EOF