This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Avoid an extra branch to PLT for -z now


On Wed, May 4, 2016 at 11:17 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> 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
>
> Tested on x86-64.  OK for master?
>
> H.J.
> ---
>         * config.h.in (BIND_NOW): New.
>         * configure.ac (BIND_NOW): New.  Defined for --enable-bind-now.
>         * configure: Regenerated.
>         * sysdeps/x86_64/sysdep.h (JUMPTARGET): Defined to indirect
>         branch via the GOT slot.
> ---
>  config.h.in             | 3 +++
>  configure               | 4 ++++
>  configure.ac            | 3 +++
>  sysdeps/x86_64/sysdep.h | 8 ++++++--
>  4 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/config.h.in b/config.h.in
> index 0147ba3..2c902b0 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 8fe5937..19a4829 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 3c766b7..123f0d2 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 fbe3560..75ac747 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. */
> --
> 2.5.5
>

Any objections?

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]