From: Samuel Thibault Date: Mon, 2 Oct 2017 23:26:58 +0000 (+0200) Subject: Introduce NO_RTLD_HIDDEN, make hurd use it instead of NO_HIDDEN X-Git-Tag: glibc-2.27~765 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3d1870fa3301c5cd00d5fdab0014c4e22b71fef2;p=thirdparty%2Fglibc.git Introduce NO_RTLD_HIDDEN, make hurd use it instead of NO_HIDDEN On the Hurd, the rtld needs to see its own dumb versions of a few functions (defined in sysdeps/mach/hurd/dl-sysdep.c) overridden by libc's versions once loaded. rtld should thus not have hidden attribute for these. To achieve this, the Hurd port used to just define NO_HIDDEN, which disables it completely. For now, this changes that to disabling it for all rtld functions, for simplicity. See Roland's comment on https://sourceware.org/bugzilla/show_bug.cgi?id=15605#c5 The ld.so numbers remain at 8 .rel.plt 000000c8 00000c24 00000c24 00000c24 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 9 .plt 000001a0 00000cf0 00000cf0 00000cf0 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 10 .plt.got 00000010 00000e90 00000e90 00000e90 2**3 CONTENTS, ALLOC, LOAD, READONLY, CODE 18 .got.plt 00000070 0002d000 0002d000 0002c000 2**2 CONTENTS, ALLOC, LOAD, DATA which is about 3 times as much as on Linux. The libc.so numbers get divided by 3 (the remainings are mostly RPC stub calls) * include/libc-symbols.h [NO_RTLD_HIDDEN] (rtld_hidden_proto, rtld_hidden_tls_proto, rtld_hidden_def, rtld_hidden_weak, rtld_hidden_rtld_hidden_ver, data_def, rtld_hidden_data_weak, rtld_hidden_data_ver): Define to empty. * include/assert.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__assert_fail, __assert_perror_fail): Likewise. * include/dirent.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__rewinddir): Likewise. * include/libc-internal.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__profile_frequency): Likewise. * include/setjmp.h (__sigsetjmp): Likewise. * include/signal.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__sigaction, __libc_sigaction): Likewise. * include/stdlib.h [NO_RTLD_HIDDEN] (unsetenv, __strtoul_internal): Do not set hidden attribute. * include/string.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__stpcpy, __strdup, __strerror_t, __strsep_g, memchr, memcmp, memcpy, memmove, memset, rawmemchr, stpcpy, strchr, strcmp, strlen, strnlen, strsep): Likewise. * include/sys/stat.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__fxstat, __fxstat64, __lxstat, __lxstat64, __xstat, __xstat64, __fxstatat64): Likewise. * include/sys/utsname.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__uname): Likewise. * include/sysdeps/generic/_itoa.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (_itoa_upper_digits, _itoa_lower_digits): Likewise. * sysdeps/mach/hurd/configure.ac (NO_HIDDEN): Do not set. (NO_RTLD_HIDDEN): Set. * sysdeps/mach/hurd/configure: Refresh. * config.h.in: Refresh. --- diff --git a/ChangeLog b/ChangeLog index a43569336dc..9cbff977ede 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2017-10-03 Samuel Thibault + + * include/libc-symbols.h [NO_RTLD_HIDDEN] (rtld_hidden_proto, + rtld_hidden_tls_proto, rtld_hidden_def, rtld_hidden_weak, + rtld_hidden_rtld_hidden_ver, data_def, rtld_hidden_data_weak, + rtld_hidden_data_ver): Define to empty. + * include/assert.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__assert_fail, + __assert_perror_fail): Likewise. + * include/dirent.h [IS_IN(rtld) && NO_RTLD_HIDDEN] + (__rewinddir): Likewise. + * include/libc-internal.h [IS_IN(rtld) && NO_RTLD_HIDDEN] + (__profile_frequency): Likewise. + * include/setjmp.h (__sigsetjmp): Likewise. + * include/signal.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__sigaction, + __libc_sigaction): Likewise. + * include/stdlib.h [NO_RTLD_HIDDEN] (unsetenv, __strtoul_internal): Do + not set hidden attribute. + * include/string.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__stpcpy, __strdup, + __strerror_t, __strsep_g, memchr, memcmp, memcpy, memmove, memset, + rawmemchr, stpcpy, strchr, strcmp, strlen, strnlen, strsep): Likewise. + * include/sys/stat.h [IS_IN(rtld) && NO_RTLD_HIDDEN] (__fxstat, + __fxstat64, __lxstat, __lxstat64, __xstat, __xstat64, + __fxstatat64): Likewise. + * include/sys/utsname.h [IS_IN(rtld) && NO_RTLD_HIDDEN] + (__uname): Likewise. + * include/sysdeps/generic/_itoa.h [IS_IN(rtld) && NO_RTLD_HIDDEN] + (_itoa_upper_digits, _itoa_lower_digits): Likewise. + * sysdeps/mach/hurd/configure.ac (NO_HIDDEN): Do not set. + (NO_RTLD_HIDDEN): Set. + * sysdeps/mach/hurd/configure: Refresh. + * config.h.in: Refresh. + 2017-10-02 Joseph Myers * sysdeps/ieee754/dbl-64/s_atan.c: Include . diff --git a/config.h.in b/config.h.in index 014fb4ea0ef..0d38476fa43 100644 --- a/config.h.in +++ b/config.h.in @@ -89,6 +89,10 @@ include/libc-symbols.h that avoid PLT slots in the shared objects. */ #undef NO_HIDDEN +/* Define this to disable in rtld the 'hidden_proto' et al macros in + include/libc-symbols.h that avoid PLT slots in the shared objects. */ +#undef NO_RTLD_HIDDEN + /* Define this to disable lazy relocations in DSOs. */ #undef BIND_NOW diff --git a/include/assert.h b/include/assert.h index c0f7e1a91c6..61cc8aa22ff 100644 --- a/include/assert.h +++ b/include/assert.h @@ -20,7 +20,7 @@ extern void __assert_fail_base (const char *fmt, const char *assertion, const char *function) __THROW __attribute__ ((__noreturn__)) attribute_hidden; -# if IS_IN (libc) || IS_IN (rtld) +# if IS_IN (libc) || (IS_IN (rtld) && !defined NO_RTLD_HIDDEN) hidden_proto (__assert_fail) hidden_proto (__assert_perror_fail) # endif diff --git a/include/dirent.h b/include/dirent.h index 6fcc2f391ba..caaeb0be85f 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -77,7 +77,7 @@ extern __typeof (scandirat) __scandirat; libc_hidden_proto (__scandirat) libc_hidden_proto (scandirat64) -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__rewinddir) __rewinddir attribute_hidden; # endif # endif diff --git a/include/libc-internal.h b/include/libc-internal.h index 7403c24e25c..69cd781aee5 100644 --- a/include/libc-internal.h +++ b/include/libc-internal.h @@ -49,7 +49,7 @@ extern void __libc_thread_freeres (void); /* Define and initialize `__progname' et. al. */ extern void __init_misc (int, char **, char **) attribute_hidden; -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__profile_frequency) __profile_frequency attribute_hidden; # endif diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 10fd2063b01..e0d4dc3170a 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -558,7 +558,7 @@ for linking") # define libc_hidden_data_ver(local, name) #endif -#if IS_IN (rtld) +#if IS_IN (rtld) && !defined NO_RTLD_HIDDEN # define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs) # define rtld_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs) # define rtld_hidden_def(name) hidden_def (name) diff --git a/include/setjmp.h b/include/setjmp.h index e45328b18a9..c234287515f 100644 --- a/include/setjmp.h +++ b/include/setjmp.h @@ -28,7 +28,7 @@ libc_hidden_proto (__libc_longjmp) libc_hidden_proto (_setjmp) libc_hidden_proto (__sigsetjmp) -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__sigsetjmp) __sigsetjmp attribute_hidden; # endif #endif diff --git a/include/signal.h b/include/signal.h index 7cbe64b8adf..293258ad65d 100644 --- a/include/signal.h +++ b/include/signal.h @@ -54,7 +54,7 @@ extern int __xpg_sigpause (int sig); /* Allocate real-time signal with highest/lowest available priority. */ extern int __libc_allocate_rtsig (int __high); -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__sigaction) __sigaction attribute_hidden; extern __typeof (__libc_sigaction) __libc_sigaction attribute_hidden; # endif diff --git a/include/stdlib.h b/include/stdlib.h index c0fcb957774..5974fb3d24b 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -294,7 +294,7 @@ struct abort_msg_s extern struct abort_msg_s *__abort_msg; libc_hidden_proto (__abort_msg) -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (unsetenv) unsetenv attribute_hidden; extern __typeof (__strtoul_internal) __strtoul_internal attribute_hidden; # endif diff --git a/include/string.h b/include/string.h index 968d6fea057..bb4922cbbe6 100644 --- a/include/string.h +++ b/include/string.h @@ -143,7 +143,7 @@ libc_hidden_builtin_proto (strspn) libc_hidden_builtin_proto (strstr) libc_hidden_builtin_proto (ffs) -#if IS_IN (rtld) +#if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__stpcpy) __stpcpy attribute_hidden; extern __typeof (__strdup) __strdup attribute_hidden; extern __typeof (__strerror_r) __strerror_r attribute_hidden; diff --git a/include/sys/stat.h b/include/sys/stat.h index eb447541857..b82d4527801 100644 --- a/include/sys/stat.h +++ b/include/sys/stat.h @@ -14,7 +14,7 @@ extern int __mkdir (const char *__path, __mode_t __mode); libc_hidden_proto (__mkdir) extern int __mknod (const char *__path, __mode_t __mode, __dev_t __dev); -#if IS_IN (libc) || IS_IN (rtld) +#if IS_IN (libc) || (IS_IN (rtld) && !defined NO_RTLD_HIDDEN) hidden_proto (__fxstat) hidden_proto (__fxstat64) hidden_proto (__lxstat) @@ -37,7 +37,7 @@ libc_hidden_proto (__xmknodat) libc_hidden_proto (__fxstatat) libc_hidden_proto (__fxstatat64) -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__fxstatat64) __fxstatat64 attribute_hidden; # endif diff --git a/include/sys/utsname.h b/include/sys/utsname.h index 14f4247dd41..9ed5fa25657 100644 --- a/include/sys/utsname.h +++ b/include/sys/utsname.h @@ -7,7 +7,7 @@ extern int __uname (struct utsname *__name); libc_hidden_proto (uname) libc_hidden_proto (__uname) -# if IS_IN (rtld) +# if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__uname) __uname attribute_hidden; # endif #endif diff --git a/sysdeps/generic/_itoa.h b/sysdeps/generic/_itoa.h index a065ecb8901..6998c0859f8 100644 --- a/sysdeps/generic/_itoa.h +++ b/sysdeps/generic/_itoa.h @@ -46,7 +46,7 @@ extern char *_itoa (unsigned long long int value, char *buflim, extern const char _itoa_upper_digits[]; extern const char _itoa_lower_digits[]; -#if IS_IN (libc) || IS_IN (rtld) +#if IS_IN (libc) || (IS_IN (rtld) && !defined NO_RTLD_HIDDEN) hidden_proto (_itoa_upper_digits) hidden_proto (_itoa_lower_digits) #endif diff --git a/sysdeps/mach/hurd/configure b/sysdeps/mach/hurd/configure index 163b5c77309..66cc0ce3a53 100644 --- a/sysdeps/mach/hurd/configure +++ b/sysdeps/mach/hurd/configure @@ -1,6 +1,6 @@ # This file is generated from configure.ac by Autoconf. DO NOT EDIT! -$as_echo "#define NO_HIDDEN 1" >>confdefs.h +$as_echo "#define NO_RTLD_HIDDEN 1" >>confdefs.h if test -n "$sysheaders"; then diff --git a/sysdeps/mach/hurd/configure.ac b/sysdeps/mach/hurd/configure.ac index 5539a8c8aff..774ffc80a96 100644 --- a/sysdeps/mach/hurd/configure.ac +++ b/sysdeps/mach/hurd/configure.ac @@ -3,7 +3,7 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. dnl We need this setting because of the need for PLT calls in ld.so. dnl See Roland's comment in dnl https://sourceware.org/bugzilla/show_bug.cgi?id=15605 -AC_DEFINE([NO_HIDDEN]) +AC_DEFINE([NO_RTLD_HIDDEN]) if test -n "$sysheaders"; then OLD_CPPFLAGS=$CPPFLAGS