Bug#1079443: fts_build() calling __getdents breaks 32bit on 64bit
Source: glibc
Followup-For: Bug #1079443
X-Debbugs-Cc: tj.iam.tj@proton.me
fts_* functions, and fts_read() -> fts_build() end up calling
> sysdeps/unix/sysv/linux/readdir.c:
#if !_DIRENT_MATCHES_DIRENT64
__readdir_unlocked()
So follow this back to see why it is (not) set (on armhf)
> sysdeps/unix/sysv/linux/bits/dirent.h:
#if defined __OFF_T_MATCHES_OFF64_T && defined __INO_T_MATCHES_INO64_T
/* Inform libc code that these two types are effectively identical. */
# define _DIRENT_MATCHES_DIRENT64 1
#else
# define _DIRENT_MATCHES_DIRENT64 0
#endif
> sysdeps/unix/sysv/linux/bits/typesizes.h:
#if defined __LP64__ || (__TIMESIZE == 64 && __WORDSIZE == 32)
/* Tell the libc code that off_t and off64_t are actually the same type
for all ABI purposes, even if possibly expressed as different base types
for C type-checking purposes. */
# define __OFF_T_MATCHES_OFF64_T 1
/* Same for ino_t and ino64_t. */
# define __INO_T_MATCHES_INO64_T 1
> sysdeps/unix/sysv/linux/arm/bits/timesize.h:
#define __TIMESIZE 32
> or bits/timesize.h:
#define __TIMESIZE 64
> sysdeps/wordsize-32/bits/wordsize.h:
#define __WORDSIZE 32
> sysdeps/wordsize-64/bits/wordsize.h:
#define __WORDSIZE 64
Debian 2.39-7 build log:
$ getbuildlog glibc 2.39-7 armhf
...
echo -n "Build started: " ; date --rfc-2822; \
echo "---------------"; \
cd build-tree/armhf-libc && \
CC="arm-linux-gnueabihf-gcc-13 -U_FILE_OFFSET_BITS -U_TIME_BITS" \
CXX="arm-linux-gnueabihf-g++-13 -U_FILE_OFFSET_BITS -U_TIME_BITS" \
...
and gcc's options have early in their list:
-I../sysdeps/unix/sysv/linux/arm
that likely means any
#include <bits/timesize.h>
will be using
> sysdeps/unix/sysv/linux/arm/bits/timesize.h:
#define __TIMESIZE 32
Reply to: