[hurd,commited] hurd: Avoid some PLTs in libc and librt

Message ID 20180402190912.1666-1-samuel.thibault@ens-lyon.org
State New
Headers show
Series
  • [hurd,commited] hurd: Avoid some PLTs in libc and librt
Related show

Commit Message

Samuel Thibault April 2, 2018, 7:09 p.m.
* hurd/hurdauth.c (_S_msg_add_auth): Call __vm_allocate and
	__vm_deallocate instead of vm_allocate and vm_deallocate.
	* hurd/hurdmsg.c (_S_msg_set_env_variable): Call __setenv instead of
	setenv.
	* hurd/hurdprio.c (_hurd_priority_which_map): Call __geteuid instead
	of geteuid.
	* hurd/path-lookup.c (file_name_path_scan): Call __strdup instead of
	strdup.
	* hurd/siginfo.c: Include <libioP.h>.
	(_hurd_siginfo_handler): Call _IO_puts instead of puts.
	* hurd/xattr.c (_hurd_xattr_get, _hurd_xattr_set): Call __munmap instead of
	munmap.
	* io/fts.c (fts_build): Call __dirfd instead of dirfd.
	* mach/devstream.c: Include <libioP.h>.
	(dealloc_ref): Call __mach_port_deallocate instead of
	mach_port_deallocate.
	(mach_open_devstream): Call _IO_fopencookie instead of fopencookie.
	Call __mach_port_deallocate instead of mach_port_deallocate.
	* stdlib/canonicalize.c (__realpath): Call __pathconf instead of
	pathconf.
	* sysdeps/mach/hurd/ifreq.c (__ifreq): Call __munmap instead of
	munmap.
	* sysdeps/mach/hurd/ifreq.h (__if_freereq): Likewise.
	* sysdeps/mach/hurd/ptrace.c (ptrace): Call __kill instead of kill.
	* sysdeps/mach/hurd/sendfile64.c (sendfile64): Call __munmap instead
	of munmap.
	* sysdeps/mach/hurd/socketpair.c (__socketpair): Call __close instead
	of close.
	* sysdeps/posix/clock_getres.c (realtime_getres): Call __sysconf
	instead of sysconf.
	* sysdeps/pthread/timer_gettime.c (timer_gettime): Call
	__clock_gettime instead of clock_gettime.
	* sysdeps/pthread/timer_routines.c (thread_func): Likewise.
	* sysdeps/pthread/timer_settime.c (timer_settime): Likewise.
	* sysdeps/unix/bsd/gtty.c (gtty): Call __ioctl instead of ioctl.
	* sysdeps/unix/bsd/stty.c (stty): Likewise.
	* sysdeps/unix/bsd/tcflow.c (tcflow): Call __tcgetattr instead of
	tcgetattr.
	* sysdeps/unix/clock_nanosleep.c (__clock_nanosleep): Call
	__clock_gettime and __nanosleep instead of clock_gettime and
	nanosleep.
---
 ChangeLog                        | 42 ++++++++++++++++++++++++++++++++++++++++
 hurd/hurdauth.c                  | 16 +++++++--------
 hurd/hurdmsg.c                   |  2 +-
 hurd/hurdprio.c                  |  2 +-
 hurd/path-lookup.c               |  2 +-
 hurd/siginfo.c                   |  3 ++-
 hurd/xattr.c                     |  6 +++---
 io/fts.c                         |  2 +-
 mach/devstream.c                 | 13 +++++++------
 stdlib/canonicalize.c            |  2 +-
 sysdeps/mach/hurd/ifreq.c        |  2 +-
 sysdeps/mach/hurd/ifreq.h        |  2 +-
 sysdeps/mach/hurd/ptrace.c       |  2 +-
 sysdeps/mach/hurd/sendfile64.c   |  2 +-
 sysdeps/mach/hurd/socketpair.c   |  2 +-
 sysdeps/posix/clock_getres.c     |  2 +-
 sysdeps/pthread/timer_gettime.c  |  2 +-
 sysdeps/pthread/timer_routines.c |  2 +-
 sysdeps/pthread/timer_settime.c  |  4 ++--
 sysdeps/unix/bsd/gtty.c          |  2 +-
 sysdeps/unix/bsd/stty.c          |  2 +-
 sysdeps/unix/bsd/tcflow.c        |  2 +-
 sysdeps/unix/clock_nanosleep.c   |  4 ++--
 23 files changed, 82 insertions(+), 38 deletions(-)

