✘64-bit time_t on glibc 2.34 and up
Gary E. Miller
gem at rellim.com
Fri Jan 13 21:10:27 UTC 2023
Yo Greg!
On Fri, 13 Jan 2023 07:11:49 -0500
Greg Troxel <gdt at lexort.com> wrote:
> "Gary E. Miller" <gem at rellim.com> writes:
>
> > Recent glibc (2.34 and up) and recent Linux kernels, allow 64 bit
> > time_t on 32-bit Linux without much work.
>
> Interesting to hear; I had assumed time_t on Linux was changed long
> ago to int64_t.
Nope, not yet.
> Does Linux version syscalls? In NetBSD, we change the codepoints when
> the ABI changes, and there is kernel code to implement the old
> codepoint (but no header support) so old binaries still work. I
> think Solaris does this too.
For some definition of "version". There is one set of syscalls for
32-bit time, including time in file system metadata. And another
for 64 bit time. And only since late 2021.
> > This is no problem for newer musl on 32-bits. An int is 32-bits and
> > time_t is 64. Assuming all clients use the same version musl.
> >
> > This is a problem for glibc on 32 bits. And int is 32-bits, but
> > time_t is a compile time option (32 or 64 bits).
>
> I don't really follow "compile time option". The size of time_t is
> part of the kernel ABI.
Yes. BOTH sizes of time_t are part of the 32-bit linux kernel ABI.
> Is it specified separately in the kernel sources
No, kernel sources support 32-bit and 64-bit time syscalls at the
same time.
> and in whatever
> sources lead to sys/types.h?
No. time_t is in syst/time.h, selected by D_TIME_BITS 64
> Or does the kernel use sys/types.h?
Not relevant.
> The headers in sys are semantically part of the kernel, regardless of
> how they are sliced up in packaging/maintenance.
Sort of. sys/tyoes.h is part of musl or glibc.
> shmTime is simply using time_t, so it inherits the definition of
> time_t from the compilation environment. POSIX says that
> <sys/time.h> is required to define time_t:
>
> https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_time.h.html
Yes. And it does. Selected by D_TIME_BITS 64
> so I think gpsd has to just assume that's true,
It is true, but has two incompatible truths.
> and if there's a
> system where the kernel size for time_t doesn't match the installed
> header, that just needs to be fixed.
It is handles by using 2 distinct syscall type. One for 32-bit and
one for 64-bit.
> > How does ntpd know what size time_t to use? And thus know the size
> > of shmTime? How do we know portably, preserving backwards and
> > forwards compatibility?
>
> It builds against the installed headers and just uses time_t.
Yes, but which one? The 32-bit one, or the 64-bit one?
> Of course binaries are not portable across systems with different
> choices for time_t. Those are different ABIs.
Bout our problem is incompativble SHM and sock on the same ABI.
> > In hindsight, maybe shmTime should have started with a 1 char
> > version field,or magic field. But, no such luck.
>
> Probably time_t should have just been changed to int64_t, no option,
> and syscalls should have been versioned so old binaries work :-)
For some reason Linus does not take out sugggestions...
> > Options (for 32-bit only):
> >
> > 1. Do nothing, stick with 32-bit time_t. Fail in 2038.
>
> How do you "stick with it" if sys/time.h changes on systems configured
> for int64_t?
Bad conclusion, based on incorrect assumption. The same sys/time.h
can lead to either 32-bit or 64-bit time_t.
> > 2. Allow 64-bit time_t and let incompatible ntpd fail.
>
> How do you "allow"? By setting -D_TIME_BITS=64
> > 3. Add run time options to gpsd and ntpd to specify time_t size.
>
> That's crazy.
Sometimes you gotta accept crazy. But I hope not to.
> > 4. gpsd and ntpd always use 64-bit time_t going forward. Admin
> > needs to mix and match.
>
> How can you use a type different from what the kernel is using?
Easy, when the kernel uses both types at the same time.
> > 5. 1st process to open SHM(0) wins, the other process checks the
> > size to know the contents.
>
> That seems messy.
Yup.
> > 6. Create a new way to pass time from gpsd to ntpd and chronyd.
Which may have other benefits.
> Indeed, the int in ntpshm should be suseconds_t,
I'm pretty sure this predates suseconds_t.
but int is ok in
> practice, on ILP32. On IP16L32, it's not, but we aren't building for
> PDP-11 any more :-)
What is ILP32? Or IP16L32?
RGDS
GARY
---------------------------------------------------------------------------
Gary E. Miller Rellim 109 NW Wilmington Ave., Suite E, Bend, OR 97703
gem at rellim.com Tel:+1 541 382 8588
Veritas liberabit vos. -- Quid est veritas?
"If you can't measure it, you can't improve it." - Lord Kelvin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 851 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ntpsec.org/pipermail/devel/attachments/20230113/6971bf94/attachment.bin>
More information about the devel
mailing list