about summary refs log tree commit diff
path: root/sysdeps/unix/syscall-template.S
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-06-17 20:17:49 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-06-17 20:17:49 +0000
commitc21d37deb268afc45fbc5bba1a97f87afd0bf656 (patch)
treedc6313af5eaa7e05c0b127130a8d32b24f02625d /sysdeps/unix/syscall-template.S
parent90dd591393a03d023be06a33acfb42c1b328b0fa (diff)
downloadglibc-c21d37deb268afc45fbc5bba1a97f87afd0bf656.tar.gz
glibc-c21d37deb268afc45fbc5bba1a97f87afd0bf656.tar.xz
glibc-c21d37deb268afc45fbc5bba1a97f87afd0bf656.zip
Create hidden aliases for non-libc syscalls automatically.
The syscall wrappers mechanism automatically creates hidden aliases
for syscalls with libc_hidden_def / libc_hidden_weak.  The use of
libc_hidden_* has the side-effect that for syscall wrappers in
non-libc libraries those aliases are not created.  In turn, this means
that three mq_* syscalls in sysdeps/unix/sysv/linux/syscalls.list list
the __GI_* names explicitly.

The use of libc_hidden_* dates back to the original introduction of
that support in

2002-08-03  Roland McGrath  <roland@redhat.com>

        * sysdeps/unix/make-syscalls.sh: Generate libc_hidden_def or
        libc_hidden_weak for every system call symbol defined.

(predating the non-libc syscalls in question) and I see no reason for
excluding non-libc syscalls.  This patch changes the code to use
hidden_def / hidden_weak (via a wrapper syscall_hidden_def in the case
where the argument is itself a macro, so that the argument gets
expanded before concatenation with __GI_), so avoiding the need to
specify the hidden aliases explicitly in this case.

Tested for x86_64 and x86 (testsuite, and that disassembly of
installed stripped shared libraries is unchanged by the patch; the
mq_* symbols change from weak to strong, which is of no significance
and two of them will shortly change back to weak as part of a fix for
bug 18545).

	* sysdeps/unix/make-syscalls.sh (emit_weak_aliases): Use
	hidden_def and hidden_weak instead of libc_hidden_def and
	libc_hidden_weak.
	(top level): Refer to hidden_def in comment.
	* sysdeps/unix/syscall-template.S (syscall_hidden_def): New
	macro.  Use it instead of libc_hidden_def.
	* sysdeps/unix/sysv/linux/syscalls.list (mq_timedsend): Do not
	specify __GI_* name explicitly.
	(mq_timedreceive): Likewise.
	(mq_setattr): Likewise.
Diffstat (limited to 'sysdeps/unix/syscall-template.S')
-rw-r--r--sysdeps/unix/syscall-template.S5
1 files changed, 4 insertions, 1 deletions
diff --git a/sysdeps/unix/syscall-template.S b/sysdeps/unix/syscall-template.S
index 62ebe027b6..e86e6a73b9 100644
--- a/sysdeps/unix/syscall-template.S
+++ b/sysdeps/unix/syscall-template.S
@@ -47,6 +47,9 @@
 # include <sysdep.h>
 #endif
 
+/* This indirection is needed so that SYMBOL gets macro-expanded.  */
+#define syscall_hidden_def(SYMBOL)		hidden_def (SYMBOL)
+
 #define T_PSEUDO(SYMBOL, NAME, N)		PSEUDO (SYMBOL, NAME, N)
 #define T_PSEUDO_NOERRNO(SYMBOL, NAME, N)	PSEUDO_NOERRNO (SYMBOL, NAME, N)
 #define T_PSEUDO_ERRVAL(SYMBOL, NAME, N)	PSEUDO_ERRVAL (SYMBOL, NAME, N)
@@ -84,4 +87,4 @@ T_PSEUDO_END (SYSCALL_SYMBOL)
 
 #endif
 
-libc_hidden_def (SYSCALL_SYMBOL)
+syscall_hidden_def (SYSCALL_SYMBOL)