hurd: Fix build after __pread64 usage in the dynamic loader

Message ID 87blu6cl5k.fsf@oldenburg2.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer Oct. 24, 2019, 1:45 p.m. UTC
  Commit 95c1056962a3f2297c94ce47f0eaf0c5b6563231 ("elf: Use nocancel
pread64() instead of lseek()+read()") added calls to __pread64 to
the dynamic loader.  On Hurd, this needs an implementation in the
dynamic loader because the rtld-pread64 rebuild pulls in too many
symbols.

Fixes: 95c1056962a3f2297c94ce47f0eaf0c5b6563231

-----
 sysdeps/mach/hurd/dl-sysdep.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
  

Comments

Samuel Thibault Oct. 24, 2019, 1:50 p.m. UTC | #1
Florian Weimer, le jeu. 24 oct. 2019 15:45:11 +0200, a ecrit:
> Commit 95c1056962a3f2297c94ce47f0eaf0c5b6563231 ("elf: Use nocancel
> pread64() instead of lseek()+read()") added calls to __pread64 to
> the dynamic loader.  On Hurd, this needs an implementation in the
> dynamic loader because the rtld-pread64 rebuild pulls in too many
> symbols.
> 
> Fixes: 95c1056962a3f2297c94ce47f0eaf0c5b6563231

Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

Thanks!

> -----
>  sysdeps/mach/hurd/dl-sysdep.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
> index 219475aa7d..719d603f44 100644
> --- a/sysdeps/mach/hurd/dl-sysdep.c
> +++ b/sysdeps/mach/hurd/dl-sysdep.c
> @@ -357,9 +357,9 @@ __close (int fd)
>    return 0;
>  }
>  
> -check_no_hidden(__read);
> +check_no_hidden(__pread64);
>  __ssize_t weak_function
> -__read (int fd, void *buf, size_t nbytes)
> +__pread64 (int fd, void *buf, size_t nbytes, off64_t offset)
>  {
>    error_t err;
>    char *data;
> @@ -367,7 +367,7 @@ __read (int fd, void *buf, size_t nbytes)
>  
>    data = buf;
>    nread = nbytes;
> -  err = __io_read ((mach_port_t) fd, &data, &nread, -1, nbytes);
> +  err = __io_read ((mach_port_t) fd, &data, &nread, offset, nbytes);
>    if (err)
>      return __hurd_fail (err);
>  
> @@ -379,6 +379,14 @@ __read (int fd, void *buf, size_t nbytes)
>  
>    return nread;
>  }
> +libc_hidden_weak (__pread64)
> +
> +check_no_hidden(__read);
> +__ssize_t weak_function
> +__read (int fd, void *buf, size_t nbytes)
> +{
> +  return __pread64 (fd, buf, nbytes, -1);
> +}
>  libc_hidden_weak (__read)
>  
>  check_no_hidden(__write);
>
  

Patch

diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 219475aa7d..719d603f44 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -357,9 +357,9 @@  __close (int fd)
   return 0;
 }
 
-check_no_hidden(__read);
+check_no_hidden(__pread64);
 __ssize_t weak_function
-__read (int fd, void *buf, size_t nbytes)
+__pread64 (int fd, void *buf, size_t nbytes, off64_t offset)
 {
   error_t err;
   char *data;
@@ -367,7 +367,7 @@  __read (int fd, void *buf, size_t nbytes)
 
   data = buf;
   nread = nbytes;
-  err = __io_read ((mach_port_t) fd, &data, &nread, -1, nbytes);
+  err = __io_read ((mach_port_t) fd, &data, &nread, offset, nbytes);
   if (err)
     return __hurd_fail (err);
 
@@ -379,6 +379,14 @@  __read (int fd, void *buf, size_t nbytes)
 
   return nread;
 }
+libc_hidden_weak (__pread64)
+
+check_no_hidden(__read);
+__ssize_t weak_function
+__read (int fd, void *buf, size_t nbytes)
+{
+  return __pread64 (fd, buf, nbytes, -1);
+}
 libc_hidden_weak (__read)
 
 check_no_hidden(__write);