This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch hjl/cet/pr21598 created. glibc-2.25-554-g95d0af7
- From: hjl at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 22 Jun 2017 16:25:05 -0000
- Subject: GNU C Library master sources branch hjl/cet/pr21598 created. glibc-2.25-554-g95d0af7
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, hjl/cet/pr21598 has been created
at 95d0af73bab77d760ee3934425d54b628babb58f (commit)
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=95d0af73bab77d760ee3934425d54b628babb58f
commit 95d0af73bab77d760ee3934425d54b628babb58f
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu Jun 22 08:51:42 2017 -0700
i386: Add _dl_runtime_resolve_shstk [BZ #21598]
Add a SHSTK compatible symbol resolver to support 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
[BZ #21598]
* sysdeps/i386/dl-machine.h (elf_machine_runtime_setup): Use
_dl_runtime_resolve_shstk if SHSTK is usable.
* sysdeps/i386/dl-trampoline.S (_dl_runtime_resolve_shstk): New.
* sysdeps/x86/cpu-features.h (bit_arch_IBT_Usable): New.
(bit_arch_SHSTK_Usable): Likewise.
(bit_cpu_SHSTK): Likewise.
(index_cpu_IBT): Likewise.
(index_cpu_SHSTK): Likewise.
(index_arch_IBT_Usable): Likewise.
(index_arch_SHSTK_Usable): Likewise.
(reg_IBT): Likewise.
(reg_SHSTK): Likewise.
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 9ee9d02..598608e 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -66,6 +66,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
{
Elf32_Addr *got;
extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
+ extern void _dl_runtime_resolve_shstk (Elf32_Word) attribute_hidden;
extern void _dl_runtime_profile (Elf32_Word) attribute_hidden;
if (l->l_info[DT_JMPREL] && lazy)
@@ -104,7 +105,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
else
/* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */
- got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+ got[2] = (HAS_ARCH_FEATURE (SHSTK_Usable)
+ ? (Elf32_Addr) &_dl_runtime_resolve_shstk
+ : (Elf32_Addr) &_dl_runtime_resolve);
}
return lazy;
diff --git a/sysdeps/i386/dl-trampoline.S b/sysdeps/i386/dl-trampoline.S
index 6e7f3ae..92029f7 100644
--- a/sysdeps/i386/dl-trampoline.S
+++ b/sysdeps/i386/dl-trampoline.S
@@ -50,6 +50,29 @@ _dl_runtime_resolve:
cfi_endproc
.size _dl_runtime_resolve, .-_dl_runtime_resolve
+# The SHSTK compatible version.
+ .text
+ .globl _dl_runtime_resolve_shstk
+ .type _dl_runtime_resolve_shstk, @function
+ cfi_startproc
+ .align 16
+_dl_runtime_resolve_shstk:
+ cfi_adjust_cfa_offset (8)
+ pushl %eax # Preserve registers otherwise clobbered.
+ cfi_adjust_cfa_offset (4)
+ pushl %edx
+ cfi_adjust_cfa_offset (4)
+ movl 12(%esp), %edx # Copy args pushed by PLT in register. Note
+ movl 8(%esp), %eax # that `fixup' takes its parameters in regs.
+ call _dl_fixup # Call resolver.
+ movl (%esp), %edx # Get register content back.
+ movl %eax, %ecx # Store the function address.
+ movl 4(%esp), %eax # Get register content back.
+ addl $16, %esp # Adjust stack: PLT1 + PLT2 + %eax + %edx
+ cfi_adjust_cfa_offset (-16)
+ jmp *%ecx # Jump to function address.
+ cfi_endproc
+ .size _dl_runtime_resolve_shstk, .-_dl_runtime_resolve_shstk
#ifndef PROF
.globl _dl_runtime_profile
diff --git a/sysdeps/x86/cpu-features.h b/sysdeps/x86/cpu-features.h
index 3ed67f5..d2a9929 100644
--- a/sysdeps/x86/cpu-features.h
+++ b/sysdeps/x86/cpu-features.h
@@ -40,6 +40,8 @@
#define bit_arch_Use_dl_runtime_resolve_opt (1 << 20)
#define bit_arch_Use_dl_runtime_resolve_slow (1 << 21)
#define bit_arch_Prefer_No_AVX512 (1 << 22)
+#define bit_arch_IBT_Usable (1 << 23)
+#define bit_arch_SHSTK_Usable (1 << 24)
/* CPUID Feature flags. */
@@ -74,6 +76,8 @@
#define bit_cpu_AVX512CD (1 << 28)
#define bit_cpu_AVX512BW (1 << 30)
#define bit_cpu_AVX512VL (1u << 31)
+#define bit_cpu_IBT (1u << 20)
+#define bit_cpu_SHSTK (1u << 7)
/* XCR0 Feature flags. */
#define bit_XMM_state (1 << 1)
@@ -103,6 +107,8 @@
# define index_cpu_AVX2 COMMON_CPUID_INDEX_7*CPUID_SIZE+CPUID_EBX_OFFSET
# define index_cpu_ERMS COMMON_CPUID_INDEX_7*CPUID_SIZE+CPUID_EBX_OFFSET
# define index_cpu_MOVBE COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET
+# define index_cpu_IBT COMMON_CPUID_INDEX_7*CPUID_SIZE+CPUID_EDX_OFFSET
+# define index_cpu_SHSTK COMMON_CPUID_INDEX_7*CPUID_SIZE+CPUID_ECX_OFFSET
# define index_arch_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE
# define index_arch_Fast_Copy_Backward FEATURE_INDEX_1*FEATURE_SIZE
@@ -126,6 +132,8 @@
# define index_arch_Use_dl_runtime_resolve_opt FEATURE_INDEX_1*FEATURE_SIZE
# define index_arch_Use_dl_runtime_resolve_slow FEATURE_INDEX_1*FEATURE_SIZE
# define index_arch_Prefer_No_AVX512 FEATURE_INDEX_1*FEATURE_SIZE
+# define index_arch_IBT_Usable FEATURE_INDEX_1*FEATURE_SIZE
+# define index_arch_SHSTK_Usable FEATURE_INDEX_1*FEATURE_SIZE
# if defined (_LIBC) && !IS_IN (nonlib)
@@ -277,6 +285,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define index_cpu_LZCNT COMMON_CPUID_INDEX_1
# define index_cpu_MOVBE COMMON_CPUID_INDEX_1
# define index_cpu_POPCNT COMMON_CPUID_INDEX_1
+# define index_cpu_IBT COMMON_CPUID_INDEX_7
+# define index_cpu_SHSTK COMMON_CPUID_INDEX_7
# define reg_CX8 edx
# define reg_CMOV edx
@@ -306,6 +316,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define reg_LZCNT ecx
# define reg_MOVBE ecx
# define reg_POPCNT ecx
+# define reg_IBT edx
+# define reg_SHSTK ecx
# define index_arch_Fast_Rep_String FEATURE_INDEX_1
# define index_arch_Fast_Copy_Backward FEATURE_INDEX_1
@@ -329,6 +341,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define index_arch_Use_dl_runtime_resolve_opt FEATURE_INDEX_1
# define index_arch_Use_dl_runtime_resolve_slow FEATURE_INDEX_1
# define index_arch_Prefer_No_AVX512 FEATURE_INDEX_1
+# define index_arch_IBT_Usable FEATURE_INDEX_1
+# define index_arch_SHSTK_Usable FEATURE_INDEX_1
#endif /* !__ASSEMBLER__ */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=0c008ce89d465761a5d6d03605dfea498f2490da
commit 0c008ce89d465761a5d6d03605dfea498f2490da
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Fri Jun 16 14:27:02 2017 -0700
Add private_function for private functions within glibc
i386 _dl_runtime_resolve:
movl (%esp), %ecx
movl %eax, (%esp) # Store the function address.
movl 4(%esp), %eax
ret $12 # Jump to function address.
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. However,
internal_function, which should be used only with hidden function, is
defined as
# define internal_function __attribute__ ((regparm (3), stdcall))
and used with private function calls between different shared objects of
glibc. We introduce private_function for such purpose:
# define private_function __attribute__ ((regparm (2), stdcall))
so that %ecx can be used by _dl_runtime_resolve as scratch register.
[BZ #21598]
* config.h.in (USE_REGPARMS): Removed.
(internal_function): Undef.
(private_function): New. Undef.
* 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.
* 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 (private_function): New.
* sysdeps/i386/configure.ac (USE_REGPARMS): Removed.
(internal_function): New AC_DEFINE.
(private_function): Likewise.
* sysdeps/i386/configure: Regenerated.
diff --git a/config.h.in b/config.h.in
index 2241857..989554a 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
@@ -101,9 +97,10 @@
/* 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))
+ a different, more efficient calling convention (gcc on ix86 only). */
+#ifndef PROF
+# undef internal_function
+# undef private_function
#endif
/* Linux specific: minimum supported kernel version. */
diff --git a/debug/fortify_fail.c b/debug/fortify_fail.c
index a31977a..c97e962 100644
--- a/debug/fortify_fail.c
+++ b/debug/fortify_fail.c
@@ -22,7 +22,7 @@
extern char **__libc_argv attribute_hidden;
void
-__attribute__ ((noreturn)) internal_function
+__attribute__ ((noreturn)) private_function
__fortify_fail (const char *msg)
{
/* The loop is added only to keep gcc happy. */
diff --git a/elf/dl-addr.c b/elf/dl-addr.c
index 1fac63d..edd42be 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 8e5888d..7d4ad30 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 875338b..c83de34 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 c1b6d4b..14cf164 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 cec54db..865a3ef 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 c22be85..b98cc4e 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 7cd6e97..0ad270d 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 5aba33b..49af79d 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 77c494d..9f1d14c 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)
{
@@ -109,7 +109,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 1ad9b9a..180beff 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 2524292..8fcd172 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 <dlfcn.h> 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 3310e3a..961cbd6 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -188,12 +188,17 @@
#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. */
+ 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. */
#ifndef internal_function
# define internal_function /* empty */
#endif
+#ifndef private_function
+# define private_function /* empty */
+#endif
+
/* Determine the return address. */
#define RETURN_ADDRESS(nr) \
__builtin_extract_return_addr (__builtin_return_address (nr))
diff --git a/include/rpc/pmap_clnt.h b/include/rpc/pmap_clnt.h
index ec907c2..6a60d44 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 f68f633..b7d1168 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -91,7 +91,7 @@ extern void __libc_fatal (const char *__message)
__attribute__ ((__noreturn__));
extern void __libc_message (int do_abort, const char *__fnt, ...);
extern void __fortify_fail (const char *msg)
- __attribute__ ((__noreturn__)) internal_function;
+ __attribute__ ((__noreturn__)) private_function;
libc_hidden_proto (__fortify_fail)
/* Acquire ownership of STREAM. */
diff --git a/include/stdlib.h b/include/stdlib.h
index 6fd8688..9833005 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)
diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c
index e09b1cb..004cab2 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 2b2632c..501c211 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 8364406..7f7a291 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -778,7 +778,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 0db7a10..5c00161 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 7fc1e50..0130e15 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 5a37fda..84c3f52 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 5962475..1f21b15 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -185,7 +185,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 2710c1c..9066d47 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 f3e756b..3ff3596 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 6679d2b..6f686c0 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 ebc1e5e..ddec42c 100644
--- a/resolv/gai_sigqueue.c
+++ b/resolv/gai_sigqueue.c
@@ -22,7 +22,7 @@
#include <gai_misc.h>
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 96b788c..f002abe 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 54d2e43..0883abc 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/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 4508365..3c7ebd1 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 5b55c5a..bd45aa6 100644
--- a/sysdeps/i386/configure
+++ b/sysdeps/i386/configure
@@ -26,7 +26,7 @@ libc_compiler_builtin_inlined=no
cat > conftest.c <<EOF
int _start (void) { int a, b, c; __sync_val_compare_and_swap (&a, b, c); return 0; }
EOF
-if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
+if ! { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
-O0 -nostdlib -nostartfiles
-S conftest.c -o - | fgrep "__sync_val_compare_and_swap"
1>&5'
@@ -77,7 +77,15 @@ if test $libc_cv_asm_mpx = yes; then
fi
-$as_echo "#define USE_REGPARMS 1" >>confdefs.h
+# 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. We can only pass 2
+# parameters in registers for private function calls since one register
+# is used by _dl_runtime_resolve as scratch register.
+$as_echo "#define internal_function __attribute__ ((regparm (3), stdcall))" >>confdefs.h
+
+$as_echo "#define private_function __attribute__ ((regparm (2), stdcall))" >>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 19ef33f..738935a 100644
--- a/sysdeps/i386/configure.ac
+++ b/sysdeps/i386/configure.ac
@@ -45,7 +45,14 @@ if test $libc_cv_asm_mpx = yes; then
AC_DEFINE(HAVE_MPX_SUPPORT)
fi
-AC_DEFINE(USE_REGPARMS)
+# 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. We can only pass 2
+# parameters in registers for private function calls since one register
+# is used by _dl_runtime_resolve as scratch register.
+AC_DEFINE(internal_function, __attribute__ ((regparm (3), stdcall)))
+AC_DEFINE(private_function, __attribute__ ((regparm (2), stdcall)))
dnl It is always possible to access static and hidden symbols in an
dnl position independent way.
diff --git a/sysdeps/unix/sysv/linux/dl-execstack.c b/sysdeps/unix/sysv/linux/dl-execstack.c
index 3c4de1c..913af76 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 0f7b459..04c8d50 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 d60eb15..963c879 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 6cffb65..bcbcc23 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 */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c6ffedc8e454468b745e7fb2278705ea28ae70b9
commit c6ffedc8e454468b745e7fb2278705ea28ae70b9
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu Jun 22 04:15:39 2017 -0700
Add <sys/cet.h>
Include sysdeps/unix/sysv/linux/x86/sys/cet.h for assembly and C sources
so that ELF program property can be added to all relocatable objects if
defines__IBT__ or __SHSTK__ is defined. If compiler defines__IBT__, the
IBT bit is turned on in x86 feature. If compiler defines __SHSTK__, the
SHSTK bit is turned on in x86 feature.
* sysdeps/unix/sysv/linux/x86/Makefile (CPPFLAGS-.o): Add
-include $(..)sysdeps/unix/sysv/linux/x86/sys/cet.h.
(CPPFLAGS-.os): Likewise.
(CPPFLAGS-.op): Likewise.
* sysdeps/unix/sysv/linux/x86/sys/cet.h: New file.
diff --git a/sysdeps/unix/sysv/linux/x86/Makefile b/sysdeps/unix/sysv/linux/x86/Makefile
index 9e6ec44..9d24c8f 100644
--- a/sysdeps/unix/sysv/linux/x86/Makefile
+++ b/sysdeps/unix/sysv/linux/x86/Makefile
@@ -22,3 +22,9 @@ endif
ifeq ($(subdir),elf)
sysdep_routines += dl-vdso
endif
+
+# Always build relocatable objects with <sys/cet.h> which is unused if
+# IBT and SHSTCK are disabled.
+CPPFLAGS-.o += -include $(..)sysdeps/unix/sysv/linux/x86/sys/cet.h
+CPPFLAGS-.os += -include $(..)sysdeps/unix/sysv/linux/x86/sys/cet.h
+CPPFLAGS-.op += -include $(..)sysdeps/unix/sysv/linux/x86/sys/cet.h
diff --git a/sysdeps/unix/sysv/linux/x86/sys/cet.h b/sysdeps/unix/sysv/linux/x86/sys/cet.h
new file mode 100644
index 0000000..31e28bd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86/sys/cet.h
@@ -0,0 +1,138 @@
+/* ELF program property for Intel CET.
+ 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
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_CET_H
+#define _SYS_CET_H 1
+
+/* Add x86 feature with IBT and/or SHSTK bits to ELF program property
+ if they are enabled. Otherwise, contents in this header file are
+ unused. */
+
+# ifdef __ASSEMBLER__
+
+# ifdef __LP64__
+# define __PROPERTY_ALIGN 3
+# else
+# define __PROPERTY_ALIGN 2
+# endif
+
+# ifdef __IBT__
+ .pushsection ".note.gnu.property", "a"
+ .p2align __PROPERTY_ALIGN
+ .long 1f - 0f /* name length. */
+ .long 5f - 1f /* data length. */
+ /* NT_GNU_PROPERTY_TYPE_0. */
+ .long 5 /* note type. */
+0:
+ .asciz "GNU" /* vendor name. */
+1:
+ .p2align __PROPERTY_ALIGN
+ /* GNU_PROPERTY_X86_FEATURE_1_AND. */
+ .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ /* GNU_PROPERTY_X86_FEATURE_1_IBT. */
+ .long 0x1
+4:
+ .p2align __PROPERTY_ALIGN
+5:
+ .popsection
+# endif
+
+# ifdef __SHSTK__
+ .pushsection ".note.gnu.property", "a"
+ .p2align __PROPERTY_ALIGN
+ .long 1f - 0f /* name length. */
+ .long 5f - 1f /* data length. */
+ /* NT_GNU_PROPERTY_TYPE_0. */
+ .long 5 /* note type. */
+0:
+ .asciz "GNU" /* vendor name. */
+1:
+ .p2align __PROPERTY_ALIGN
+ /* GNU_PROPERTY_X86_FEATURE_1_AND. */
+ .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ /* GNU_PROPERTY_X86_FEATURE_1_SHSTK. */
+ .long 0x2
+4:
+ .p2align __PROPERTY_ALIGN
+5:
+ .popsection
+# endif
+
+# else
+
+# ifdef __LP64__
+# define __PROPERTY_ALIGN "3"
+# else
+# define __PROPERTY_ALIGN "2"
+# endif
+
+# ifdef __IBT__
+ __asm ("\
+ .pushsection \".note.gnu.property\", \"a\"\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+ .long 1f - 0f /* name length. */\n\
+ .long 5f - 1f /* data length. */\n\
+ /* NT_GNU_PROPERTY_TYPE_0. */\n\
+ .long 5 /* note type. */\n\
+0:\n\
+ .asciz \"GNU\" /* vendor name. */\n\
+1:\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+ /* GNU_PROPERTY_X86_FEATURE_1_AND. */\n\
+ .long 0xc0000002 /* pr_type. */\n\
+ .long 4f - 3f /* pr_datasz. */\n\
+3:\n\
+ /* GNU_PROPERTY_X86_FEATURE_1_IBT. */\n\
+ .long 0x1\n\
+4:\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+5:\n\
+ .popsection");
+# endif
+
+# ifdef __SHSTK__
+ __asm ("\
+ .pushsection \".note.gnu.property\", \"a\"\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+ .long 1f - 0f /* name length. */\n\
+ .long 5f - 1f /* data length. */\n\
+ /* NT_GNU_PROPERTY_TYPE_0. */\n\
+ .long 5 /* note type. */\n\
+0:\n\
+ .asciz \"GNU\" /* vendor name. */\n\
+1:\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+ /* GNU_PROPERTY_X86_FEATURE_1_AND. */\n\
+ .long 0xc0000002 /* pr_type. */\n\
+ .long 4f - 3f /* pr_datasz. */\n\
+3:\n\
+ /* GNU_PROPERTY_X86_FEATURE_1_SHSTK. */\n\
+ .long 0x2\n\
+4:\n\
+ .p2align " __PROPERTY_ALIGN "\n\
+5:\n\
+ .popsection");
+# endif
+
+# endif
+
+#endif /* _SYS_CET_H */
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources