[1/2] Revert "linux: Move {f}xstat{at} to compat symbols"

Message ID 20201022190302.2000118-1-adhemerval.zanella@linaro.org
State Committed
Headers
Series [1/2] Revert "linux: Move {f}xstat{at} to compat symbols" |

Commit Message

Adhemerval Zanella Oct. 22, 2020, 7:03 p.m. UTC
  This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
moke {f}xstat{at} default symbols.  It also only builds them for
compat mode to avoid export them for newer ABIs that supports
the stat symbol, such as riscv32.

The idea is to not force static libraries built against old glibc
to update against new glibcs (since they reference the the
{f}xstat{at} symbols).

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 sysdeps/unix/sysv/linux/alpha/fxstat64.c      | 12 +----
 sysdeps/unix/sysv/linux/alpha/fxstatat64.c    |  9 +---
 sysdeps/unix/sysv/linux/alpha/lxstat64.c      | 12 +----
 sysdeps/unix/sysv/linux/alpha/xstat64.c       | 12 +----
 sysdeps/unix/sysv/linux/fxstat.c              | 29 +++++-------
 sysdeps/unix/sysv/linux/fxstat64.c            | 34 ++++++--------
 sysdeps/unix/sysv/linux/fxstatat.c            | 23 ++++-----
 sysdeps/unix/sysv/linux/fxstatat64.c          | 31 +++++-------
 sysdeps/unix/sysv/linux/lxstat.c              | 27 +++++------
 sysdeps/unix/sysv/linux/lxstat64.c            | 47 +++++++++----------
 sysdeps/unix/sysv/linux/mips/fxstat.c         |  8 ----
 sysdeps/unix/sysv/linux/mips/lxstat.c         |  8 ----
 .../unix/sysv/linux/mips/mips64/fxstat64.c    |  8 ----
 .../unix/sysv/linux/mips/mips64/fxstatat.c    |  8 ----
 .../unix/sysv/linux/mips/mips64/fxstatat64.c  |  8 ----
 .../unix/sysv/linux/mips/mips64/lxstat64.c    |  8 ----
 sysdeps/unix/sysv/linux/mips/mips64/xstat64.c |  9 +---
 sysdeps/unix/sysv/linux/mips/xstat.c          |  8 ----
 sysdeps/unix/sysv/linux/xstat.c               | 27 +++++------
 sysdeps/unix/sysv/linux/xstat64.c             | 43 ++++++++---------
 20 files changed, 122 insertions(+), 249 deletions(-)
  

Comments

Andreas Schwab Dec. 24, 2020, 11:51 a.m. UTC | #1
On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:

> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
> moke {f}xstat{at} default symbols.

That still doesn't work, __fxstat64 is missing from the static libc.

Andreas.
  
Florian Weimer Dec. 24, 2020, 12:11 p.m. UTC | #2
* Andreas Schwab:

> On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:
>
>> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
>> moke {f}xstat{at} default symbols.

How does this present itself as a problem?

Building against an older glibc for static linking against a future
glibc seems a rather fringe use case to me.
  
Andreas Schwab Dec. 24, 2020, 12:32 p.m. UTC | #3
On Dez 24 2020, Florian Weimer wrote:

> * Andreas Schwab:
>
>> On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:
>>
>>> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
>>> moke {f}xstat{at} default symbols.
>
> How does this present itself as a problem?

configure:3190: checking whether g++ can link programs
configure:3213: g++ -o conftest -g -O2   conftest.cpp  >&5
configure:3213: $? = 0
configure:3236: g++ -o conftest -g -O2   -static conftest.cpp  >&5
/usr/lib/gcc/i586-suse-linux/10/../../../../i586-suse-linux/bin/ld: /usr/lib/gc\
c/i586-suse-linux/10/libstdc++.a(basic_file.o): in function `std::__basic_file<\
char>::showmanyc()':
/usr/include/sys/stat.h:518: undefined reference to `__fxstat64'
collect2: error: ld returned 1 exit status

> Building against an older glibc for static linking against a future
> glibc seems a rather fringe use case to me.

That basically means you have to rebuild the world, due to the ubiquity
of stat etc.

Andreas.
  
Adhemerval Zanella Dec. 24, 2020, 1:11 p.m. UTC | #4
On 24/12/2020 09:32, Andreas Schwab wrote:
> On Dez 24 2020, Florian Weimer wrote:
> 
>> * Andreas Schwab:
>>
>>> On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:
>>>
>>>> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
>>>> moke {f}xstat{at} default symbols.
>>
>> How does this present itself as a problem?
> 
> configure:3190: checking whether g++ can link programs
> configure:3213: g++ -o conftest -g -O2   conftest.cpp  >&5
> configure:3213: $? = 0
> configure:3236: g++ -o conftest -g -O2   -static conftest.cpp  >&5
> /usr/lib/gcc/i586-suse-linux/10/../../../../i586-suse-linux/bin/ld: /usr/lib/gc\
> c/i586-suse-linux/10/libstdc++.a(basic_file.o): in function `std::__basic_file<\
> char>::showmanyc()':
> /usr/include/sys/stat.h:518: undefined reference to `__fxstat64'
> collect2: error: ld returned 1 exit status
> 
>> Building against an older glibc for static linking against a future
>> glibc seems a rather fringe use case to me.
> 
> That basically means you have to rebuild the world, due to the ubiquity
> of stat etc.

