Steve McIntyre <st...@einval.com> 于2020年2月4日周二 下午9:15写道: > > Hey folks, > > Apologies - I should have sent this mail quite a while back. :-/ > > Arnd Bergmann (in CC) has been helping to drive a lot of work to solve > the 2038 problem in the Linux world. I've spoken about this before, > e.g. at DebConf17. He's been pushing a lot of updates throughout the > Linux kernel, and has also been analysing code elsewhere. He's very > interested in how to update complete systems like Debian too, and we > spoke about this some time ago. > > The kernel is *basically* fixed now. Internally, data structures > should now be safe. There are a small number places where 32-bit time > is still a thing, but it's in hand. A number of syscalls, ioctls, > etc. have needed updates for the user-kernel interface level. glibc is > the place that needs to care about most of this. > > The glibc folks have taken an interesting approach. > > * 64-bit ABIs/architectures are already using 64-bit time_t > throughout. The design is sane and so we should already be mostly > safe here, modulo silly code bugs (we'll always have those!) > > * 32-bit ABIs/arches are more awkward. glibc will continue *by > default* to use 32-bit time_t to keep compatibility with existing > code. This will *not* be safe as we approach 2038. > > * 32-bit ABIs/arches *can* be told to use 64-bit time_t from glibc > upwards, but this will of course affect the ABI. Embedded uses of > time_t in libraries will change size, etc. This *will* be safe for > 2038. > > So, we're all fine? Not so much: for our 32-bit Debian arches, we will > need to basically rebuild the world to be 2038-safe. When we had to do > something like this in the past, to deal with the libc5->libc6 > transition, we had an SONAME change in libc to work with. We decided > to append the "g" tag to the names of our library binary packages to > signal that a library was built against libc6. We can still see some > of the effects of this in the archive, many years later > (e.g. zlib1g). The problem now is that we will *not* have an soname > change here to help identify code compatibility on the 32-bit front. > > Arnd scanned the library packages in the Debian archive and identified > that about one third of our library packages would need rebuilding > (and tracking) to make a (recursive) transition. We can see two > different possible routes to follow: > > A Follow a similar path to last time (rename library packages). This > will allow us to do partial upgrades, but the cost is that a vast > number of packages will need work to make this happen, > *potentially* building library packages twice to allow us to > continue both 32-bit and 64-bit time_t support forwards for a > while. This effort will be *needed* only for the sake of our 32-bit > ports, but would affect *everybody*. > > *** OR *** > > B Decide which 32-bit ports we expect to care about by 2038, and > re-bootstrap new versions of those ports *with different > names*. This would allow most of our developers to ignore the > problem here (as 64-bit arches are not affected) and let a smaller > number of people re-bootstrap with new ABIs with 64-bit time_t > embedded. There are some downsides here: > > * we would end up with two versions of some ports for a short time > - probably one release of overlap > > * users would *not* be able to simply upgrade from one to the > other, due to lack of binary compatibility > > We *would* be able to run old and new ABIs on top of the same (new > enough) kernel (e.g. for buildds), so a lump of this would just be > simply building the new world and filing bugs where needed. > > We'd need to decide exactly which of our 32-bit ports we would want > to do this path with (probably armhf->arhmft?, maybe > armel->armelt?, i386->i386t?. mipsel???). Due to the libc6 soname > continuity, we will most likely *not* end up with a different > visible ABI via the triplet and the runtime linker, so old/new > multi-arch will be impossible. > > So, which way should we go? My own personal gut feel matches Arnd's, > which would be route B. Some of us already have fair experience with > bootstrapping new arches, and we could almost just crank the handle > for most of this work. >
Is there the option C? Draft: 1. define time64_t 2. for data_struct which act as a part of ABI, define a new data_struct64 3. for function which act as part of ABI, define a new version func64. 4. patch all packages to use time64_t instead of time_t step by step. 5. set a time as deadline (2030?), and then treat all packages haven't finished the migration as rc-buggy. Since we have enough time, we can patch all packages in that period. > What do people think here? Which do you think is the better path? Feel > free to point out things you think I may have missed. We should get > started on this soon - the longer we leave it, the more likely it is > that we'll see 2038 bugs biting people. > > -- > Steve McIntyre, Cambridge, UK. st...@einval.com > "Yes, of course duct tape works in a near-vacuum. Duct tape works > anywhere. Duct tape is magic and should be worshipped." > -― Andy Weir, "The Martian" > -- YunQiang Su