From patchwork Tue Aug 8 21:57:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 22002 Received: (qmail 82146 invoked by alias); 8 Aug 2017 21:57:58 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 82115 invoked by uid 89); 8 Aug 2017 21:57:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy= X-HELO: mail-oi0-f46.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=KN3wlAKKUqs/xTByMkjkpuF2JyPUw3qRH98e0dsAD/Y=; b=FZ7qaTSJxXr8IRsB66jRyOfyNXCA3DuDaob8qIWTWSF4rtULwqHWSd1M7W3YfLhUl0 jB83asTQsu+AQ/ph8pV4z62Bqceg5kHDNV+edxlMW8lGIroqcM6UBHT1466gNdUB0Ib5 31qvcTatiGt4HuBbtNMkcojEqtZDpnaJEDlggSgCs17ebX/NL+V2WmRUG6lc7oooDr3H J256oM4Mg/54YWCGVZ0QloVgjmcEce+K6/6rbpwe7HXiWSQ/N393357pk1jLDu0Rzysp 5MlyZGUJxHotjHUhJiM20//toGLsg3fNGxi9iWDG9iU+qrM2jX53gyYkZrblUTf9b6Cz IivA== X-Gm-Message-State: AHYfb5jbhoYCHYlD407Ejw51vgTAh6Ifpkw9PenKgBydP8dFpFCmQJ+j KevDZFyH9IRWnQfaJNVQQNgw1RpS5Q== X-Received: by 10.202.74.68 with SMTP id x65mr5509898oia.301.1502229468389; Tue, 08 Aug 2017 14:57:48 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <20170808182536.GA24765@gmail.com> From: "H.J. Lu" Date: Tue, 8 Aug 2017 14:57:47 -0700 Message-ID: Subject: Re: [PATCH] Add private_function for private functions within glibc [BZ #21598] To: Joseph Myers Cc: GNU C Library On Tue, Aug 8, 2017 at 2:27 PM, H.J. Lu wrote: > On Tue, Aug 8, 2017 at 2:12 PM, Joseph Myers wrote: >> On Tue, 8 Aug 2017, H.J. Lu wrote: >> >>> since shadow stack doesn't match return stack. We need to use register >>> indirect branch via %ecx. That means only 2 parameters can be passed >>> in registers for external function calls with lazy binding when shadow >>> stack is enabled. However, internal_function, which should be used only >>> with hidden function within libc.so, are also used with private function >>> calls between different shared objects of glibc. >> >> Should we consider it part of the ABI that users' shared objects, not just >> glibc ones, may export functions with regparm calling convention? It's >> certainly possible at present, but I don't know how widely used it is. > > Some libraries do that: > > https://sourceware.org/ml/libc-alpha/2017-06/msg01091.html > > We have a similar issue on x86-64: > > https://sourceware.org/bugzilla/show_bug.cgi?id=21265 > > CET enabled compiler should disallow __attribute__((regparm(3))) on > i386. When CET is disabled, __attribute__((regparm(3))) is OK. > >>> This patch removes USE_REGPARMS from config.h.in. Instead, it defines >>> internal_function and private_function, which is for private function >>> calss between different shared objects, in config.h.in. Currently, >>> sysdeps/i386/configure.ac defines private_function as >> >> I'd expect these definitions to go in a sysdeps header (for which i386 has >> a version overriding the default version), as suggested in >> , rather than >> being defined directly from a configure.ac file. > > I will do that. > > Thanks. > Here is the updated patch. Tested on i686 and x86-64. Any more comments? Thanks. From bde5afecfe6294d1a081d017f3ed05711aad5e3d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 16 Jun 2017 14:27:02 -0700 Subject: [PATCH] Add private_function for private functions within glibc [BZ #21598] USE_REGPARMS in config.h.in is only used to control how parameters are passed for internal functions on i386. On i386, we define #define internal_function __attribute__ ((regparm (3), stdcall)) so that we pass up to 3 integer parameters in registers for internal functuons on i386. i386 has _dl_runtime_resolve: movl (%esp), %ecx movl %eax, (%esp) # Store the function address. movl 4(%esp), %eax ret $12 # Jump to function address. which is incompatible with Shadow Stack in Intel Control-flow Enforcement Technology (CET) instructions: https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf since shadow stack doesn't match return stack. We need to use register indirect branch via %ecx. That means only 2 parameters can be passed in registers for external function calls with lazy binding when shadow stack is enabled. However, internal_function, which should be used only with hidden function within libc.so, are also used with private function calls between different shared objects of glibc. This patch removes USE_REGPARMS and internal_function from config.h.in. It adds a new header file, function-attrs.h, to define internal_function and private_function, which is for private function calls between different shared objects. Currently, sysdeps/i386/function-attrs.h defines private_function as #define private_function __attribute__ ((regparm (3), stdcall)) There is no change in shared objects on Linux/i686 nor Linux/x86_64. When shadow stack is enabled, private_function will be defined as #define private_function __attribute__ ((regparm (2), stdcall)) so that %ecx can be used as scratch register by _dl_runtime_resolve. [BZ #21598] * config.h.in (USE_REGPARMS): Removed. (internal_function): Likewise. * debug/fortify_fail.c (__fortify_fail): Replace internal_function with private_function. * elf/dl-addr.c (_dl_addr): Likewise. * elf/dl-error-skeleton.c (_dl_signal_error): Likewise. (_dl_catch_error): Likewise. * elf/dl-execstack.c (_dl_make_stack_executable): Likewise. * elf/dl-load.c (_dl_rtld_di_serinfo): Likewise. * elf/dl-open.c (_dl_find_dso_for_object): Likewise. * elf/dl-support.c (_dl_make_stack_executable_hook): Likewise. * elf/dl-sym.c (_dl_vsym): Likewise. (_dl_sym): Likewise. * elf/dl-tls.c (_dl_get_tls_static_info): Likewise. (_dl_allocate_tls_init): Likewise. (_dl_allocate_tls): Likewise. (_dl_deallocate_tls): Likewise. * grp/grp-merge.c (__copy_grp): Likewise. (__merge_grp): Likewise. * grp/grp-merge.h (__copy_grp): Likewise. (__merge_grp): Likewise. * include/dlfcn.h (_dl_addr): Likewise. (_dl_sym): Likewise. (_dl_vsym): Likewise. * include/rpc/pmap_clnt.h (__libc_rpc_getport): Likewise. * include/stdio.h (__fortify_fail): Likewise. * include/stdlib.h (__strtof_nan): Likewise. (__strtod_nan): Likewise. (__strtold_nan): Likewise. (__wcstof_nan): Likewise. (__wcstod_nan): Likewise. (__wcstold_nan): Likewise. (__strtof128_nan): Likewise. (__wcstof128_nan): Likewise. * inet/inet6_scopeid_pton.c (__inet6_scopeid_pton): Likewise. * inet/net-internal.h (__inet6_scopeid_pton): Likewise. * nptl/allocatestack.c (__make_stacks_executable): Likewise. * nptl/libc_pthread_init.c (__libc_pthread_init): Likewise. * nptl/pthreadP.h (__make_stacks_executable): Likewise. (__libc_pthread_init): Likewise. * nss/XXX-lookup.c (DB_LOOKUP_FCT): Likewise. (DB_COMPAT_FCT): Likewise. * nss/getXXbyYY_r.c (DB_LOOKUP_FCT): Likewise. * nss/getXXent_r.c (DB_LOOKUP_FCT): Likewise. * nss/nsswitch.h (db_lookup_function): Likewise. * resolv/gai_misc.h (__gai_sigqueue): Likewise. * resolv/gai_sigqueue.c (__gai_sigqueue): Likewise. * stdlib/strtod_nan_main.c (STRTOD_NAN): Likewise. * sunrpc/pm_getport.c (__libc_rpc_getport): Likewise. * sysdeps/generic/ldsodefs.h (_dl_make_stack_executable_hook): Likewise. (_dl_make_stack_executable): Likewise. (_dl_signal_error): Likewise. (_dl_catch_error): Likewise. (_dl_rtld_di_serinfo): Likewise. (_dl_allocate_tls): Likewise. (_dl_get_tls_static_info): Likewise. (_dl_allocate_tls_init): Likewise. (_dl_deallocate_tls): Likewise. (_dl_find_dso_for_object): Likewise. * sysdeps/unix/sysv/linux/dl-execstack.c (_dl_make_stack_executable): Likewise. * sysdeps/unix/sysv/linux/gai_sigqueue.c (__gai_sigqueue): Likewise. * sysdeps/unix/sysv/linux/netlink_assert_response.c (__netlink_assert_response): Likewise. * sysdeps/unix/sysv/linux/netlinkaccess.h (__netlink_assert_response): Likewise. * include/libc-symbols.h (internal_function): Removed. Include . * sysdeps/i386/configure.ac (USE_REGPARMS): Removed. * sysdeps/i386/configure: Regenerated. --- config.h.in | 11 -------- debug/fortify_fail.c | 2 +- elf/dl-addr.c | 2 +- elf/dl-error-skeleton.c | 4 +-- elf/dl-execstack.c | 2 +- elf/dl-load.c | 2 +- elf/dl-open.c | 2 +- elf/dl-support.c | 2 +- elf/dl-sym.c | 4 +-- elf/dl-tls.c | 8 +++--- grp/grp-merge.c | 4 +-- grp/grp-merge.h | 4 +-- include/dlfcn.h | 6 ++--- include/libc-symbols.h | 7 +---- include/rpc/pmap_clnt.h | 2 +- include/stdio.h | 2 +- include/stdlib.h | 18 +++++++------ inet/inet6_scopeid_pton.c | 2 +- inet/net-internal.h | 2 +- nptl/allocatestack.c | 2 +- nptl/libc_pthread_init.c | 2 +- nptl/pthreadP.h | 6 ++--- nss/XXX-lookup.c | 6 ++--- nss/getXXbyYY_r.c | 2 +- nss/getXXent_r.c | 2 +- nss/nsswitch.h | 2 +- resolv/gai_misc.h | 2 +- resolv/gai_sigqueue.c | 2 +- stdlib/strtod_nan_main.c | 2 +- sunrpc/pm_getport.c | 2 +- sysdeps/generic/function-attrs.h | 24 +++++++++++++++++ sysdeps/generic/ldsodefs.h | 20 +++++++------- sysdeps/i386/configure | 5 +--- sysdeps/i386/configure.ac | 2 -- sysdeps/i386/function-attrs.h | 32 +++++++++++++++++++++++ sysdeps/unix/sysv/linux/dl-execstack.c | 2 +- sysdeps/unix/sysv/linux/gai_sigqueue.c | 2 +- sysdeps/unix/sysv/linux/netlink_assert_response.c | 2 +- sysdeps/unix/sysv/linux/netlinkaccess.h | 2 +- 39 files changed, 122 insertions(+), 85 deletions(-) create mode 100644 sysdeps/generic/function-attrs.h create mode 100644 sysdeps/i386/function-attrs.h diff --git a/config.h.in b/config.h.in index 22418576a0..31343ab8df 100644 --- a/config.h.in +++ b/config.h.in @@ -47,10 +47,6 @@ #undef STACK_PROTECTOR_LEVEL #endif -/* Define if the regparm attribute shall be used for local functions - (gcc on ix86 only). */ -#undef USE_REGPARMS - /* Defined on SPARC if GCC emits GOTDATA relocations. */ #undef HAVE_GCC_GOTDATA @@ -99,13 +95,6 @@ /* AArch64 big endian ABI */ #undef HAVE_AARCH64_BE - -/* Defined to some form of __attribute__ ((...)) if the compiler supports - a different, more efficient calling convention. */ -#if defined USE_REGPARMS && !defined PROF -# define internal_function __attribute__ ((regparm (3), stdcall)) -#endif - /* Linux specific: minimum supported kernel version. */ #undef __LINUX_KERNEL_VERSION diff --git a/debug/fortify_fail.c b/debug/fortify_fail.c index a0777ae570..0987269bf8 100644 --- a/debug/fortify_fail.c +++ b/debug/fortify_fail.c @@ -38,7 +38,7 @@ __fortify_fail_abort (_Bool need_backtrace, const char *msg) } void -__attribute__ ((noreturn)) internal_function +__attribute__ ((noreturn)) private_function __fortify_fail (const char *msg) { __fortify_fail_abort (true, msg); diff --git a/elf/dl-addr.c b/elf/dl-addr.c index 1fac63d1a9..edd42be629 100644 --- a/elf/dl-addr.c +++ b/elf/dl-addr.c @@ -121,7 +121,7 @@ determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, int -internal_function +private_function _dl_addr (const void *address, Dl_info *info, struct link_map **mapp, const ElfW(Sym) **symbolp) { diff --git a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c index 8e5888d4bd..7d4ad30d1c 100644 --- a/elf/dl-error-skeleton.c +++ b/elf/dl-error-skeleton.c @@ -77,7 +77,7 @@ static receiver_fct receiver; #endif /* DL_ERROR_BOOTSTRAP */ void -internal_function +private_function _dl_signal_error (int errcode, const char *objname, const char *occation, const char *errstring) { @@ -169,7 +169,7 @@ _dl_signal_cerror (int errcode, const char *objname, const char *occation, int -internal_function +private_function _dl_catch_error (const char **objname, const char **errstring, bool *mallocedp, void (*operate) (void *), void *args) { diff --git a/elf/dl-execstack.c b/elf/dl-execstack.c index 875338bea5..c83de345a1 100644 --- a/elf/dl-execstack.c +++ b/elf/dl-execstack.c @@ -23,7 +23,7 @@ so as to mprotect it. */ int -internal_function +private_function _dl_make_stack_executable (void **stack_endp) { return ENOSYS; diff --git a/elf/dl-load.c b/elf/dl-load.c index c1b6d4ba0f..14cf164bd2 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -2241,7 +2241,7 @@ add_path (struct add_path_state *p, const struct r_search_path_struct *sps, } void -internal_function +private_function _dl_rtld_di_serinfo (struct link_map *loader, Dl_serinfo *si, bool counting) { if (counting) diff --git a/elf/dl-open.c b/elf/dl-open.c index cec54db413..865a3ef2ba 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -162,7 +162,7 @@ add_to_global (struct link_map *new) address ADDR. Returns the pointer to the link map of the matching DSO, or NULL if a match is not found. */ struct link_map * -internal_function +private_function _dl_find_dso_for_object (const ElfW(Addr) addr) { struct link_map *l; diff --git a/elf/dl-support.c b/elf/dl-support.c index c22be854f4..b98cc4e9df 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -181,7 +181,7 @@ ElfW(Word) _dl_stack_flags = DEFAULT_STACK_PERMS; /* If loading a shared object requires that we make the stack executable when it was not, we do it by calling this function. It returns an errno code or zero on success. */ -int (*_dl_make_stack_executable_hook) (void **) internal_function +int (*_dl_make_stack_executable_hook) (void **) private_function = _dl_make_stack_executable; diff --git a/elf/dl-sym.c b/elf/dl-sym.c index 7cd6e97643..0ad270d182 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -250,7 +250,7 @@ RTLD_NEXT used in code not dynamically loaded")); void * -internal_function +private_function _dl_vsym (void *handle, const char *name, const char *version, void *who) { struct r_found_version vers; @@ -267,7 +267,7 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who) void * -internal_function +private_function _dl_sym (void *handle, const char *name, void *who) { return do_sym (handle, name, who, NULL, DL_LOOKUP_RETURN_NEWEST); diff --git a/elf/dl-tls.c b/elf/dl-tls.c index 5aba33b3fa..49af79d254 100644 --- a/elf/dl-tls.c +++ b/elf/dl-tls.c @@ -308,7 +308,7 @@ allocate_dtv (void *result) /* Get size and alignment requirements of the static TLS block. */ void -internal_function +private_function _dl_get_tls_static_info (size_t *sizep, size_t *alignp) { *sizep = GL(dl_tls_static_size); @@ -439,7 +439,7 @@ _dl_resize_dtv (dtv_t *dtv) void * -internal_function +private_function _dl_allocate_tls_init (void *result) { if (result == NULL) @@ -532,7 +532,7 @@ _dl_allocate_tls_init (void *result) rtld_hidden_def (_dl_allocate_tls_init) void * -internal_function +private_function _dl_allocate_tls (void *mem) { return _dl_allocate_tls_init (mem == NULL @@ -543,7 +543,7 @@ rtld_hidden_def (_dl_allocate_tls) void -internal_function +private_function _dl_deallocate_tls (void *tcb, bool dealloc_tcb) { dtv_t *dtv = GET_DTV (tcb); diff --git a/grp/grp-merge.c b/grp/grp-merge.c index 035e7a604b..1cd7774694 100644 --- a/grp/grp-merge.c +++ b/grp/grp-merge.c @@ -36,7 +36,7 @@ }) int -internal_function +private_function __copy_grp (const struct group srcgrp, const size_t buflen, struct group *destgrp, char *destbuf, char **endptr) { @@ -117,7 +117,7 @@ libc_hidden_def (__copy_grp) /* Check that the name, GID and passwd fields match, then copy in the gr_mem array. */ int -internal_function +private_function __merge_grp (struct group *savedgrp, char *savedbuf, char *savedend, size_t buflen, struct group *mergegrp, char *mergebuf) { diff --git a/grp/grp-merge.h b/grp/grp-merge.h index 1ad9b9a539..180beff55b 100644 --- a/grp/grp-merge.h +++ b/grp/grp-merge.h @@ -26,12 +26,12 @@ int __copy_grp (const struct group srcgrp, const size_t buflen, struct group *destgrp, char *destbuf, char **endptr) - internal_function; + private_function; /* Merge the member lists of two grp structs together. */ int __merge_grp (struct group *savedgrp, char *savedbuf, char *savedend, size_t buflen, struct group *mergegrp, char *mergebuf) - internal_function; + private_function; #endif /* _GRP_MERGE_H */ diff --git a/include/dlfcn.h b/include/dlfcn.h index 2524292ebc..8fcd1727d5 100644 --- a/include/dlfcn.h +++ b/include/dlfcn.h @@ -44,7 +44,7 @@ libc_hidden_proto (__libc_dlclose) #ifdef ElfW extern int _dl_addr (const void *address, Dl_info *info, struct link_map **mapp, const ElfW(Sym) **symbolp) - internal_function; + private_function; libc_hidden_proto (_dl_addr) #endif @@ -61,7 +61,7 @@ extern void _dl_close_worker (struct link_map *map, bool force) RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns the symbol value, which may be NULL. */ extern void *_dl_sym (void *handle, const char *name, void *who) - internal_function; + private_function; /* Look up version VERSION of symbol NAME in shared object HANDLE (which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling @@ -69,7 +69,7 @@ extern void *_dl_sym (void *handle, const char *name, void *who) NULL. */ extern void *_dl_vsym (void *handle, const char *name, const char *version, void *who) - internal_function; + private_function; /* Helper function for functions. Runs the OPERATE function via _dl_catch_error. Returns zero for success, nonzero for failure; and diff --git a/include/libc-symbols.h b/include/libc-symbols.h index fe3ab81c51..c539b3443e 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -195,12 +195,7 @@ #endif /* __ASSEMBLER__ */ -/* On some platforms we can make internal function calls (i.e., calls of - functions not exported) a bit faster by using a different calling - convention. */ -#ifndef internal_function -# define internal_function /* empty */ -#endif +#include /* Determine the return address. */ #define RETURN_ADDRESS(nr) \ diff --git a/include/rpc/pmap_clnt.h b/include/rpc/pmap_clnt.h index ec907c28cc..6a60d4442f 100644 --- a/include/rpc/pmap_clnt.h +++ b/include/rpc/pmap_clnt.h @@ -13,7 +13,7 @@ extern int __get_socket (struct sockaddr_in *saddr) extern u_short __libc_rpc_getport (struct sockaddr_in *address, u_long program, u_long version, u_int protocol, time_t timeout_sec, time_t tottimeout_sec) - internal_function; + private_function; libc_hidden_proto (__libc_rpc_getport) libc_hidden_proto (clnt_broadcast) diff --git a/include/stdio.h b/include/stdio.h index 215f919990..e02d56ddbf 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -99,7 +99,7 @@ extern void __libc_fatal (const char *__message) extern void __libc_message (enum __libc_message_action action, const char *__fnt, ...); extern void __fortify_fail (const char *msg) - __attribute__ ((__noreturn__)) internal_function; + __attribute__ ((__noreturn__)) private_function; extern void __fortify_fail_abort (_Bool, const char *msg) __attribute__ ((__noreturn__)) internal_function; libc_hidden_proto (__fortify_fail) diff --git a/include/stdlib.h b/include/stdlib.h index 6fd868828b..670134b1f5 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -201,16 +201,18 @@ libc_hidden_proto (strtoll) libc_hidden_proto (strtoul) libc_hidden_proto (strtoull) -extern float __strtof_nan (const char *, char **, char) internal_function; -extern double __strtod_nan (const char *, char **, char) internal_function; +extern float __strtof_nan (const char *, char **, char) + private_function; +extern double __strtod_nan (const char *, char **, char) + private_function; extern long double __strtold_nan (const char *, char **, char) - internal_function; + private_function; extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t) - internal_function; + private_function; extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t) - internal_function; + private_function; extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t) - internal_function; + private_function; libc_hidden_proto (__strtof_nan) libc_hidden_proto (__strtod_nan) @@ -229,9 +231,9 @@ libc_hidden_proto (__strtof128_l) libc_hidden_proto (strtof128) extern _Float128 __strtof128_nan (const char *, char **, char) - internal_function; + private_function; extern _Float128 __wcstof128_nan (const wchar_t *, wchar_t **, wchar_t) - internal_function; + private_function; libc_hidden_proto (__strtof128_nan) libc_hidden_proto (__wcstof128_nan) diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c index e09b1cb34d..004cab219d 100644 --- a/inet/inet6_scopeid_pton.c +++ b/inet/inet6_scopeid_pton.c @@ -28,7 +28,7 @@ /* Parse SOURCE as a scope ID for ADDRESS. Return 0 on success and -1 on error. */ -internal_function int +private_function int __inet6_scopeid_pton (const struct in6_addr *address, const char *scope, uint32_t *result) { diff --git a/inet/net-internal.h b/inet/net-internal.h index 2b2632c7ba..501c2112e6 100644 --- a/inet/net-internal.h +++ b/inet/net-internal.h @@ -26,7 +26,7 @@ int __inet6_scopeid_pton (const struct in6_addr *address, const char *scope, uint32_t *result) - internal_function attribute_hidden; + private_function attribute_hidden; libc_hidden_proto (__inet6_scopeid_pton) diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index ce2e24af95..e81008f358 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -784,7 +784,7 @@ __deallocate_stack (struct pthread *pd) int -internal_function +private_function __make_stacks_executable (void **stack_endp) { /* First the main thread's stack. */ diff --git a/nptl/libc_pthread_init.c b/nptl/libc_pthread_init.c index 0db7a10893..5c00161e26 100644 --- a/nptl/libc_pthread_init.c +++ b/nptl/libc_pthread_init.c @@ -38,7 +38,7 @@ extern int __libc_multiple_threads attribute_hidden; int * #endif -internal_function +private_function __libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void), const struct pthread_functions *functions) { diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 6e7d6ff09e..3e376494f8 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -357,7 +357,7 @@ extern void __reclaim_stacks (void) attribute_hidden; /* Make all threads's stacks executable. */ extern int __make_stacks_executable (void **stack_endp) - internal_function attribute_hidden; + private_function attribute_hidden; /* longjmp handling. */ extern void __pthread_cleanup_upto (__jmp_buf target, char *targetframe); @@ -388,12 +388,12 @@ hidden_proto (__nptl_death_event) extern void __libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void), const struct pthread_functions *functions) - internal_function; + private_function; #else extern int *__libc_pthread_init (unsigned long int *ptr, void (*reclaim) (void), const struct pthread_functions *functions) - internal_function; + private_function; /* Variable set to a nonzero value either if more than one thread runs or ran, or if a single-threaded process is trying to cancel itself. See diff --git a/nss/XXX-lookup.c b/nss/XXX-lookup.c index 5a37fdae08..84c3f525f9 100644 --- a/nss/XXX-lookup.c +++ b/nss/XXX-lookup.c @@ -57,11 +57,11 @@ service_user *DATABASE_NAME_SYMBOL attribute_hidden; extern int DB_LOOKUP_FCT (service_user **ni, const char *fct_name, const char *fct2_name, void **fctp) - internal_function; + private_function; libc_hidden_proto (DB_LOOKUP_FCT) int -internal_function +private_function DB_LOOKUP_FCT (service_user **ni, const char *fct_name, const char *fct2_name, void **fctp) { @@ -79,7 +79,7 @@ libc_hidden_def (DB_LOOKUP_FCT) #ifndef NO_COMPAT int -internal_function attribute_compat_text_section +private_function attribute_compat_text_section DB_COMPAT_FCT (service_user **ni, const char *fct_name, void **fctp) { return DB_LOOKUP_FCT (ni, fct_name, NULL, fctp); diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 6c547ea1ca..4aa95a2bcb 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -181,7 +181,7 @@ typedef enum nss_status (*lookup_function) (ADD_PARAMS, LOOKUP_TYPE *, char *, /* The lookup function for the first entry of this service. */ extern int DB_LOOKUP_FCT (service_user **nip, const char *name, const char *name2, void **fctp) - internal_function; + private_function; libc_hidden_proto (DB_LOOKUP_FCT) diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index 2710c1cd51..9066d47e20 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -114,7 +114,7 @@ __libc_lock_define_initialized (static, lock) /* The lookup function for the first entry of this service. */ extern int DB_LOOKUP_FCT (service_user **nip, const char *name, const char *name2, void **fctp) - internal_function; + private_function; libc_hidden_proto (DB_LOOKUP_FCT) void diff --git a/nss/nsswitch.h b/nss/nsswitch.h index bd3fbcb082..b5e7ca14c7 100644 --- a/nss/nsswitch.h +++ b/nss/nsswitch.h @@ -169,7 +169,7 @@ extern void __nss_disable_nscd (void (*) (size_t, struct traced_file *)); typedef int (*db_lookup_function) (service_user **, const char *, const char *, void **) - internal_function; + private_function; typedef enum nss_status (*setent_function) (int); typedef enum nss_status (*endent_function) (void); typedef enum nss_status (*getent_function) (void *, char *, size_t, diff --git a/resolv/gai_misc.h b/resolv/gai_misc.h index 6679d2b7d5..6f686c0bc7 100644 --- a/resolv/gai_misc.h +++ b/resolv/gai_misc.h @@ -96,6 +96,6 @@ extern int __gai_notify_only (struct sigevent *sigev, pid_t caller_pid) /* Send the signal. */ extern int __gai_sigqueue (int sig, const union sigval val, pid_t caller_pid) - internal_function; + private_function; #endif /* gai_misc.h */ diff --git a/resolv/gai_sigqueue.c b/resolv/gai_sigqueue.c index ebc1e5ed46..ddec42c743 100644 --- a/resolv/gai_sigqueue.c +++ b/resolv/gai_sigqueue.c @@ -22,7 +22,7 @@ #include int -internal_function +private_function __gai_sigqueue (int sig, const union sigval val, pid_t caller_pid) { __set_errno (ENOSYS); diff --git a/stdlib/strtod_nan_main.c b/stdlib/strtod_nan_main.c index 96b788cb1e..f002abeb5d 100644 --- a/stdlib/strtod_nan_main.c +++ b/stdlib/strtod_nan_main.c @@ -29,7 +29,7 @@ return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point to the character after the initial n-char-sequence. */ -internal_function +private_function FLOAT STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) { diff --git a/sunrpc/pm_getport.c b/sunrpc/pm_getport.c index 54d2e439d2..0883abc663 100644 --- a/sunrpc/pm_getport.c +++ b/sunrpc/pm_getport.c @@ -82,7 +82,7 @@ __get_socket (struct sockaddr_in *saddr) * Returns 0 if no map exists. */ u_short -internal_function +private_function __libc_rpc_getport (struct sockaddr_in *address, u_long program, u_long version, u_int protocol, time_t timeout_sec, time_t tottimeout_sec) diff --git a/sysdeps/generic/function-attrs.h b/sysdeps/generic/function-attrs.h new file mode 100644 index 0000000000..979f0bf014 --- /dev/null +++ b/sysdeps/generic/function-attrs.h @@ -0,0 +1,24 @@ +/* Define internal_function and private_function. Generic version. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* On some platforms we can make internal function calls (i.e., calls of + functions within the same shared object) or private function calls + (i.e., calls of functions between different shared objects of glibc) + a bit faster by using a different calling convention. */ +#define internal_function /* empty */ +#define private_function /* empty */ diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 4508365871..3c7ebd1e16 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -377,7 +377,7 @@ struct rtld_global /* If loading a shared object requires that we make the stack executable when it was not, we do it by calling this function. It returns an errno code or zero on success. */ - EXTERN int (*_dl_make_stack_executable_hook) (void **) internal_function; + EXTERN int (*_dl_make_stack_executable_hook) (void **) private_function; /* Prevailing state of the stack, PF_X indicating it's executable. */ EXTERN ElfW(Word) _dl_stack_flags; @@ -632,7 +632,7 @@ extern size_t _dl_phnum; /* This is the initial value of GL(dl_make_stack_executable_hook). A threads library can change it. */ -extern int _dl_make_stack_executable (void **stack_endp) internal_function; +extern int _dl_make_stack_executable (void **stack_endp) private_function; rtld_hidden_proto (_dl_make_stack_executable) /* Variable pointing to the end of the stack (or close to it). This value @@ -739,7 +739,7 @@ _dl_dprintf (int fd, const char *fmt, ...) problem. */ extern void _dl_signal_error (int errcode, const char *object, const char *occurred, const char *errstring) - internal_function __attribute__ ((__noreturn__)); + private_function __attribute__ ((__noreturn__)); libc_hidden_proto (_dl_signal_error) /* Like _dl_signal_error, but may return when called in the context of @@ -779,7 +779,7 @@ extern void _dl_receive_error (receiver_fct fct, void (*operate) (void *), extern int _dl_catch_error (const char **objname, const char **errstring, bool *mallocedp, void (*operate) (void *), void *args) - internal_function; + private_function; libc_hidden_proto (_dl_catch_error) /* Open the shared object NAME and map in its segments. @@ -813,7 +813,7 @@ extern void _dl_setup_hash (struct link_map *map) bytes to be used in filling in the result. */ extern void _dl_rtld_di_serinfo (struct link_map *loader, Dl_serinfo *si, bool counting) - internal_function; + private_function; /* Search loaded objects' symbol tables for a definition of the symbol @@ -1012,12 +1012,12 @@ void __pthread_initialize_minimal (void) weak_function; #endif /* Allocate memory for static TLS block (unless MEM is nonzero) and dtv. */ -extern void *_dl_allocate_tls (void *mem) internal_function; +extern void *_dl_allocate_tls (void *mem) private_function; rtld_hidden_proto (_dl_allocate_tls) /* Get size and alignment requirements of the static TLS block. */ extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp) - internal_function; + private_function; extern void _dl_allocate_static_tls (struct link_map *map) internal_function attribute_hidden; @@ -1026,11 +1026,11 @@ extern void _dl_allocate_static_tls (struct link_map *map) only used within rtld.c itself at startup time. */ extern void *_dl_allocate_tls_storage (void) internal_function attribute_hidden; -extern void *_dl_allocate_tls_init (void *) internal_function; +extern void *_dl_allocate_tls_init (void *) private_function; rtld_hidden_proto (_dl_allocate_tls_init) /* Deallocate memory allocated with _dl_allocate_tls. */ -extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) internal_function; +extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb) private_function; rtld_hidden_proto (_dl_deallocate_tls) extern void _dl_nothread_init_static_tls (struct link_map *) attribute_hidden; @@ -1081,7 +1081,7 @@ extern void _dl_show_scope (struct link_map *new, int from) attribute_hidden; extern struct link_map *_dl_find_dso_for_object (const ElfW(Addr) addr) - internal_function; + private_function; rtld_hidden_proto (_dl_find_dso_for_object) /* Initialization which is normally done by the dynamic linker. */ diff --git a/sysdeps/i386/configure b/sysdeps/i386/configure index 5b55c5affe..3dbc23a610 100644 --- a/sysdeps/i386/configure +++ b/sysdeps/i386/configure @@ -26,7 +26,7 @@ libc_compiler_builtin_inlined=no cat > conftest.c <&5' @@ -77,8 +77,5 @@ if test $libc_cv_asm_mpx = yes; then fi -$as_echo "#define USE_REGPARMS 1" >>confdefs.h - - $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h diff --git a/sysdeps/i386/configure.ac b/sysdeps/i386/configure.ac index 19ef33f34a..f7766ad2b8 100644 --- a/sysdeps/i386/configure.ac +++ b/sysdeps/i386/configure.ac @@ -45,8 +45,6 @@ if test $libc_cv_asm_mpx = yes; then AC_DEFINE(HAVE_MPX_SUPPORT) fi -AC_DEFINE(USE_REGPARMS) - dnl It is always possible to access static and hidden symbols in an dnl position independent way. AC_DEFINE(PI_STATIC_AND_HIDDEN) diff --git a/sysdeps/i386/function-attrs.h b/sysdeps/i386/function-attrs.h new file mode 100644 index 0000000000..708647bf9b --- /dev/null +++ b/sysdeps/i386/function-attrs.h @@ -0,0 +1,32 @@ +/* Define internal_function and private_function. i386 version. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* On i386, we can make internal function calls (i.e., calls of functions + within the same shared object) or private function calls (i.e., calls + of functions between different shared objects of glibc) a bit faster + by passing function parameters in registers. */ + +#ifdef PROF +/* The mcount code relies on a normal frame pointer being on the stack + to locate its caller. */ +# define internal_function /* empty */ +# define private_function /* empty */ +#else +# define internal_function __attribute__ ((regparm (3), stdcall)) +# define private_function __attribute__ ((regparm (3), stdcall)) +#endif diff --git a/sysdeps/unix/sysv/linux/dl-execstack.c b/sysdeps/unix/sysv/linux/dl-execstack.c index 3c4de1cb46..913af76a75 100644 --- a/sysdeps/unix/sysv/linux/dl-execstack.c +++ b/sysdeps/unix/sysv/linux/dl-execstack.c @@ -30,7 +30,7 @@ extern int __stack_prot attribute_relro attribute_hidden; int -internal_function +private_function _dl_make_stack_executable (void **stack_endp) { /* This gives us the highest/lowest page that needs to be changed. */ diff --git a/sysdeps/unix/sysv/linux/gai_sigqueue.c b/sysdeps/unix/sysv/linux/gai_sigqueue.c index 0f7b459b5e..04c8d5008a 100644 --- a/sysdeps/unix/sysv/linux/gai_sigqueue.c +++ b/sysdeps/unix/sysv/linux/gai_sigqueue.c @@ -30,7 +30,7 @@ /* Return any pending signal or wait for one for the given time. */ int -internal_function +private_function __gai_sigqueue (int sig, const union sigval val, pid_t caller_pid) { siginfo_t info; diff --git a/sysdeps/unix/sysv/linux/netlink_assert_response.c b/sysdeps/unix/sysv/linux/netlink_assert_response.c index d60eb1515e..963c879e71 100644 --- a/sysdeps/unix/sysv/linux/netlink_assert_response.c +++ b/sysdeps/unix/sysv/linux/netlink_assert_response.c @@ -39,7 +39,7 @@ get_address_family (int fd) } void -internal_function +private_function __netlink_assert_response (int fd, ssize_t result) { if (result < 0) diff --git a/sysdeps/unix/sysv/linux/netlinkaccess.h b/sysdeps/unix/sysv/linux/netlinkaccess.h index 6cffb65b14..bcbcc23abb 100644 --- a/sysdeps/unix/sysv/linux/netlinkaccess.h +++ b/sysdeps/unix/sysv/linux/netlinkaccess.h @@ -52,7 +52,7 @@ extern int __netlink_request (struct netlink_handle *h, int type); /* Terminate the process if RESULT is an invalid recvmsg result for the netlink socket FD. */ void __netlink_assert_response (int fd, ssize_t result) - internal_function; + private_function; libc_hidden_proto (__netlink_assert_response) #endif /* netlinkaccess.h */ -- 2.13.4