Right, I think it would be safe for 2.33 to still keep providing the xstat
symbols for static.  I will send a patch.
  
Florian Weimer Dec. 24, 2020, 2:28 p.m. UTC | #5
* Andreas Schwab:

> On Dez 24 2020, Florian Weimer wrote:
>
>> * Andreas Schwab:
>>
>>> On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:
>>>
>>>> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
>>>> moke {f}xstat{at} default symbols.
>>
>> How does this present itself as a problem?
>
> configure:3190: checking whether g++ can link programs
> configure:3213: g++ -o conftest -g -O2   conftest.cpp  >&5
> configure:3213: $? = 0
> configure:3236: g++ -o conftest -g -O2   -static conftest.cpp  >&5
> /usr/lib/gcc/i586-suse-linux/10/../../../../i586-suse-linux/bin/ld: /usr/lib/gc\
> c/i586-suse-linux/10/libstdc++.a(basic_file.o): in function `std::__basic_file<\
> char>::showmanyc()':
> /usr/include/sys/stat.h:518: undefined reference to `__fxstat64'
> collect2: error: ld returned 1 exit status

Is this our g++ linker test?

Testing static linking against libstdc++ is somewhat unusual.

>> Building against an older glibc for static linking against a future
>> glibc seems a rather fringe use case to me.
>
> That basically means you have to rebuild the world, due to the ubiquity
> of stat etc.

Is static linking really that prevalent?

But I had not considered the libstdc++ case.  So maybe we need to
preserve these symbols for a while, even for static linking.
  
Adhemerval Zanella Dec. 24, 2020, 2:48 p.m. UTC | #6
On 24/12/2020 11:28, Florian Weimer wrote:
> * Andreas Schwab:
> 
>> On Dez 24 2020, Florian Weimer wrote:
>>
>>> * Andreas Schwab:
>>>
>>>> On Okt 22 2020, Adhemerval Zanella via Libc-alpha wrote:
>>>>
>>>>> This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 to
>>>>> moke {f}xstat{at} default symbols.
>>>
>>> How does this present itself as a problem?
>>
>> configure:3190: checking whether g++ can link programs
>> configure:3213: g++ -o conftest -g -O2   conftest.cpp  >&5
>> configure:3213: $? = 0
>> configure:3236: g++ -o conftest -g -O2   -static conftest.cpp  >&5
>> /usr/lib/gcc/i586-suse-linux/10/../../../../i586-suse-linux/bin/ld: /usr/lib/gc\
>> c/i586-suse-linux/10/libstdc++.a(basic_file.o): in function `std::__basic_file<\
>> char>::showmanyc()':
>> /usr/include/sys/stat.h:518: undefined reference to `__fxstat64'
>> collect2: error: ld returned 1 exit status
> 
> Is this our g++ linker test?
> 
> Testing static linking against libstdc++ is somewhat unusual.
> 
>>> Building against an older glibc for static linking against a future
>>> glibc seems a rather fringe use case to me.
>>
>> That basically means you have to rebuild the world, due to the ubiquity
>> of stat etc.
> 
> Is static linking really that prevalent?
> 
> But I had not considered the libstdc++ case.  So maybe we need to
> preserve these symbols for a while, even for static linking.
> 

I saw this issue when making the patch for riscv32, where the old toolchain
libstdc++ was configured to use the xstat symbols (I had to bootstrap the
toolchain).
  
Florian Weimer Dec. 24, 2020, 3:21 p.m. UTC | #7
* Adhemerval Zanella via Libc-alpha:

> I saw this issue when making the patch for riscv32, where the old toolchain
> libstdc++ was configured to use the xstat symbols (I had to bootstrap the
> toolchain).

Independently of the present issue, we should probably make the C++
configure tests in glibc more fine-grained, so that most C++ tests
will work even if statically linking libstdc++ fails.
  

Patch

diff --git a/sysdeps/unix/sysv/linux/alpha/fxstat64.c b/sysdeps/unix/sysv/linux/alpha/fxstat64.c
index bcfb55050c..9d6b8eca32 100644
--- a/sysdeps/unix/sysv/linux/alpha/fxstat64.c
+++ b/sysdeps/unix/sysv/linux/alpha/fxstat64.c
@@ -22,11 +22,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __fxstat64 (int vers, int fd, struct stat64 *buf)
 {
   switch (vers)
@@ -44,12 +42,4 @@  __fxstat64 (int vers, int fd, struct stat64 *buf)
       }
     }
 }
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
-strong_alias (__fxstat64, __fxstat_compat)
-compat_symbol (libc, __fxstat_compat, __fxstat, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_33)
-compat_symbol (libc, __fxstat64, __fxstat64, GLIBC_2_1);
-#endif
+strong_alias (__fxstat64, __fxstat);
diff --git a/sysdeps/unix/sysv/linux/alpha/fxstatat64.c b/sysdeps/unix/sysv/linux/alpha/fxstatat64.c
index fa3074eeca..997fb87ac6 100644
--- a/sysdeps/unix/sysv/linux/alpha/fxstatat64.c
+++ b/sysdeps/unix/sysv/linux/alpha/fxstatat64.c
@@ -22,18 +22,11 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
 
-#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
 {
   return INLINE_SYSCALL_CALL (fstatat64, fd, file, st, flag);
 }
-strong_alias (__fxstatat64, __fxstatat_compat)
-compat_symbol (libc, __fxstatat_compat, __fxstatat, GLIBC_2_4);
-
-compat_symbol (libc, __fxstatat64, __fxstatat64, GLIBC_2_4);
-#endif
+strong_alias (__fxstatat64, __fxstatat);
diff --git a/sysdeps/unix/sysv/linux/alpha/lxstat64.c b/sysdeps/unix/sysv/linux/alpha/lxstat64.c
index 7424b2f621..38f132f15e 100644
--- a/sysdeps/unix/sysv/linux/alpha/lxstat64.c
+++ b/sysdeps/unix/sysv/linux/alpha/lxstat64.c
@@ -23,11 +23,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __lxstat64 (int vers, const char *name, struct stat64 *buf)
 {
   switch (vers)
@@ -45,12 +43,4 @@  __lxstat64 (int vers, const char *name, struct stat64 *buf)
       }
     }
 }
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
-strong_alias (__lxstat64, __lxstat_compat)
-compat_symbol (libc, __lxstat_compat, __lxstat, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_33)
-compat_symbol (libc, __lxstat64, __lxstat64, GLIBC_2_1);
-#endif
+weak_alias (__lxstat64, __lxstat);
diff --git a/sysdeps/unix/sysv/linux/alpha/xstat64.c b/sysdeps/unix/sysv/linux/alpha/xstat64.c
index 59f7ddae7f..c856c95dc5 100644
--- a/sysdeps/unix/sysv/linux/alpha/xstat64.c
+++ b/sysdeps/unix/sysv/linux/alpha/xstat64.c
@@ -23,11 +23,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __xstat64 (int vers, const char *name, struct stat64 *buf)
 {
   switch (vers)
@@ -45,12 +43,4 @@  __xstat64 (int vers, const char *name, struct stat64 *buf)
       }
     }
 }
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
-strong_alias (__xstat64, __xstat_compat)
-compat_symbol (libc, __xstat_compat, __xstat, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_33)
-compat_symbol (libc, __xstat64, __xstat64, GLIBC_2_1);
-#endif
+weak_alias (__xstat64, __xstat);
diff --git a/sysdeps/unix/sysv/linux/fxstat.c b/sysdeps/unix/sysv/linux/fxstat.c
index 649bb95252..c2c28b9096 100644
--- a/sysdeps/unix/sysv/linux/fxstat.c
+++ b/sysdeps/unix/sysv/linux/fxstat.c
@@ -20,49 +20,46 @@ 
 #include <fcntl.h>
 #include <kernel_stat.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
-#if !XSTAT_IS_XSTAT64
-# include <xstatconv.h>
-# include <xstatover.h>
-# include <shlib-compat.h>
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
-# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
+# if !XSTAT_IS_XSTAT64
+#  include <xstatconv.h>
+#  include <xstatover.h>
 
 /* Get information about the file FD in BUF.  */
 int
-attribute_compat_text_section
 __fxstat (int vers, int fd, struct stat *buf)
 {
   switch (vers)
     {
     case _STAT_VER_KERNEL:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	/* New kABIs which uses generic pre 64-bit time Linux ABI,
 	   e.g. csky, nios2  */
 	int r = INLINE_SYSCALL_CALL (fstat64, fd, buf);
 	return r ?: stat_overflow (buf);
-# else
+#  else
 	/* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
 	   microblaze, s390, sh, powerpc, and sparc.  */
 	return INLINE_SYSCALL_CALL (fstat, fd, buf);
-# endif
+#  endif
       }
 
     default:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-# else
+#  else
 	struct stat64 buf64;
 	int r = INLINE_SYSCALL_CALL (fstat64, fd, &buf64);
 	return r ?: __xstat32_conv (vers, &buf64, buf);
-#endif
+# endif
       }
     }
 }
