✘64-bit time_t on glibc 2.34 and up
Gary E. Miller
gem at rellim.com
Sat Jan 14 01:54:12 UTC 2023
Yo Greg!
On Fri, 13 Jan 2023 19:46:15 -0500
Greg Troxel <gdt at lexort.com> wrote:
> "Gary E. Miller" <gem at rellim.com> writes:
>
> >> 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.
> >
> >> 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.
> >
>
> Wow. So people have to, specially for Linux, version all interfaces
> that use time_t. That's not just gpsd, but all sorts of things.
>
> >> Or does the kernel use sys/types.h?
> >
> > Not relevant.
>
> But it has codepoints for syscalls with each flavor.
>
> >> 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.
>
> Yes, but it has to match the kernel. That's why I said semantically
> part of.
>
> >> 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
>
> Which magically changes references to syscalls that use time_t, in the
> entire binary, to the new ones?
Uh, once again, no. No "versioning". No syscalls are changed.
Every existing syscall that uses 32-bit time_t now has a 64_bit twin.
So old and new binaries just work.
I'm not gonna defend, that is what glibc and Linus negotitated.
> What happens if a library defines D_TIME_BITS 64 and makes syscalls,
> and a program which is unaware of this defines 32 and also makes
> sycalls? Or is the syscall switch per .o because the names are
> #defined?
That can never happen.
> >> > 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?
>
> I see. Well, I see several sane paths:
>
> Make a new api in json to work around the Linux approach. Only use
> it on Linux, with it just serializing the struct. I really don't
> like this.
We will need a new API for chronyd. For now, I'm trying to save
existing binaries.
When we get a new chinryd API, I'd like gpsd, ntpd and chonryd to support
it, but that only works going forward, which will take close to a decade
to all migrate. I need a solution this week. My shmTime change gets there
right away. At least for ntpshmmon, ntpd, etc.
> The entire time community agrees that code will be built 64 if
> that's supported on the build system.
Yeah, and how to get there, while being back compatible with binaries.
My shmTime idead does that. This week.
> But then the "linux is one
> ABI" is falling apart and it's going to be a mess as there will be
> old code.
No. You misunderstand the Linux ABI. Nothing is falling apart.
Execpt the gpsd to chronyd interace.
> So you have a rule that gpsd/ntpd/chronyd need to all be
> new or all be old.
And now you know why people hate *BSD. Liniux does not have "flag
days" that piss everyone off.
> On Linux, redefine the struct to be int64_t instead of time_t. add
> options to gpsd/ntpd/chrony to move to the new way. After a bit
> take out the option and int64_t is the answer. After time_t is
> int64_t on all linux systems rename it back to time_t.
And break back compatibility. Only as a last resort. Nad last resort
is not required.
> I think the third option is the way to go. That way each program can
> use 32/64 as it is available but start using the new ABI now. It will
> interop and as each program is built for 64 it becomes 2038-safe.
Richard liked my idea, you did not discuss it.
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/73e69ead/attachment-0001.bin>
More information about the devel
mailing list