Comments

Florian Weimer April 2, 2018, 7:37 p.m. | #1
On 04/02/2018 09:09 PM, Samuel Thibault wrote:
> 	* io/fts.c (fts_build): Call __dirfd instead of dirfd.

There's no PLT avoidance for __dirfd, so this introduces a regression on 
GNU/Linux.  dirfd was expanded inline there.

      590:       e8 00 00 00 00          callq  595 <fts_build+0x75>
                         591: R_X86_64_PLT32     __dirfd-0x4

I think this calls for a different solution.

Thanks,
Florian
Joseph Myers April 3, 2018, 12:17 a.m. | #2
As a general matter, calling __foo instead of foo is something done for 
namespace reasons, if there is a standard namespace (or, in principle, one 
such as _DEFAULT_SOURCE, though we don't test that) including a function 
in the calling file, but not foo.  It may also fix local PLT issues, if 
__foo is not exported from the library in question, but if there are only 
PLT issues not namespace ones, the *_hidden_proto / *_hidden_def macros 
would typically be called as a sufficient solution to the PLT issues.

Calling __foo does of course introduce the need for declarations of __foo 
that may not have been previously needed, and those may need to replicate 
properties of the public declarations of foo, such as attributes or the 
presence of inline versions, to avoid regressions.

Patch

diff --git a/ChangeLog b/ChangeLog
index b3d009b858..e63f9878e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -305,6 +305,48 @@ 
 	(_init_routine): Call __pthread_attr_init and __pthread_attr_setstack
 	instead of pthread_attr_init and pthread_attr_setstack.
 
+	* hurd/hurdauth.c (_S_msg_add_auth): Call __vm_allocate and
+	__vm_deallocate instead of vm_allocate and vm_deallocate.
+	* hurd/hurdmsg.c (_S_msg_set_env_variable): Call __setenv instead of
+	setenv.
+	* hurd/hurdprio.c (_hurd_priority_which_map): Call __geteuid instead
+	of geteuid.
+	* hurd/path-lookup.c (file_name_path_scan): Call __strdup instead of
+	strdup.
+	* hurd/siginfo.c: Include <libioP.h>.
+	(_hurd_siginfo_handler): Call _IO_puts instead of puts.
+	* hurd/xattr.c (_hurd_xattr_get, _hurd_xattr_set): Call __munmap instead of
+	munmap.
+	* io/fts.c (fts_build): Call __dirfd instead of dirfd.
+	* mach/devstream.c: Include <libioP.h>.
+	(dealloc_ref): Call __mach_port_deallocate instead of
+	mach_port_deallocate.
+	(mach_open_devstream): Call _IO_fopencookie instead of fopencookie.
+	Call __mach_port_deallocate instead of mach_port_deallocate.
+	* stdlib/canonicalize.c (__realpath): Call __pathconf instead of
+	pathconf.
+	* sysdeps/mach/hurd/ifreq.c (__ifreq): Call __munmap instead of
+	munmap.
+	* sysdeps/mach/hurd/ifreq.h (__if_freereq): Likewise.
+	* sysdeps/mach/hurd/ptrace.c (ptrace): Call __kill instead of kill.
+	* sysdeps/mach/hurd/sendfile64.c (sendfile64): Call __munmap instead
+	of munmap.
+	* sysdeps/mach/hurd/socketpair.c (__socketpair): Call __close instead
+	of close.
+	* sysdeps/posix/clock_getres.c (realtime_getres): Call __sysconf
+	instead of sysconf.
+	* sysdeps/pthread/timer_gettime.c (timer_gettime): Call
+	__clock_gettime instead of clock_gettime.
+	* sysdeps/pthread/timer_routines.c (thread_func): Likewise.
+	* sysdeps/pthread/timer_settime.c (timer_settime): Likewise.
+	* sysdeps/unix/bsd/gtty.c (gtty): Call __ioctl instead of ioctl.
+	* sysdeps/unix/bsd/stty.c (stty): Likewise.
+	* sysdeps/unix/bsd/tcflow.c (tcflow): Call __tcgetattr instead of
+	tcgetattr.
+	* sysdeps/unix/clock_nanosleep.c (__clock_nanosleep): Call
+	__clock_gettime and __nanosleep instead of clock_gettime and
+	nanosleep.
+
 2018-04-02  Agustina Arzille  <avarzille@riseup.net>
             Amos Jeffries  <squid3@treenet.co.nz>
             David Michael  <fedora.dm0@gmail.com>
diff --git a/hurd/hurdauth.c b/hurd/hurdauth.c
index ad315a27b7..1a7e67ea0e 100644
--- a/hurd/hurdauth.c
+++ b/hurd/hurdauth.c
@@ -52,8 +52,8 @@  _S_msg_add_auth (mach_port_t me,
       int i, j, k;
       vm_size_t offset;
 
-      urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
-			 nexist + nnew * sizeof (uid_t), 1);
+      urp = __vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
+			   nexist + nnew * sizeof (uid_t), 1);
       if (urp)
 	return urp;
 
