[PATCH v2] io: fix ftw ABI on MIPS n64
Xi Ruoyao
xry111@xry111.site
Tue Jul 21 19:58:36 GMT 2026
On MIPS n64 off_t is same as off64_t, but struct stat is not same as
struct stat64 (very peculiar but see the "as tempting as it..." comment
in linux/mips/kernel_stat.h). As the ftw/ftw64 callback accepts a
pointer to a function who accepts struct stat/stat64, for MIPS n64 we
must use different implementations for ftw and ftw64.
Thus for testing if ftw64 can be aliased to ftw, we should check
XSTAT_IS_XSTAT64 instead of __OFF_T_MATCHES_OFF64_T.
This resolves the io/tst-ftw-lnk failure observed on MIPS n64.
Link: https://sourceware.org/glibc/wiki/Testing/Tests/io/tst-ftw-lnk
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
Tested on x86_64-linux and mips64-linux. No new failures were found,
and the aliasing of ftw ftw64 is as expected. On x86_64:
$ objdump -t libc.so.6 | grep ' ftw(64)?$' -E
00000000001094e0 w F .text 000000000000000f ftw
00000000001094e0 w F .text 000000000000000f ftw64
On mips64:
$ objdump -t libc.so.6 | grep ' ftw(64)?$' -E
000000000013a908 g F .text 0000000000000028 ftw
000000000013bff0 w F .text 0000000000000028 ftw64
io/ftw.c | 4 ++--
io/ftw64.c | 3 ++-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/io/ftw.c b/io/ftw.c
index ed0eeb3904..c759701372 100644
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -16,9 +16,9 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <sys/types.h>
+#include <kernel_stat.h>
-#ifndef __OFF_T_MATCHES_OFF64_T
+#if !XSTAT_IS_XSTAT64
# include "ftw-common.c"
versioned_symbol (libc, __new_nftw, nftw, GLIBC_2_3_3);
diff --git a/io/ftw64.c b/io/ftw64.c
index d3cd14c21a..fc36f97e7e 100644
--- a/io/ftw64.c
+++ b/io/ftw64.c
@@ -31,6 +31,7 @@
#define ftw __rename_ftw
#define nftw __rename_nftw
+#include <kernel_stat.h>
#include <shlib-compat.h>
#include "ftw-common.c"
@@ -44,7 +45,7 @@ versioned_symbol (libc, __new_nftw64, nftw64, GLIBC_2_3_3);
compat_symbol (libc, __old_nftw64, nftw64, GLIBC_2_1);
#endif
-#ifdef __OFF_T_MATCHES_OFF64_T
+#if XSTAT_IS_XSTAT64
weak_alias (__ftw64, ftw)
versioned_symbol (libc, __new_nftw64, nftw, GLIBC_2_3_3);
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_3_3)
--
2.55.0
More information about the Libc-alpha
mailing list