-
Notifications
You must be signed in to change notification settings - Fork 13k
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
OSX compilation with debuginfo isn't deterministic #47086
Comments
cc @michaelwoerister, @johnklai1 cc @luser (you're probably interested in this for the sccache ramifications like @johnklai1 is) |
If we used LLD for linking (#39915), it would be possible to fix this in the linker (by providing a flag to ignore mtime). |
Source code for the darwin linker seems to be available, but I have no idea whether they take patches. Maybe LLVM develpers know more. Most likely, Apple will switch to LLD eventually. |
I wonder what experts on deterministic builds (@infinity0 ) can say about this. |
Hm. I wonder why we haven't noticed this for Firefox builds? Maybe the version of the linker we're using has a patch to work around this? We're using https://github.com/tpoechtrager/cctools-port for our builds. |
@luser that is indeed surprising! The source code there also slurps in the mtime, but that may be getting postprocessed somewhere else perhaps. |
We discussed this on IRC, and I suspect the reason is that nobody has actually tried to do unstripped reproducible Firefox builds for macOS (although I'm not 100% sure). The info in question are STABS entries used by dsymutil to link the debug info from the object files into the dSYM. This isn't critical for sccache currently, since it doesn't cache linker outputs. |
Related: @metajack noticed that static archives are not reproducible on macOS because Apple's |
Right, I think the impact on sccache is similar to mozilla/sccache#169. What I am seeing is that the .dylib non-determinism is causing unexpected cache misses in sccache since the dylibs end up being passed to rustc. Here is an example for
|
Ah, right, proc macro crates! |
…ty-proc-macro-crate, r=alexcrichton Fix spurious warning on empty proc macro crates While attempting to reproduce rust-lang#47086 I noticed the following warning: ```shell > rustc /dev/null --crate-type proc-macro warning: unused variable: `registrar` --> /dev/null:0:1 ``` As there are no macros to register the automatically generated registrar function for the crate has no body. As a result its `registrar` argument is unused triggering the above warning. The warning is confusing and not easily actionable by the developer. It could also be triggered legitimately by e.g. having all of the macros in a crate #[cfg]'ed out. Fix by naming the generated argument `_registrar` inside `mk_registrar()`. This suppresses the unused variable warning.
It should be harmless to set it even if it's not supported, you just won't get a deterministic binary. Here's where it's handled in the most recent ld64 source available, FWIW. |
Export ZERO_AR_DATE for macos linker invocations This commit attempts to improve reproducibility of builds on macOS by exporting the `ZERO_AR_DATE=1` environment variable for all invocations of the linker. While it looks like this env var is targeted at just the `ar` command (which does actually read this) it appears that recent-ish versions of the linker *also* read this environment variable. This env var forces the linker to set a deterministic zero value for the mtime in the N_OSO field of the object file. Currently it's believe that older versions of the linker will simply ignore this env var, while newer versions will read it and produce a deterministic output for compilations with debuginfo. Closes rust-lang#47086 Closes rust-lang#66568
This is an issue extracted from #47066 (comment) which is caused by an issue that any OSX compilation with debuginfo ends up being nondeterministic. Specifically (currently known at least) the source of nondeterminism is that an mtime for an object file winds up in the final binary.
It turns out this isn't really our fault (unfortunately that makes it harder to fix!). This can be reproduced with just C and a linker:
Here we're using the exact same object file (with two timestamps) and we're seeing different linked artifacts.
This is a source of bugs in programs that expect rustc to be deterministic (aka #47066 as was originally stated) and is something that we as rustc should probably fix.
Unfortunately I don't really know of a fix for this myself. I'd be tempted to take a big hammer to the problem and deterministically set all mtime fields for objects going into the linker to a known fixed value, but that unfortunately doesn't fix the determinism for C code (whose objects we don't control) and also is probably too big of a hammer (if a build system uses the mtime of the object to control rebuilds it'd get mixed up).
We could also use something like
goblin
and reach in to the specific field and remove the actual data. I found it in a symbol section with theN_OSO
type (described in various documents online too apparently). We may be able to postprocess all output artifacts on OSX to maybe just zero out these fields unconditionally (or set them to something like May 15, 2015), although I'm not actually sure if this would be easy to do.The text was updated successfully, but these errors were encountered: