Create hidden aliases for non-libc syscalls automatically.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 17 Jun 2015 20:17:49 +0000 (20:17 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 17 Jun 2015 20:17:49 +0000 (20:17 +0000)
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.

ChangeLog
sysdeps/unix/make-syscalls.sh
sysdeps/unix/syscall-template.S
sysdeps/unix/sysv/linux/syscalls.list

index 5b1226a..2ec139f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2015-06-17  Joseph Myers  <joseph@codesourcery.com>
 
+       * 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.
+
        [BZ #18544]
        * nptl/pthread_barrier_init.c (pthread_barrier_init): Rename to
        __pthread_barrier_init and define as weak alias of
index 12f664e..fbf9660 100644 (file)
@@ -128,11 +128,11 @@ emit_weak_aliases()
       !*)
        name=`echo $name | sed 's/.//'`
        echo "   echo 'strong_alias ($strong, $name)'; \\"
-       echo "   echo 'libc_hidden_def ($name)'; \\"
+       echo "   echo 'hidden_def ($name)'; \\"
        ;;
       *)
        echo "   echo 'weak_alias ($strong, $name)'; \\"
-       echo "   echo 'libc_hidden_weak ($name)'; \\"
+       echo "   echo 'hidden_weak ($name)'; \\"
        ;;
     esac
   done
@@ -287,7 +287,7 @@ while read file srcfile caller syscall args strong weak; do
         echo '}'; \\
         echo 'asm (".type ${strong}, %gnu_indirect_function");'; \\
 EOF
-    # This is doing "libc_hidden_def (${strong})", but the compiler
+    # This is doing "hidden_def (${strong})", but the compiler
     # doesn't know that we've defined ${strong} in the same file, so
     # we can't do it the normal way.
     cat <<EOF
index 62ebe02..e86e6a7 100644 (file)
@@ -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)
index 42b6c2e..09dd10d 100644 (file)
@@ -106,9 +106,9 @@ removexattr -       removexattr     i:ss    removexattr
 lremovexattr   -       lremovexattr    i:ss    lremovexattr
 fremovexattr   -       fremovexattr    i:is    fremovexattr
 
-mq_timedsend   -       mq_timedsend    Ci:ipiip        __GI_mq_timedsend       mq_timedsend
-mq_timedreceive        -       mq_timedreceive Ci:ipipp        __GI_mq_timedreceive    mq_timedreceive
-mq_setattr     -       mq_getsetattr   i:ipp   __GI_mq_setattr mq_setattr
+mq_timedsend   -       mq_timedsend    Ci:ipiip        mq_timedsend
+mq_timedreceive        -       mq_timedreceive Ci:ipipp        mq_timedreceive
+mq_setattr     -       mq_getsetattr   i:ipp   mq_setattr
 
 timerfd_create EXTRA   timerfd_create  i:ii    timerfd_create
 timerfd_settime        EXTRA   timerfd_settime i:iipp  timerfd_settime