+# endif /* XSTAT_IS_XSTAT64  */
 
-compat_symbol (libc, __fxstat, __fxstat, GLIBC_2_0);
-# endif /* SHLIB_COMPAT  */
-
-#endif /* XSTAT_IS_XSTAT64  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/fxstat64.c b/sysdeps/unix/sysv/linux/fxstat64.c
index 4bd926bf01..a80b3fd4a3 100644
--- a/sysdeps/unix/sysv/linux/fxstat64.c
+++ b/sysdeps/unix/sysv/linux/fxstat64.c
@@ -27,15 +27,13 @@ 
 #include <shlib-compat.h>
 
 #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
-
 /* Get information about the file FD in BUF.  */
 
 int
-attribute_compat_text_section
 ___fxstat64 (int vers, int fd, struct stat64 *buf)
 {
-#if XSTAT_IS_XSTAT64
-# ifdef __NR_fstat64
+# if XSTAT_IS_XSTAT64
+#  ifdef __NR_fstat64
   /* 64-bit kABI outlier, e.g. sparc64.  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (fstat, fd, buf);
@@ -45,13 +43,13 @@  ___fxstat64 (int vers, int fd, struct stat64 *buf)
       int r = INLINE_SYSCALL_CALL (fstat64, fd, &st64);
       return r ?: __xstat32_conv (vers, &st64, (struct stat *) buf);
     }
-# elif defined __NR_fstat
+#  elif defined __NR_fstat
   /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64,
      and x86_64.  */
   if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
     return INLINE_SYSCALL_CALL (fstat, fd, buf);
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-# else
+#  else
   /* New 32-bit kABIs with only 64-bit time_t support, e.g. arc, riscv32.  */
   struct statx tmp;
   int r = INLINE_SYSCALL_CALL (statx, fd, "", AT_EMPTY_PATH,
@@ -59,26 +57,24 @@  ___fxstat64 (int vers, int fd, struct stat64 *buf)
   if (r == 0)
     __cp_stat64_statx (buf, &tmp);
   return r;
-# endif
-#else
+#  endif
+# else
   /* All kABIs with non-LFS support, e.g. arm, csky, i386, hppa, m68k,
      microblaze, mips32, nios2, sh, powerpc32, and sparc32.  */
   return INLINE_SYSCALL_CALL (fstat64, fd, buf);
-#endif /* XSTAT_IS_XSTAT64  */
+# endif /* XSTAT_IS_XSTAT64  */
 }
 
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
-compat_symbol (libc, ___fxstat64, __fxstat64, GLIBC_2_2);
+# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+versioned_symbol (libc, ___fxstat64, __fxstat64, GLIBC_2_2);
 strong_alias (___fxstat64, __old__fxstat64)
 compat_symbol (libc, __old__fxstat64, __fxstat64, GLIBC_2_1);
-#else
+# else
 strong_alias (___fxstat64, __fxstat64)
-compat_symbol (libc, ___fxstat64, __fxstat64, GLIBC_2_2);
-#endif
+# endif
 
-#if XSTAT_IS_XSTAT64
-strong_alias (___fxstat64, __fxstat_compat)
-compat_symbol (libc, __fxstat_compat, __fxstat, GLIBC_2_2);
-#endif
+# if XSTAT_IS_XSTAT64
+strong_alias (__fxstat64, __fxstat);
+# endif
 
-#endif /* SHLIB_COMPAT  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/fxstatat.c b/sysdeps/unix/sysv/linux/fxstatat.c
index 2083e18eac..186d9bf7af 100644
--- a/sysdeps/unix/sysv/linux/fxstatat.c
+++ b/sysdeps/unix/sysv/linux/fxstatat.c
@@ -20,20 +20,19 @@ 
 #include <fcntl.h>
 #include <kernel_stat.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
-#if !XSTAT_IS_XSTAT64
-# include <xstatconv.h>
-# include <xstatover.h>
-# include <shlib-compat.h>
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
-# if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
+# if !XSTAT_IS_XSTAT64
+#  include <xstatconv.h>
+#  include <xstatover.h>
 
 /* Get information about the file FD in BUF.  */
 int
-attribute_compat_text_section
 __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
 {
-#if STAT_IS_KERNEL_STAT
+# if STAT_IS_KERNEL_STAT
   /* New kABIs which uses generic pre 64-bit time Linux ABI, e.g.
      csky, nios2  */
   if (vers == _STAT_VER_KERNEL)
@@ -42,16 +41,14 @@  __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
       return r ?: stat_overflow (st);
     }
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-#else
+# else
   /* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k, mips32,
      microblaze, s390, sh, powerpc32, and sparc32.  */
   struct stat64 st64;
   int r = INLINE_SYSCALL_CALL (fstatat64, fd, file, &st64, flag);
   return r ?: __xstat32_conv (vers, &st64, st);
-#endif
+# endif
 }
