-
-
Notifications
You must be signed in to change notification settings - Fork 606
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix linking to 64-bit time_t versions of functions on musl #14794
Conversation
Thanks for your pull request, @CyberShadow! Bugzilla references
|
57a8308
to
62d942d
Compare
CC @omerfirmak, I see you tried fixing this as well in dlang/druntime#3383 |
musl switched to 64-bit time_t across all architectures in version 1.2.0: https://musl.libc.org/time64.html This change was done in a way which attempted to preserve ABI compatibility. To achieve this, the 32-bit versions of functions were left at their original names in the compiled library, and new 64-bit versions of functions were introduced. The header files then redirected calls to the standard function names to use the new 64-bit versions using the __asm__("name") construct, which is similar to D's pragma(mangle, "name"). This change is a fix-up for commit ca0b670, which tried addressing this change in musl by changing time_t to 64-bit when targeting new musl versions (the default). However, that change was incomplete, as it did not implement the function redirection part of the change, which is required to actually call the implementations using 64-bit time_t. As a result, it caused programs to link but return incorrect results at runtime on 32-bit architectures when targeting new musl versions. Fix this by adjusting the mangled name of the D declarations of affected functions when targeting musl on 32-bit platforms. Affected functions in musl can be found by grepping for _REDIR_TIME64 and uses of the __REDIR macro. Fixes issue 23608.
62d942d
to
d8dda80
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a bit worried about future-proofness, but thank you for fixing this!
Stable though ? |
In theory, future C APIs introduced by musl will all use 64-bit I can rebase on stable. This seems like a potentially high impact change and the regression was a while ago so targeting master seems safer? |
I think it'll be better to get this rolled out in the packages sooner than later. We currently have most architectures disabled on Alpine and that's a step in the right direction. |
Ah, great! I will open a new PR to avoid the mass ping. |
musl switched to 64-bit time_t across all architectures in version 1.2.0:
https://musl.libc.org/time64.html
This change was done in a way which attempted to preserve ABI compatibility. To achieve this, the 32-bit versions of functions were left at their original names in the compiled library, and new 64-bit versions of functions were introduced. The header files then redirected calls to the standard function names to use the new 64-bit versions using the
__asm__("name")
construct, which is similar to D'spragma(mangle, "name")
.This change is a fix-up for commit ca0b670, which tried addressing this change in musl by changing time_t to 64-bit when targeting new musl versions (the default). However, that change was incomplete, as it did not implement the function redirection part of the change, which is required to actually call the implementations using 64-bit time_t. As a result, it caused programs to link but return incorrect results at runtime on 32-bit architectures when targeting new musl versions.
Fix this by adjusting the mangled name of the D declarations of affected functions when targeting musl on 32-bit platforms. Affected functions in musl can be found by grepping for _REDIR_TIME64 and uses of the __REDIR macro.
In dlang/druntime#3275, @Geod24 wrote:
I'm guessing what was fixed by that change is not interop between D and the musl libc, but between D and other C libraries which use the definition of
time_t
from the libc. dlang/druntime#3275 causes Druntime to divide by zero at startup - because we are callingclock_getres
with the expectation that it populates atimespec
with 64-bittime_t
, but we are actually calling the 32-bit version, sots.tv_nsec
remains at the default-initialized 0 value.CC @Geod24 @Cogitri @ibuclaw