summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-05-24 08:44:10 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-05-24 08:44:23 -0700
commit6901def689b5c77465d34f07822989ec67e80c1e (patch)
tree2efde72294545c6b0129133d43d1f7335182fa61
parent4c011268960c6f24650672597deed756f21ad363 (diff)
Avoid an extra branch to PLT for -z now
When --enable-bind-now is used to configure glibc build, we can avoid an extra branch to the PLT entry by using indirect branch via the GOT slot instead, which is similar to the first instructuon in the PLT entry. Changes in the shared library sizes in text sections: Shared library Before (bytes) After (bytes) libm.so 1060813 1060797 libmvec.so 160881 160805 libpthread.so 94992 94984 librt.so 25064 25048 * config.h.in (BIND_NOW): New. * configure.ac (BIND_NOW): New. Defined for --enable-bind-now. * configure: Regenerated. * sysdeps/x86_64/sysdep.h (JUMPTARGET)[BIND_NOW]: Defined to indirect branch via the GOT slot.
-rw-r--r--ChangeLog8
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure4
-rw-r--r--configure.ac3
-rw-r--r--sysdeps/x86_64/sysdep.h8
5 files changed, 24 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 3345a1d379..055316f86e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-05-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config.h.in (BIND_NOW): New.
+ * configure.ac (BIND_NOW): New. Defined for --enable-bind-now.
+ * configure: Regenerated.
+ * sysdeps/x86_64/sysdep.h (JUMPTARGET)[BIND_NOW]: Defined to
+ indirect branch via the GOT slot.
+
2016-05-24 Stefan Liebler <stli@linux.vnet.ibm.com>
[BZ #19765]
diff --git a/config.h.in b/config.h.in
index 0147ba3c34..2c902b0214 100644
--- a/config.h.in
+++ b/config.h.in
@@ -87,6 +87,9 @@
include/libc-symbols.h that avoid PLT slots in the shared objects. */
#undef NO_HIDDEN
+/* Define this to disable lazy relocations in DSOs. */
+#undef BIND_NOW
+
/* AArch64 big endian ABI */
#undef HAVE_AARCH64_BE
diff --git a/configure b/configure
index 8fe59377ea..19a4829466 100755
--- a/configure
+++ b/configure
@@ -3416,6 +3416,10 @@ else
fi
+if test "x$bindnow" = xyes; then
+ $as_echo "#define BIND_NOW 1" >>confdefs.h
+
+fi
# Check whether --enable-static-nss was given.
if test "${enable_static_nss+set}" = set; then :
diff --git a/configure.ac b/configure.ac
index 3c766b7409..123f0d26ee 100644
--- a/configure.ac
+++ b/configure.ac
@@ -231,6 +231,9 @@ AC_ARG_ENABLE([bind-now],
[bindnow=$enableval],
[bindnow=no])
AC_SUBST(bindnow)
+if test "x$bindnow" = xyes; then
+ AC_DEFINE(BIND_NOW)
+fi
dnl On some platforms we cannot use dynamic loading. We must provide
dnl static NSS modules.
diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h
index fbe3560588..75ac747be8 100644
--- a/sysdeps/x86_64/sysdep.h
+++ b/sysdeps/x86_64/sysdep.h
@@ -90,9 +90,13 @@ lose: \
#undef JUMPTARGET
#ifdef PIC
-#define JUMPTARGET(name) name##@PLT
+# ifdef BIND_NOW
+# define JUMPTARGET(name) *name##@GOTPCREL(%rip)
+# else
+# define JUMPTARGET(name) name##@PLT
+# endif
#else
-#define JUMPTARGET(name) name
+# define JUMPTARGET(name) name
#endif
/* Local label name for asm code. */