+# endif /* XSTAT_IS_XSTAT64  */
 
-compat_symbol (libc, __fxstatat, __fxstatat, GLIBC_2_4);
-# endif /* SHLIB_COMPAT  */
-
-#endif /* XSTAT_IS_XSTAT64  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/fxstatat64.c b/sysdeps/unix/sysv/linux/fxstatat64.c
index 8a505451d9..7b214dfc14 100644
--- a/sysdeps/unix/sysv/linux/fxstatat64.c
+++ b/sysdeps/unix/sysv/linux/fxstatat64.c
@@ -26,26 +26,25 @@ 
 #include <statx_cp.h>
 #include <shlib-compat.h>
 
-#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
-
 /* Get information about the file FD in BUF.  */
 
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
+
 int
-attribute_compat_text_section
 __fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
 {
-#if XSTAT_IS_XSTAT64
-# ifdef __NR_newfstatat
+# if XSTAT_IS_XSTAT64
+#  ifdef __NR_newfstatat
   /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and
      x86_64.  */
   if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
     return INLINE_SYSCALL_CALL (newfstatat, fd, file, st, flag);
-# elif defined __NR_fstatat64
+#  elif defined __NR_fstatat64
   /* 64-bit kABI outlier, e.g. sparc64.  */
   struct stat64 st64;
   int r = INLINE_SYSCALL_CALL (fstatat64, fd, file, &st64, flag);
   return r ?: __xstat32_conv (vers, &st64, (struct stat *) st);
-# else
+#  else
   /* New 32-bit kABIs with only 64-bit time_t support, e.g. arc, riscv32.  */
   if (vers == _STAT_VER_KERNEL)
     {
@@ -56,21 +55,17 @@  __fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
 	__cp_stat64_statx (st, &tmp);
       return r;
     }
-# endif
-#else
+#  endif
+# else
   /* All kABIs with non-LFS support, e.g. arm, csky, i386, hppa, m68k,
      microblaze, mips32, nios2, sh, powerpc32, and sparc32.  */
   if (vers == _STAT_VER_LINUX)
     return INLINE_SYSCALL_CALL (fstatat64, fd, file, st, flag);
-#endif
+# endif
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
 }
+# if XSTAT_IS_XSTAT64
+strong_alias (__fxstatat64, __fxstatat);
+# endif
 
-compat_symbol (libc, __fxstatat64, __fxstatat64, GLIBC_2_4);
-
-#if XSTAT_IS_XSTAT64
-strong_alias (__fxstatat64, __fxstatat_compat)
-compat_symbol (libc, __fxstatat_compat, __fxstatat, GLIBC_2_4);
-#endif
-
-#endif /* SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/lxstat.c b/sysdeps/unix/sysv/linux/lxstat.c
index 913618eab9..8d55a63057 100644
--- a/sysdeps/unix/sysv/linux/lxstat.c
+++ b/sysdeps/unix/sysv/linux/lxstat.c
@@ -22,48 +22,45 @@ 
 #include <sysdep.h>
 #include <shlib-compat.h>
 
-#if !XSTAT_IS_XSTAT64
-# include <xstatconv.h>
-# include <xstatover.h>
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
-# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
+# if !XSTAT_IS_XSTAT64
+#  include <xstatconv.h>
+#  include <xstatover.h>
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __lxstat (int vers, const char *name, struct stat *buf)
 {
   switch (vers)
     {
     case _STAT_VER_KERNEL:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	/* New kABIs which uses generic pre 64-bit time Linux ABI,
 	   e.g. csky, nios2  */
 	int r = INLINE_SYSCALL_CALL (fstatat64, AT_FDCWD, name, buf,
 				     AT_SYMLINK_NOFOLLOW);
 	return r ?: stat_overflow (buf);
-# else
+#  else
 	/* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
 	   microblaze, s390, sh, powerpc, and sparc.  */
 	return INLINE_SYSCALL_CALL (lstat, name, buf);
-# endif
+#  endif
       }
 
     default:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-# else
+#  else
 	struct stat64 buf64;
 	int r = INLINE_SYSCALL_CALL (lstat64, name, &buf64);
 	return r ?: __xstat32_conv (vers, &buf64, buf);
-#endif
+#  endif
       }
     }
 }
+# endif /* XSTAT_IS_XSTAT64  */
 