@@ -75,10 +75,10 @@  _S_msg_add_auth (mach_port_t me,
       offset = (round_page (nexist + nnew * sizeof (uid_t))
 		- round_page (j * sizeof (uid_t)));
       if (offset)
-	vm_deallocate (mach_task_self (),
-		       (vm_address_t) (*newlistp
-				       + (nexist + nnew * sizeof (uid_t))),
-		       offset);
+	__vm_deallocate (mach_task_self (),
+		         (vm_address_t) (*newlistp
+				         + (nexist + nnew * sizeof (uid_t))),
+		         offset);
       *newlistlen = j;
       return 0;
     }
@@ -136,8 +136,8 @@  _S_msg_add_auth (mach_port_t me,
 
 #define freeup(array, len) \
   if (array) \
-    vm_deallocate (mach_task_self (), (vm_address_t) array, \
-		   len * sizeof (uid_t));
+    __vm_deallocate (mach_task_self (), (vm_address_t) array, \
+		     len * sizeof (uid_t));
 
   freeup (genuids, ngenuids);
   freeup (auxuids, nauxuids);
diff --git a/hurd/hurdmsg.c b/hurd/hurdmsg.c
index 5759af3411..63e5e81b87 100644
--- a/hurd/hurdmsg.c
+++ b/hurd/hurdmsg.c
@@ -344,7 +344,7 @@  _S_msg_set_env_variable (mach_port_t msgport, mach_port_t auth,
 {
   AUTHCHECK;
 
-  if (setenv (variable, value, replace)) /* XXX name space */
+  if (__setenv (variable, value, replace)) /* XXX name space */
     return errno;
   return 0;
 }
diff --git a/hurd/hurdprio.c b/hurd/hurdprio.c
index 5ff84b6f56..3783fe9397 100644
--- a/hurd/hurdprio.c
+++ b/hurd/hurdprio.c
@@ -50,7 +50,7 @@  _hurd_priority_which_map (enum __priority_which which, int who,
 
     case PRIO_USER:
       if (who == 0)
-	who = geteuid ();
+	who = __geteuid ();
       err = __USEPORT (PROC, __proc_getallpids (port, &pids, &npids));
       for (i = 0; !err && i < npids; ++i)
 	{
diff --git a/hurd/path-lookup.c b/hurd/path-lookup.c
index d3906e1c9b..389a8ccd1b 100644
--- a/hurd/path-lookup.c
+++ b/hurd/path-lookup.c
@@ -63,7 +63,7 @@  file_name_path_scan (const char *file_name, const char *path,
 	  if (err == 0)
 	    {
 	      if (prefixed_name)
-		*prefixed_name = strdup (pfxed_name);
+		*prefixed_name = __strdup (pfxed_name);
 	      return 0;
 	    }
 	  if (!real_err && err != ENOENT)
diff --git a/hurd/siginfo.c b/hurd/siginfo.c
index 65d8e4882e..75e02d5282 100644
--- a/hurd/siginfo.c
+++ b/hurd/siginfo.c
@@ -17,10 +17,11 @@ 
 
 #include <hurd/signal.h>
 #include <stdio.h>
+#include <libioP.h>
 
 void
 _hurd_siginfo_handler (int signo)
 {
   /* XXX */
-  puts ("got a SIGINFO");
+  _IO_puts ("got a SIGINFO");
 }
diff --git a/hurd/xattr.c b/hurd/xattr.c
index c56bab07cb..23d9fcb691 100644
--- a/hurd/xattr.c
+++ b/hurd/xattr.c
@@ -67,14 +67,14 @@  _hurd_xattr_get (io_t port, const char *name, void *value, size_t *size)
       if (value != NULL && *size < bufsz)
 	{
 	  if (buf != value)
-	    munmap (buf, bufsz);
+	    __munmap (buf, bufsz);
 	  return -ERANGE;
 	}
       if (buf != value && bufsz > 0)
 	{
 	  if (value != NULL)
 	    memcpy (value, buf, bufsz);
-	  munmap (buf, bufsz);
+	  __munmap (buf, bufsz);
 	}
       *size = bufsz;
       return 0;
@@ -150,7 +150,7 @@  _hurd_xattr_set (io_t port, const char *name, const void *value, size_t size,
 	    return err;
 	  if (bufsz > 0)
 	    {
-	      munmap (buf, bufsz);
+	      __munmap (buf, bufsz);
 	      return ENODATA;
 	    }
 	}
diff --git a/io/fts.c b/io/fts.c
index ad9d333f45..a30491c230 100644
--- a/io/fts.c
+++ b/io/fts.c
@@ -680,7 +680,7 @@  fts_build (FTSOBJ *sp, int type)
 	 */
 	cderrno = 0;
 	if (nlinks || type == BREAD) {
-		if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) {
+		if (fts_safe_changedir(sp, cur, __dirfd(dirp), NULL)) {
 			if (nlinks && type == BREAD)
 				cur->fts_errno = errno;
 			cur->fts_flags |= FTS_DONTCHDIR;
diff --git a/mach/devstream.c b/mach/devstream.c
index 21d9f7bda3..505b6573ae 100644
--- a/mach/devstream.c
+++ b/mach/devstream.c
@@ -22,6 +22,7 @@ 
 #include <device/device.h>
 #include <errno.h>
 #include <string.h>
+#include <libioP.h>
 
 
 static ssize_t
@@ -111,7 +112,7 @@  devstream_read (void *cookie, char *buffer, size_t to_read)
 static int
 dealloc_ref (void *cookie)
 {
-  if (mach_port_deallocate (mach_task_self (), (mach_port_t) cookie))
+  if (__mach_port_deallocate (mach_task_self (), (mach_port_t) cookie))
     {
       errno = EINVAL;
       return -1;
@@ -130,13 +131,13 @@  mach_open_devstream (mach_port_t dev, const char *mode)
       return NULL;
     }
 
-  stream = fopencookie ((void *) dev, mode,
-			(cookie_io_functions_t) { write: devstream_write,
-						  read: devstream_read,
-						  close: dealloc_ref });
+  stream = _IO_fopencookie ((void *) dev, mode,
+			    (cookie_io_functions_t) { write: devstream_write,
+						      read: devstream_read,
+						      close: dealloc_ref });
   if (stream == NULL)
     {
-      mach_port_deallocate (mach_task_self (), dev);
+      __mach_port_deallocate (mach_task_self (), dev);
       return NULL;
     }
 
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index 30825a91b8..4135f3f33c 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -68,7 +68,7 @@  __realpath (const char *name, char *resolved)
 #ifdef PATH_MAX
   path_max = PATH_MAX;
 #else
-  path_max = pathconf (name, _PC_PATH_MAX);
+  path_max = __pathconf (name, _PC_PATH_MAX);
   if (path_max <= 0)
     path_max = 1024;
 #endif
diff --git a/sysdeps/mach/hurd/ifreq.c b/sysdeps/mach/hurd/ifreq.c
index 10877824b2..70a906a83a 100644
--- a/sysdeps/mach/hurd/ifreq.c
+++ b/sysdeps/mach/hurd/ifreq.c
@@ -53,7 +53,7 @@  __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
 
       if (len % sizeof (struct ifreq) != 0)
 	{
-	  munmap (data, len);
+	  __munmap (data, len);
 	  errno = EGRATUITOUS;
 	  goto out;
 	}
diff --git a/sysdeps/mach/hurd/ifreq.h b/sysdeps/mach/hurd/ifreq.h
index 3c200664ee..3ab8d858b6 100644
--- a/sysdeps/mach/hurd/ifreq.h
+++ b/sysdeps/mach/hurd/ifreq.h
@@ -28,5 +28,5 @@ 
 static inline void
 __if_freereq (struct ifreq *ifreqs, int num_ifs)
 {
-  munmap (ifreqs, num_ifs * sizeof (struct ifreq));
+  __munmap (ifreqs, num_ifs * sizeof (struct ifreq));
 }
diff --git a/sysdeps/mach/hurd/ptrace.c b/sysdeps/mach/hurd/ptrace.c
index ac3059bb90..d0268a3f98 100644
--- a/sysdeps/mach/hurd/ptrace.c
+++ b/sysdeps/mach/hurd/ptrace.c
@@ -155,7 +155,7 @@  ptrace (enum __ptrace_request request, ... )
       va_end (ap);
       /* SIGKILL always just terminates the task,
 	 so normal kill is just the same when traced.  */
-      return kill (pid, SIGKILL);
+      return __kill (pid, SIGKILL);
 
     case PTRACE_SINGLESTEP:
       /* This is a machine-dependent kernel RPC on
diff --git a/sysdeps/mach/hurd/sendfile64.c b/sysdeps/mach/hurd/sendfile64.c
index dfd9c45daf..f69ccd4a79 100644
--- a/sysdeps/mach/hurd/sendfile64.c
+++ b/sysdeps/mach/hurd/sendfile64.c
@@ -47,7 +47,7 @@  sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count)
 	return 0;
       err = HURD_DPORT_USE (out_fd, __io_write (port, data, datalen,
 						(off_t) -1, &nwrote));
-      munmap (data, datalen);
+      __munmap (data, datalen);
       if (err == 0)
 	{
 	  if (offset)
diff --git a/sysdeps/mach/hurd/socketpair.c b/sysdeps/mach/hurd/socketpair.c
index 85e0f7400b..3b18c676c0 100644
--- a/sysdeps/mach/hurd/socketpair.c
+++ b/sysdeps/mach/hurd/socketpair.c
@@ -82,7 +82,7 @@  __socketpair (int domain, int type, int protocol, int fds[2])
   if (d2 < 0)
     {
       err = errno;
-      (void) close (d1);
+      (void) __close (d1);
       return __hurd_fail (err);
     }
 
diff --git a/sysdeps/posix/clock_getres.c b/sysdeps/posix/clock_getres.c
index 8bc7e813e6..e7924e0891 100644
--- a/sysdeps/posix/clock_getres.c
+++ b/sysdeps/posix/clock_getres.c
@@ -58,7 +58,7 @@  hp_timing_getres (struct timespec *res)
 static inline int
 realtime_getres (struct timespec *res)
 {
-  long int clk_tck = sysconf (_SC_CLK_TCK);
+  long int clk_tck = __sysconf (_SC_CLK_TCK);
 
   if (__glibc_likely (clk_tck != -1))
     {
diff --git a/sysdeps/pthread/timer_gettime.c b/sysdeps/pthread/timer_gettime.c
index ef3019fa59..f5f060afec 100644
--- a/sysdeps/pthread/timer_gettime.c
+++ b/sysdeps/pthread/timer_gettime.c
@@ -50,7 +50,7 @@  timer_gettime (timer_t timerid, struct itimerspec *value)
     {
       if (armed)
 	{
-	  clock_gettime (clock, &now);
+	  __clock_gettime (clock, &now);
 	  if (timespec_compare (&now, &expiry) < 0)
 	    timespec_sub (&value->it_value, &expiry, &now);
 	  else
diff --git a/sysdeps/pthread/timer_routines.c b/sysdeps/pthread/timer_routines.c
index 25ccfadd7e..c12246792b 100644
--- a/sysdeps/pthread/timer_routines.c
+++ b/sysdeps/pthread/timer_routines.c
@@ -376,7 +376,7 @@  thread_func (void *arg)
 
 	  /* This assumes that the elements of the list of one thread
 	     are all for the same clock.  */
-	  clock_gettime (timer->clock, &now);
+	  __clock_gettime (timer->clock, &now);
 
 	  while (1)
 	    {
diff --git a/sysdeps/pthread/timer_settime.c b/sysdeps/pthread/timer_settime.c
index 5c541acb77..8a71a506f8 100644
--- a/sysdeps/pthread/timer_settime.c
+++ b/sysdeps/pthread/timer_settime.c
@@ -55,7 +55,7 @@  timer_settime (timer_t timerid, int flags, const struct itimerspec *value,
 
   if ((flags & TIMER_ABSTIME) == 0)
     {
-      clock_gettime (timer->clock, &now);
+      __clock_gettime (timer->clock, &now);
       have_now = 1;
     }
 
@@ -80,7 +80,7 @@  timer_settime (timer_t timerid, int flags, const struct itimerspec *value,
 	  if (! have_now)
 	    {
 	      pthread_mutex_unlock (&__timer_mutex);
-	      clock_gettime (timer->clock, &now);
+	      __clock_gettime (timer->clock, &now);
 	      have_now = 1;
 	      pthread_mutex_lock (&__timer_mutex);
 	      timer_addref (timer);
diff --git a/sysdeps/unix/bsd/gtty.c b/sysdeps/unix/bsd/gtty.c
index 830de6d96c..77e2a7268c 100644
--- a/sysdeps/unix/bsd/gtty.c
+++ b/sysdeps/unix/bsd/gtty.c
@@ -22,5 +22,5 @@ 
 int
 gtty (int fd, struct sgttyb *params)
 {
-  return ioctl (fd, TIOCGETP, (void *) params);
+  return __ioctl (fd, TIOCGETP, (void *) params);
 }
diff --git a/sysdeps/unix/bsd/stty.c b/sysdeps/unix/bsd/stty.c
index c89ab0037f..8a0bbdef80 100644
--- a/sysdeps/unix/bsd/stty.c
+++ b/sysdeps/unix/bsd/stty.c
@@ -22,5 +22,5 @@ 
 int
 stty (int fd, const struct sgttyb *params)
 {
-  return ioctl (fd, TIOCSETP, (void *) params);
+  return __ioctl (fd, TIOCSETP, (void *) params);
 }
diff --git a/sysdeps/unix/bsd/tcflow.c b/sysdeps/unix/bsd/tcflow.c
index 7998e0c588..3eb5f61093 100644
--- a/sysdeps/unix/bsd/tcflow.c
+++ b/sysdeps/unix/bsd/tcflow.c
@@ -40,7 +40,7 @@  tcflow (int fd, int action)
 	   `write'.  Is there another way to do this?  */
 	struct termios attr;
 	unsigned char c;
-	if (tcgetattr (fd, &attr) < 0)
+	if (__tcgetattr (fd, &attr) < 0)
 	  return -1;
 	c = attr.c_cc[action == TCIOFF ? VSTOP : VSTART];
 	if (c != _POSIX_VDISABLE && write (fd, &c, 1) < 1)
diff --git a/sysdeps/unix/clock_nanosleep.c b/sysdeps/unix/clock_nanosleep.c
index 491ce02c6c..97b3d6b6ab 100644
--- a/sysdeps/unix/clock_nanosleep.c
+++ b/sysdeps/unix/clock_nanosleep.c
@@ -71,7 +71,7 @@  __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
       assert (sizeof (sec) >= sizeof (now.tv_sec));
 
       /* Get the current time for this clock.  */
-      if (__builtin_expect (clock_gettime (clock_id, &now), 0) != 0)
+      if (__builtin_expect (__clock_gettime (clock_id, &now), 0) != 0)
 	return errno;
 
       /* Compute the difference.  */
@@ -96,6 +96,6 @@  __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
     /* Not supported.  */
     return ENOTSUP;
 
-  return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0;
+  return __builtin_expect (__nanosleep (req, rem), 0) ? errno : 0;
 }
 weak_alias (__clock_nanosleep, clock_nanosleep)