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.
This commit is contained in:
H.J. Lu 2016-05-24 08:44:10 -07:00
parent 4c01126896
commit 6901def689
5 changed files with 24 additions and 2 deletions

View File

@ -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]

View File

@ -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

4
configure vendored
View File

@ -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 :

View File

@ -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.

View File

@ -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. */