-compat_symbol (libc, __lxstat, __lxstat, GLIBC_2_0);
-# endif /* SHLIB_COMPAT  */
-
-#endif /* XSTAT_IS_XSTAT64  */
+#endif /* #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/lxstat64.c b/sysdeps/unix/sysv/linux/lxstat64.c
index 277b54b305..3f11501c62 100644
--- a/sysdeps/unix/sysv/linux/lxstat64.c
+++ b/sysdeps/unix/sysv/linux/lxstat64.c
@@ -26,16 +26,14 @@ 
 #include <statx_cp.h>
 #include <shlib-compat.h>
 
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_33)
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
-
 int
-attribute_compat_text_section
 ___lxstat64 (int vers, const char *name, struct stat64 *buf)
 {
-#if XSTAT_IS_XSTAT64
-# ifdef __NR_lstat64
+# if XSTAT_IS_XSTAT64
+#  ifdef __NR_lstat64
   /* 64-bit kABI outlier, e.g. sparc64.  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (lstat, name, buf);
@@ -45,16 +43,16 @@  ___lxstat64 (int vers, const char *name, struct stat64 *buf)
       int r = INLINE_SYSCALL_CALL (lstat64, name, &st64);
       return r ?: __xstat32_conv (vers, &st64, (struct stat *) buf);
     }
-# elif defined __NR_lstat
+#  elif defined __NR_lstat
   /* Old 64-bit kABI, e.g. ia64, powerpc64*, s390x, and x86_64.  */
   if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
     return INLINE_SYSCALL_CALL (lstat, name, buf);
-# elif defined __NR_newfstatat
+#  elif defined __NR_newfstatat
   /* New kABIs which uses generic 64-bit Linux ABI, e.g. aarch64, riscv64.  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (newfstatat, AT_FDCWD, name, buf,
 				AT_SYMLINK_NOFOLLOW);
-# else
+#  else
   /* New 32-bit kABIs with only 64-bit time_t support, e.g. arc, riscv32.  */
   if (vers == _STAT_VER_KERNEL)
     {
@@ -66,36 +64,35 @@  ___lxstat64 (int vers, const char *name, struct stat64 *buf)
 	__cp_stat64_statx (buf, &tmp);
       return r;
      }
-# endif
-#else
-# if STAT_IS_KERNEL_STAT
+#  endif
+# else
+#  if STAT_IS_KERNEL_STAT
   /* New kABIs which uses generic pre 64-bit time Linux ABI,
      e.g. csky, nios2  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (fstatat64, AT_FDCWD, name, buf,
 				AT_SYMLINK_NOFOLLOW);
-# else
+#  else
   /* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
      microblaze, s390, sh, mips32, powerpc32, and sparc32.  */
   return INLINE_SYSCALL_CALL (lstat64, name, buf);
-# endif /* STAT_IS_KERNEL_STAT  */
-#endif /* XSTAT_IS_XSTAT64  */
+#  endif /* STAT_IS_KERNEL_STAT  */
+# endif /* XSTAT_IS_XSTAT64  */
 
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
 }
 
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
-compat_symbol (libc, ___lxstat64, __lxstat64, GLIBC_2_2);
+# if XSTAT_IS_XSTAT64
+weak_alias (___lxstat64, __lxstat);
+weak_alias (___lxstat64, __GI___lxstat);
+# endif
+
+# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+versioned_symbol (libc, ___lxstat64, __lxstat64, GLIBC_2_2);
 strong_alias (___lxstat64, __old__lxstat64)
 compat_symbol (libc, __old__lxstat64, __lxstat64, GLIBC_2_1);
-#else
+# else
 strong_alias (___lxstat64, __lxstat64);
-compat_symbol (libc, ___lxstat64, __lxstat64, GLIBC_2_2);
-#endif
-
-#if XSTAT_IS_XSTAT64
-strong_alias (___lxstat64,__lxstat_compat)
-compat_symbol (libc, __lxstat_compat, __lxstat, GLIBC_2_2);
-#endif
+# endif
 
-#endif /* SHLIB_COMPAT  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */
diff --git a/sysdeps/unix/sysv/linux/mips/fxstat.c b/sysdeps/unix/sysv/linux/mips/fxstat.c
index cb9f656628..4585c2362b 100644
--- a/sysdeps/unix/sysv/linux/mips/fxstat.c
+++ b/sysdeps/unix/sysv/linux/mips/fxstat.c
@@ -21,13 +21,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __fxstat (int vers, int fd, struct stat *buf)
 {
   switch (vers)
@@ -43,7 +39,3 @@  __fxstat (int vers, int fd, struct stat *buf)
       }
     }
 }
-
-compat_symbol (libc, __fxstat, __fxstat, GLIBC_2_0);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/lxstat.c b/sysdeps/unix/sysv/linux/mips/lxstat.c
index ebd05cca50..62a3b15b32 100644
--- a/sysdeps/unix/sysv/linux/mips/lxstat.c
+++ b/sysdeps/unix/sysv/linux/mips/lxstat.c
@@ -21,13 +21,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __lxstat (int vers, const char *name, struct stat *buf)
 {
   switch (vers)
@@ -43,7 +39,3 @@  __lxstat (int vers, const char *name, struct stat *buf)
       }
     }
 }
