This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix Linux fcntl OFD locks for non-LFS architectures (BZ#20251)


Ping.

On 21/05/2018 16:00, Adhemerval Zanella wrote:
> Updated version, change from previous one:
> 
> - Adjsut abilist with recent changes to remove the ABI tags.
> - Do not export __fcntl64 (there is no need to mimic old behavior).
> 
> ---
> 
> This patch fixes the OFD ("file private") locks for architectures that
> support non-LFS flock definition (__USE_FILE_OFFSET64 not defined). The
> issue in this case is both F_OFD_{GETLK,SETLK,SETLKW} and
> F_{SET,GET}L{W}K64 expects a flock64 argument and when using old F_OFD_*
> flags with a non LFS flock argument the kernel might interpret the underlying
> data wrongly.  Kernel idea originally was to avoid using such flags in
> non-LFS syscall, but since GLIBC uses fcntl with LFS semantic as default
> it is possible to provide the functionality and avoid the bogus struct kernel
> passing by adjusting the struct manually for the required flags.
> 
> The idea follows other LFS interfaces that provide two symbols:
> 
>   1. A new LFS fcntl64 is added on default ABI with the usual macros to select
>      it for FILE_OFFSET_BITS=64.
> 
>   2. The Linux non-LFS fcntl use a stack allocated struct flock64 for
>      F_OFD_{GETLK,SETLK,SETLKW} and F_{SET,GET}L{W}K64 and copy the results on
>      the user provided struct.
> 
>   3. Keep a compat symbol with old broken semantic for architectures that do
>      not define __OFF_T_MATCHES_OFF64_T.
> 
> So for architectures which defines __USE_FILE_OFFSET64, fcntl64 will aliased
> to fcntl and no adjustment would be required.
> 
> Checked on x86_64-linux-gnu and i686-linux-gnu.
> 
> 	[BZ #20251]
> 	* include/fcntl.h (__libc_fcntl64, __fcntl64): New prototype.
> 	* io/Makefile (routines): Add fcntl64.
> 	(CFLAGS-fcntl64.c): New rule.
> 	* io/fcntl.h (fcntl64): Add prototype and redirect if
> 	__USE_FILE_OFFSET64 is defined.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Remove file.
> 	* io/fcntl64.c: New file.
> 	* nptl/Makefile (pthread-compat-wrappers): Add fcntl64.
> 	(CFLAGS-fcntl64.c): New rule.
> 	* sysdeps/mach/hurd/fcntl.c: Alias fcntl to fcntl64 symbols.
> 	* io/Versions [GLIBC_2.28] (fcntl64; __fcntl64): New symbols.
> 	* sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Fix F_GETLK64,
> 	F_OFD_GETLK, F_SETLK64, F_SETLKW64, F_OFD_SETLK, and F_OFD_SETLKW for
> 	non-LFS case.
> 	(fcntl_common, __fcntl_nocancel): Remove function.
> 	(flock_to_flock64): New function.
> 	* sysdeps/unix/sysv/linux/fcntl64.c: New file.
> 	* sysdeps/mach/hurd/i386/libc.abilist [GLIBC_2.28] (__fcntl64, fcntl,
> 	fcntl64): New symbols.
> 	* sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/arm/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/i386/libc.abilis: Likewise.
> 	* sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/kernel-features.h: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist:
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist:
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.28] (__fcntl64,
> 	fcntl64): New symbols.
> 	* sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise.
> 	* sysdeps/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/tile/tilegx32/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/tile/tilegx64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
> ---
>  ChangeLog                                          |  54 ++++++++++
>  include/fcntl.h                                    |   4 +
>  io/Makefile                                        |   3 +-
>  io/Versions                                        |   3 +
>  io/fcntl.h                                         |  11 ++
>  .../powerpc/powerpc64/fcntl.c => io/fcntl64.c      |  28 ++++--
>  nptl/Makefile                                      |   3 +-
>  sysdeps/mach/hurd/fcntl.c                          |   5 +
>  sysdeps/mach/hurd/i386/libc.abilist                |   2 +
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist       |   1 +
>  sysdeps/unix/sysv/linux/alpha/libc.abilist         |   1 +
>  sysdeps/unix/sysv/linux/arm/libc.abilist           |   2 +
>  sysdeps/unix/sysv/linux/fcntl.c                    | 111 +++++++++++++--------
>  sysdeps/unix/sysv/linux/fcntl64.c                  |  99 ++++++++++++++++++
>  sysdeps/unix/sysv/linux/hppa/libc.abilist          |   2 +
>  sysdeps/unix/sysv/linux/i386/libc.abilist          |   2 +
>  sysdeps/unix/sysv/linux/ia64/libc.abilist          |   1 +
>  sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |   2 +
>  sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist   |   2 +
>  sysdeps/unix/sysv/linux/microblaze/libc.abilist    |   2 +
>  .../unix/sysv/linux/mips/mips32/fpu/libc.abilist   |   2 +
>  .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist |   2 +
>  .../unix/sysv/linux/mips/mips64/n32/libc.abilist   |   2 +
>  .../unix/sysv/linux/mips/mips64/n64/libc.abilist   |   1 +
>  sysdeps/unix/sysv/linux/nios2/libc.abilist         |   2 +
>  sysdeps/unix/sysv/linux/powerpc/kernel-features.h  |   9 ++
>  .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |   2 +
>  .../linux/powerpc/powerpc32/nofpu/libc.abilist     |   2 +
>  .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |   3 +
>  .../unix/sysv/linux/powerpc/powerpc64/libc.abilist |   1 +
>  sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist    |   1 +
>  sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist  |   2 +
>  sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist  |   1 +
>  sysdeps/unix/sysv/linux/sh/libc.abilist            |   2 +
>  sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |   2 +
>  sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist |   1 +
>  sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |   1 +
>  sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |   1 +
>  38 files changed, 323 insertions(+), 52 deletions(-)
>  rename sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c => io/fcntl64.c (65%)
>  create mode 100644 sysdeps/unix/sysv/linux/fcntl64.c
> 
> 
> diff --git a/include/fcntl.h b/include/fcntl.h
> index 3d68c5e..374e784 100644
> --- a/include/fcntl.h
> +++ b/include/fcntl.h
> @@ -10,10 +10,14 @@ extern int __libc_open (const char *file, int oflag, ...);
>  libc_hidden_proto (__libc_open)
>  extern int __libc_fcntl (int fd, int cmd, ...) attribute_hidden;
>  libc_hidden_proto (__libc_fcntl)
> +extern int __libc_fcntl64 (int fd, int cmd, ...) attribute_hidden;
> +libc_hidden_proto (__libc_fcntl64)
>  extern int __open (const char *__file, int __oflag, ...);
>  libc_hidden_proto (__open)
>  extern int __fcntl (int __fd, int __cmd, ...);
>  libc_hidden_proto (__fcntl)
> +extern int __fcntl64 (int __fd, int __cmd, ...) attribute_hidden;
> +libc_hidden_proto (__fcntl64)
>  extern int __openat (int __fd, const char *__file, int __oflag, ...)
>    __nonnull ((2));
>  libc_hidden_proto (__openat)
> diff --git a/io/Makefile b/io/Makefile
> index 2117cb6..4a0d8fe 100644
> --- a/io/Makefile
> +++ b/io/Makefile
> @@ -40,7 +40,7 @@ routines :=								\
>  	mkdir mkdirat							\
>  	open open_2 open64 open64_2 openat openat_2 openat64 openat64_2	\
>  	read write lseek lseek64 access euidaccess faccessat		\
> -	fcntl flock lockf lockf64					\
> +	fcntl fcntl64 flock lockf lockf64				\
>  	close dup dup2 dup3 pipe pipe2					\
>  	creat creat64							\
>  	chdir fchdir							\
> @@ -89,6 +89,7 @@ CFLAGS-open64.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-creat.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-creat64.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-fcntl.c += -fexceptions -fasynchronous-unwind-tables
> +CFLAGS-fcntl64.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-poll.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-ppoll.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-lockf.c += -fexceptions
> diff --git a/io/Versions b/io/Versions
> index 98898cb..7653588 100644
> --- a/io/Versions
> +++ b/io/Versions
> @@ -128,4 +128,7 @@ libc {
>    GLIBC_2.27 {
>      copy_file_range;
>    }
> +  GLIBC_2.28 {
> +    fcntl64;
> +  }
>  }
> diff --git a/io/fcntl.h b/io/fcntl.h
> index 69a4394..3afc620 100644
> --- a/io/fcntl.h
> +++ b/io/fcntl.h
> @@ -167,7 +167,18 @@ typedef __pid_t pid_t;
>  
>     This function is a cancellation point and therefore not marked with
>     __THROW.  */
> +#ifndef __USE_FILE_OFFSET64
>  extern int fcntl (int __fd, int __cmd, ...);
> +#else
> +# ifdef __REDIRECT
> +extern int __REDIRECT (fcntl, (int __fd, int __cmd, ...), fcntl64);
> +# else
> +#  define fcntl fcntl64
> +# endif
> +#endif
> +#ifdef __USE_LARGEFILE64
> +extern int fcntl64 (int __fd, int __cmd, ...);
> +#endif
>  
>  /* Open FILE and return a new file descriptor for it, or -1 on error.
>     OFLAG determines the type of access used.  If O_CREAT or O_TMPFILE is set
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/io/fcntl64.c
> similarity index 65%
> rename from sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> rename to io/fcntl64.c
> index 48198c1..f4e6809 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> +++ b/io/fcntl64.c
> @@ -1,4 +1,5 @@
> -/* Copyright (C) 2000-2018 Free Software Foundation, Inc.
> +/* Manipulate file descriptor.  Stub LFS version.
> +   Copyright (C) 2018 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
> @@ -15,18 +16,23 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -#include <unistd.h>
> +#include <errno.h>
>  #include <fcntl.h>
>  
> -static inline int
> -fcntl_adjust_cmd (int cmd)
> +/* Perform file control operations on FD.  */
> +int
> +__fcntl64 (int fd, int cmd, ...)
>  {
> -  if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
> -    cmd -= F_GETLK64 - F_GETLK;
> -  return cmd;
> -}
> +  if (fd < 0)
> +    {
> +      __set_errno (EBADF);
> +      return -1;
> +    }
>  
> -#define FCNTL_ADJUST_CMD(__cmd) \
> -  fcntl_adjust_cmd (__cmd)
> +  __set_errno (ENOSYS);
> +  return -1;
> +}
> +libc_hidden_def (__fcntl64)
> +stub_warning (fcntl64)
>  
> -#include <sysdeps/unix/sysv/linux/fcntl.c>
> +weak_alias (__fcntl64, fcntl64)
> diff --git a/nptl/Makefile b/nptl/Makefile
> index 94be92c..13d485c 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -36,7 +36,7 @@ static-only-routines = pthread_atfork
>  # We need to provide certain routines for compatibility with existing
>  # binaries.
>  pthread-compat-wrappers = \
> -		      write read close fcntl accept \
> +		      write read close fcntl fcntl64 accept \
>  		      connect recv recvfrom send \
>  		      sendto fsync lseek lseek64 \
>  		      msync nanosleep open open64 pause \
> @@ -191,6 +191,7 @@ CFLAGS-sem_timedwait.c += -fexceptions -fasynchronous-unwind-tables
>  
>  # These are the function wrappers we have to duplicate here.
>  CFLAGS-fcntl.c += -fexceptions -fasynchronous-unwind-tables
> +CFLAGS-fcntl64.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-lockf.c += -fexceptions
>  CFLAGS-pread.c += -fexceptions -fasynchronous-unwind-tables
>  CFLAGS-pread64.c += -fexceptions -fasynchronous-unwind-tables
> diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c
> index 0b23164..598317d 100644
> --- a/sysdeps/mach/hurd/fcntl.c
> +++ b/sysdeps/mach/hurd/fcntl.c
> @@ -210,3 +210,8 @@ libc_hidden_def (__libc_fcntl)
>  weak_alias (__libc_fcntl, __fcntl)
>  libc_hidden_weak (__fcntl)
>  weak_alias (__libc_fcntl, fcntl)
> +
> +strong_alias (__libc_fcntl, __libc_fcntl64)
> +libc_hidden_def (__libc_fcntl64)
> +weak_alias (__libc_fcntl64, __fcntl64)
> +libc_hidden_weak (__fcntl64)
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index 2cb5070..3d46de7 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2033,6 +2033,8 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index 80cdb98..884d0df 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2131,3 +2131,4 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index c761f61..28d54b9 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2026,6 +2026,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist
> index 6aa58c3..dfde3bd 100644
> --- a/sysdeps/unix/sysv/linux/arm/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist
> @@ -115,6 +115,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c
> index a3cb2ae..ada922b 100644
> --- a/sysdeps/unix/sysv/linux/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/fcntl.c
> @@ -19,33 +19,12 @@
>  #include <stdarg.h>
>  #include <errno.h>
>  #include <sysdep-cancel.h>
> -#include <not-cancel.h>
>  
> -#ifndef __NR_fcntl64
> -# define __NR_fcntl64 __NR_fcntl
> -#endif
> +#ifndef __OFF_T_MATCHES_OFF64_T
>  
> -#ifndef FCNTL_ADJUST_CMD
> -# define FCNTL_ADJUST_CMD(__cmd) __cmd
> -#endif
> -
> -static int
> -fcntl_common (int fd, int cmd, void *arg)
> -{
> -  if (cmd == F_GETOWN)
> -    {
> -      INTERNAL_SYSCALL_DECL (err);
> -      struct f_owner_ex fex;
> -      int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex);
> -      if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> -	return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> -
> -      return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
> -								    err));
> -    }
> -
> -  return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg);
> -}
> +# ifndef FCNTL_ADJUST_CMD
> +#  define FCNTL_ADJUST_CMD(__cmd) __cmd
> +# endif
>  
>  int
>  __libc_fcntl (int fd, int cmd, ...)
> @@ -59,16 +38,71 @@ __libc_fcntl (int fd, int cmd, ...)
>  
>    cmd = FCNTL_ADJUST_CMD (cmd);
>  
> -  if (cmd == F_SETLKW || cmd == F_SETLKW64)
> -    return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg);
> -
> -  return fcntl_common (fd, cmd, arg);
> +  switch (cmd)
> +    {
> +      case F_SETLKW:
> +	return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
> +      case F_GETLK64:
> +      case F_OFD_GETLK:
> +	{
> +	  struct flock *flk = (struct flock *) arg;
> +	  struct flock64 flk64 =
> +	  {
> +	    .l_type = flk->l_type,
> +	    .l_whence = flk->l_whence,
> +	    .l_start = flk->l_start,
> +	    .l_len = flk->l_len,
> +	    .l_pid = flk->l_pid
> +	  };
> +	  int ret = SYSCALL_CANCEL (fcntl64, fd, cmd, &flk64);
> +	  if (ret == -1)
> +	    return -1;
> +	  flk->l_type = flk64.l_type;
> +	  flk->l_whence = flk64.l_whence;
> +	  flk->l_start = flk64.l_start;
> +	  flk->l_len = flk64.l_len;
> +	  flk->l_pid = flk64.l_pid;
> +	  return ret;
> +	}
> +      case F_SETLK64:
> +      case F_SETLKW64:
> +      case F_OFD_SETLK:
> +      case F_OFD_SETLKW:
> +	{
> +	  struct flock *flk = (struct flock *) arg;
> +	  struct flock64 flk64 =
> +	  {
> +	    .l_type = flk->l_type,
> +	    .l_whence = flk->l_whence,
> +	    .l_start = flk->l_start,
> +	    .l_len = flk->l_len,
> +	    .l_pid = flk->l_pid
> +	  };
> +	  return SYSCALL_CANCEL (fcntl64, fd, cmd, &flk64);
> +	}
> +      case F_GETOWN:
> +	{
> +	  INTERNAL_SYSCALL_DECL (err);
> +	  struct f_owner_ex fex;
> +	  int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex);
> +	    if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> +	  return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> +
> +	  return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
> +									    err));
> +	}
> +      default:
> +	return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, arg);
> +    }
>  }
>  libc_hidden_def (__libc_fcntl)
> +weak_alias (__libc_fcntl, __fcntl)
> +libc_hidden_weak (__fcntl)
>  
> -#if !IS_IN (rtld)
> +# include <shlib-compat.h>
> +# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_28)
>  int
> -__fcntl_nocancel (int fd, int cmd, ...)
> +__old_libc_fcntl64 (int fd, int cmd, ...)
>  {
>    va_list ap;
>    void *arg;
> @@ -77,13 +111,12 @@ __fcntl_nocancel (int fd, int cmd, ...)
>    arg = va_arg (ap, void *);
>    va_end (ap);
>  
> -  return fcntl_common (fd, cmd, arg);
> +  return __libc_fcntl64 (fd, cmd, arg);
>  }
> -#else
> -strong_alias (__libc_fcntl, __fcntl_nocancel)
> -#endif
> -libc_hidden_def (__fcntl_nocancel)
> -
> -weak_alias (__libc_fcntl, __fcntl)
> -libc_hidden_weak (__fcntl)
> +compat_symbol (libc, __old_libc_fcntl64, fcntl, GLIBC_2_0);
> +versioned_symbol (libc, __libc_fcntl, fcntl, GLIBC_2_28);
> +# else
>  weak_alias (__libc_fcntl, fcntl)
> +# endif
> +
> +#endif /* __OFF_T_MATCHES_OFF64_T  */
> diff --git a/sysdeps/unix/sysv/linux/fcntl64.c b/sysdeps/unix/sysv/linux/fcntl64.c
> new file mode 100644
> index 0000000..b7f50b0
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/fcntl64.c
> @@ -0,0 +1,99 @@
> +/* Manipulate file descriptor.  Linux LFS version.
> +   Copyright (C) 2018 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/>.  */
> +
> +#define fcntl __no_decl_fcntl
> +#define __fcntl __no_decl___fcntl
> +#include <fcntl.h>
> +#undef fcntl
> +#undef __fcntl
> +#include <stdarg.h>
> +#include <errno.h>
> +#include <sysdep-cancel.h>
> +
> +#ifndef __NR_fcntl64
> +# define __NR_fcntl64 __NR_fcntl
> +#endif
> +
> +#ifndef FCNTL_ADJUST_CMD
> +# define FCNTL_ADJUST_CMD(__cmd) __cmd
> +#endif
> +
> +static int
> +fcntl64_common (int fd, int cmd, void *arg)
> +{
> +  if (cmd == F_GETOWN)
> +    {
> +      INTERNAL_SYSCALL_DECL (err);
> +      struct f_owner_ex fex;
> +      int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex);
> +      if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> +	return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> +
> +      return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
> +								    err));
> +    }
> +
> +  return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg);
> +}
> +
> +int
> +__libc_fcntl64 (int fd, int cmd, ...)
> +{
> +  va_list ap;
> +  void *arg;
> +
> +  va_start (ap, cmd);
> +  arg = va_arg (ap, void *);
> +  va_end (ap);
> +
> +  cmd = FCNTL_ADJUST_CMD (cmd);
> +
> +  if (cmd == F_SETLKW || cmd == F_SETLKW64)
> +    return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg);
> +
> +  return fcntl64_common (fd, cmd, arg);
> +}
> +libc_hidden_def (__libc_fcntl64)
> +weak_alias (__libc_fcntl64, __fcntl64)
> +libc_hidden_weak (__fcntl64)
> +weak_alias (__libc_fcntl64, fcntl64)
> +
> +#ifdef __OFF_T_MATCHES_OFF64_T
> +weak_alias (__libc_fcntl64, __libc_fcntl)
> +weak_alias (__libc_fcntl64, __fcntl)
> +weak_alias (__libc_fcntl64, __GI___fcntl)
> +weak_alias (__libc_fcntl64, fcntl)
> +#endif
> +
> +#if !IS_IN (rtld)
> +int
> +__fcntl_nocancel (int fd, int cmd, ...)
> +{
> +  va_list ap;
> +  void *arg;
> +
> +  va_start (ap, cmd);
> +  arg = va_arg (ap, void *);
> +  va_end (ap);
> +
> +  return fcntl64_common (fd, cmd, arg);
> +}
> +#else
> +weak_alias (__libc_fcntl64, __fcntl_nocancel)
> +#endif
> +weak_alias (__fcntl_nocancel, __GI___fcntl_nocancel)
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index d10695b..06b00f7 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -1872,6 +1872,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 23092ab..1c1cc00 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2037,6 +2037,8 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 7bf259e..f6e17a0 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -1907,6 +1907,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 4673bcd..ee054a6 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -116,6 +116,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0x98
>  GLIBC_2.4 _IO_2_1_stdin_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 1f8ac40..227a058 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -1981,6 +1981,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> index 09277f5..18781b3 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist
> @@ -2122,3 +2122,5 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index f562e20..2d86989 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -1959,6 +1959,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index ceb7388..b8b113e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -1957,6 +1957,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 5765f48..6a3cd13 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -1965,6 +1965,8 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index a84bb45..596ec05 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -1961,6 +1961,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index e432959..8da18ee 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2163,3 +2163,5 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> index 503f562..dd8a7ea 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
> @@ -52,3 +52,12 @@
>  
>  #undef __ASSUME_CLONE_DEFAULT
>  #define __ASSUME_CLONE_BACKWARDS	1
> +
> +#ifdef __powerpc64__
> +# define FCNTL_ADJUST_CMD(__cmd)				\
> +  ({ int __cmdadj = (__cmd);					\
> +     if (__cmdadj >= F_GETLK64 && __cmdadj <= F_SETLKW64)	\
> +      __cmdadj -= F_GETLK64 - F_GETLK;				\
> +     __cmdadj;							\
> +  })
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index a5f2b23..555751e 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -1985,6 +1985,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index e4cbe36..80324e4 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -1989,6 +1989,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> index 9869feb..079bbb4 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
> @@ -2221,3 +2221,6 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 GLIBC_2.28 A
> +GLIBC_2.28 __fcntl64 F
> +GLIBC_2.28 fcntl64 F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> index e526dc4..15be314 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist
> @@ -116,6 +116,7 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 _Exit F
>  GLIBC_2.3 _IO_2_1_stderr_ D 0xe0
>  GLIBC_2.3 _IO_2_1_stdin_ D 0xe0
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index e6319ee..436b992 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2093,3 +2093,4 @@ GLIBC_2.27 xdrstdio_create F
>  GLIBC_2.27 xencrypt F
>  GLIBC_2.27 xprt_register F
>  GLIBC_2.27 xprt_unregister F
> +GLIBC_2.28 fcntl64 F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 41cdda0..f66715f 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -1994,6 +1994,8 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 8a756cf..bd62428 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -1900,6 +1900,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist
> index 999bddd..f2f070f 100644
> --- a/sysdeps/unix/sysv/linux/sh/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist
> @@ -1876,6 +1876,8 @@ GLIBC_2.27 wcstof32x F
>  GLIBC_2.27 wcstof32x_l F
>  GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 7c4296f..265087f 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -1988,6 +1988,8 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index dafe9d7..16a6981 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -1930,6 +1930,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index f72d494..fa8c198 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -1888,6 +1888,7 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
>  GLIBC_2.3 __ctype_b_loc F
>  GLIBC_2.3 __ctype_tolower_loc F
>  GLIBC_2.3 __ctype_toupper_loc F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 96c9fa0..2536971 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2139,3 +2139,4 @@ GLIBC_2.27 wcstof64 F
>  GLIBC_2.27 wcstof64_l F
>  GLIBC_2.27 wcstof64x F
>  GLIBC_2.27 wcstof64x_l F
> +GLIBC_2.28 fcntl64 F
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]