There are three files that govern userspace struct timespec on glibc: 1. bits/wordsize.h, defining: (a) __WORDSIZE to 32 on ILP32 and 64 on LP64 (b) on x32: __SYSCALL_WORDSIZE to 64 2. bits/timesize.h, defining (a) __TIMESIZE to __WORDSIZE, except on x32 where it's 64 3. bits/types/struct_timespec.h, declaring struct timespec as: struct timespec { __time_t tv_sec; /* Seconds. */ #if __WORDSIZE == 64 \ || (defined __SYSCALL_WORDSIZE && __SYSCALL_WORDSIZE == 64) \ || __TIMESIZE == 32 __syscall_slong_t tv_nsec; /* Nanoseconds. */ #else # if __BYTE_ORDER == __BIG_ENDIAN int: 32; /* Padding. */ long int tv_nsec; /* Nanoseconds. */ # else long int tv_nsec; /* Nanoseconds. */ int: 32; /* Padding. */ # endif #endif }; this has two side-effects: struct timespec (a) is always sizeof==time_t+8, and (b) has tv_nsec as __syscall_slong_t *and* !is_same<__syscall_slong_t, long> if using LP64 syscalls on an ILP32 system, i.e. on x32. This means, that the simplified struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds [0 .. 999999999] */ }; declaration is *invalid* for x32, where struct timespec::tv_nsec is an int64_t (long long). Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@xxxxxxxxxxxxxxxxxx> --- man7/system_data_types.7 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/man7/system_data_types.7 b/man7/system_data_types.7 index 1e6a3f74c..80679b180 100644 --- a/man7/system_data_types.7 +++ b/man7/system_data_types.7 @@ -1544,7 +1544,11 @@ or .EX struct timespec { time_t tv_sec; /* Seconds */ +#if !(__x86_64__ && __ILP32__ /* == x32 */) long tv_nsec; /* Nanoseconds [0 .. 999999999] */ +#else + long long tv_nsec; +#endif }; .EE .PP -- 2.30.2
Attachment:
signature.asc
Description: PGP signature