-
-compat_symbol (libc, __lxstat, __lxstat, GLIBC_2_0);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/fxstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/fxstat64.c
index 855c650814..e6c1cacd4b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/fxstat64.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/fxstat64.c
@@ -20,14 +20,10 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_33)
 
 /* Get information about the file FD in BUF.  */
 
 int
-attribute_compat_text_section
 __fxstat64 (int vers, int fd, struct stat64 *buf)
 {
   struct kernel_stat kbuf;
@@ -35,7 +31,3 @@  __fxstat64 (int vers, int fd, struct stat64 *buf)
   return r ?: __xstat64_conv (vers, &kbuf, buf);
 
 }
-
-compat_symbol (libc, __fxstat64, __fxstat64, GLIBC_2_2);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/fxstatat.c b/sysdeps/unix/sysv/linux/mips/mips64/fxstatat.c
index 1c1fbb02c2..e384dbab8b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/fxstatat.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/fxstatat.c
@@ -21,20 +21,12 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
 
 /* Get information about the file FD in BUF.  */
 int
-attribute_compat_text_section
 __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag)
 {
   struct kernel_stat kst;
   int r = INLINE_SYSCALL_CALL (newfstatat, fd, file, &kst, flag);
   return r ?: __xstat_conv (vers, &kst, st);
 }
-
-compat_symbol (libc, __fxstatat, __fxstatat, GLIBC_2_4);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c b/sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c
index f40a2c5aa8..cfd172d301 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c
@@ -19,14 +19,10 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
 
 int
-attribute_compat_text_section
 __fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
 {
   if (vers == _STAT_VER_LINUX)
@@ -37,7 +33,3 @@  __fxstatat64 (int vers, int fd, const char *file, struct stat64 *st, int flag)
     }
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
 }
-
-compat_symbol (libc, __fxstatat64, __fxstatat64, GLIBC_2_4);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/lxstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/lxstat64.c
index 752c5284a7..0f3934f8c8 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/lxstat64.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/lxstat64.c
@@ -20,20 +20,12 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __lxstat64 (int vers, const char *name, struct stat64 *buf)
 {
   struct kernel_stat kbuf;
   int r = INLINE_SYSCALL_CALL (lstat, name, &kbuf);
   return r ?: __xstat64_conv (vers, &kbuf, buf);
 }
-
-compat_symbol (libc, __lxstat64, __lxstat64, GLIBC_2_2);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/xstat64.c b/sysdeps/unix/sysv/linux/mips/mips64/xstat64.c
index a620ba2f1f..64d2952276 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/xstat64.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/xstat64.c
@@ -20,20 +20,13 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
+
 int
-attribute_compat_text_section
 __xstat64 (int vers, const char *name, struct stat64 *buf)
 {
   struct kernel_stat kbuf;
   int r = INLINE_SYSCALL_CALL (stat, name, &kbuf);
   return r ?: __xstat64_conv (vers, &kbuf, buf);
 }
-
-compat_symbol (libc, __xstat64, __xstat64, GLIBC_2_2);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/mips/xstat.c b/sysdeps/unix/sysv/linux/mips/xstat.c
index 0748a3422d..d6ff5ccbe0 100644
--- a/sysdeps/unix/sysv/linux/mips/xstat.c
+++ b/sysdeps/unix/sysv/linux/mips/xstat.c
@@ -21,13 +21,9 @@ 
 #include <kernel_stat.h>
 #include <sysdep.h>
 #include <xstatconv.h>
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __xstat (int vers, const char *name, struct stat *buf)
 {
   switch (vers)
@@ -43,7 +39,3 @@  __xstat (int vers, const char *name, struct stat *buf)
       }
     }
 }
-
-compat_symbol (libc, __xstat, __xstat, GLIBC_2_0);
-
-#endif
diff --git a/sysdeps/unix/sysv/linux/xstat.c b/sysdeps/unix/sysv/linux/xstat.c
index 3eb2d8c51b..8e4d9929e2 100644
--- a/sysdeps/unix/sysv/linux/xstat.c
+++ b/sysdeps/unix/sysv/linux/xstat.c
@@ -22,47 +22,44 @@ 
 #include <sysdep.h>
 #include <shlib-compat.h>
 
-#if !XSTAT_IS_XSTAT64
-# include <xstatconv.h>
-# include <xstatover.h>
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
-# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
+# if !XSTAT_IS_XSTAT64
+#  include <xstatconv.h>
+#  include <xstatover.h>
 
 /* Get information about the file NAME in BUF.  */
 int
-attribute_compat_text_section
 __xstat (int vers, const char *name, struct stat *buf)
 {
   switch (vers)
     {
     case _STAT_VER_KERNEL:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	/* New kABIs which uses generic pre 64-bit time Linux ABI,
 	   e.g. csky, nios2  */
 	int r = INLINE_SYSCALL_CALL (fstatat64, AT_FDCWD, name, buf, 0);
 	return r ?: stat_overflow (buf);
-# else
+#  else
 	/* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
 	   microblaze, s390, sh, powerpc, and sparc32.  */
 	return INLINE_SYSCALL_CALL (stat, name, buf);
-# endif
+#  endif
       }
 
     default:
       {
-# if STAT_IS_KERNEL_STAT
+#  if STAT_IS_KERNEL_STAT
 	return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-# else
+#  else
 	struct stat64 buf64;
 	int r = INLINE_SYSCALL_CALL (stat64, name, &buf64);
 	return r ?: __xstat32_conv (vers, &buf64, buf);
-#endif
+#  endif
       }
     }
 }
+# endif /* XSTAT_IS_XSTAT64  */
 
-compat_symbol (libc, __xstat, __xstat, GLIBC_2_0);
-# endif /* SHLIB_COMPAT  */
-
-#endif /* XSTAT_IS_XSTAT64  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33) */
diff --git a/sysdeps/unix/sysv/linux/xstat64.c b/sysdeps/unix/sysv/linux/xstat64.c
index dd4f808c7a..27d6a876e8 100644
--- a/sysdeps/unix/sysv/linux/xstat64.c
+++ b/sysdeps/unix/sysv/linux/xstat64.c
@@ -29,13 +29,11 @@ 
 #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
 
 /* Get information about the file NAME in BUF.  */
-
 int
-attribute_compat_text_section
 ___xstat64 (int vers, const char *name, struct stat64 *buf)
 {
-#if XSTAT_IS_XSTAT64
-# ifdef __NR_stat64
+# if XSTAT_IS_XSTAT64
+#  ifdef __NR_stat64
   /* 64-bit kABI outlier, e.g. sparc64.  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (stat, name, buf);
@@ -45,15 +43,15 @@  ___xstat64 (int vers, const char *name, struct stat64 *buf)
       int r = INLINE_SYSCALL_CALL (stat64, name, &st64);
       return r ?: __xstat32_conv (vers, &st64, (struct stat *) buf);
     }
-# elif defined __NR_stat
+#  elif defined __NR_stat
   /* Old 64-bit kABI, e.g. ia64, powerpc64*, s390x, and x86_64.  */
   if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
     return INLINE_SYSCALL_CALL (stat, name, buf);
-# elif defined __NR_newfstatat
+#  elif defined __NR_newfstatat
   /* New kABIs which uses generic 64-bit Linux ABI, e.g. aarch64, riscv64.  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (newfstatat, AT_FDCWD, name, buf, 0);
-# else
+#  else
   /* New 32-bit kABIs with only 64-bit time_t support, e.g. arc, riscv32.  */
   if (vers == _STAT_VER_KERNEL)
     {
@@ -64,35 +62,34 @@  ___xstat64 (int vers, const char *name, struct stat64 *buf)
 	__cp_stat64_statx (buf, &tmp);
       return r;
      }
-# endif
-#else
-# if STAT_IS_KERNEL_STAT
+#  endif
+# else
+#  if STAT_IS_KERNEL_STAT
   /* New kABIs which uses generic pre 64-bit time Linux ABI,
      e.g. csky, nios2  */
   if (vers == _STAT_VER_KERNEL)
     return INLINE_SYSCALL_CALL (fstatat64, AT_FDCWD, name, buf, 0);
-# else
+#  else
   /* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
      microblaze, s390, sh, mips32, powerpc32, and sparc32.  */
   return INLINE_SYSCALL_CALL (stat64, name, buf);
-# endif /* STAT_IS_KERNEL_STAT  */
-#endif /* XSTAT_IS_XSTAT64  */
+#  endif /* STAT_IS_KERNEL_STAT  */
+# endif /* XSTAT_IS_XSTAT64  */
 
   return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
 }
 
-#if XSTAT_IS_XSTAT64
-strong_alias (___xstat64, __xstat_compat)
-compat_symbol (libc, __xstat_compat, __xstat, GLIBC_2_2);
-#endif
+# if XSTAT_IS_XSTAT64
+weak_alias (___xstat64, __xstat);
+weak_alias (___xstat64, __GI___xstat);
+# endif
 
-#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
-compat_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
+# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+versioned_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
 strong_alias (___xstat64, __old__xstat64)
 compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1);
-#else
+# else
 strong_alias (___xstat64, __xstat64)
-compat_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
-#endif
+# endif
 
-#endif /* SHLIB_COMPAT  */
+#endif /* SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)  */