Skip to content
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

Undefined Symbol Linking ThinLTO on Fuchsia #53794

Closed
cramertj opened this issue Aug 29, 2018 · 16 comments
Closed

Undefined Symbol Linking ThinLTO on Fuchsia #53794

cramertj opened this issue Aug 29, 2018 · 16 comments
Labels
A-linkage Area: linking into static, shared libraries and binaries

Comments

@cramertj
Copy link
Member

cramertj commented Aug 29, 2018

After #53356, all Rust binaries fail to link when using ThinLTO on Fuchsia (at least, all the admittedly non-minimal examples I have tried do). The full error is here. TL;DR: ld.lld: error: undefined symbol: _$LT$$u5b$A$u5d$$u20$as$u20$core..slice..SlicePartialEq$LT$A$GT$$GT$::equal::hcbd9a5cdc751fed8.

Most binaries mentioned PartialEq-related things as the symbol that was failing to link, which is maybe coincidental (due to the order in which function references occur or something) but I figured it was worth mentioning.

The error does not occur before #53356, and does not occur even post-#53356 when disabling LTO or using fat LTO.

cc @michaelwoerister

@cramertj cramertj added the A-linkage Area: linking into static, shared libraries and binaries label Aug 29, 2018
@alexcrichton
Copy link
Member

@cramertj are you able to reduce the test case down to one that we can reproduce? That would make it much easier to track down and confirm a fix.

@cramertj
Copy link
Member Author

@alexcrichton Unfortunately I don't believe y'all have access to an updated sysroot for Fuchsia anyways (without cloning and building the fuchsia repo) so I don't know of a minimal way for you to get something you could link against, even with a working rustc. Do you have a copy of the fuchsia sysroot you can link against for testing, or would you be willing to check out and build fuchsia's kernel in order to get one?

@cramertj
Copy link
Member Author

Scratch that-- I asked around and there's a way to pull down a recent sysroot using some scripts. I'll post here when I've gotten a small repro.

@cramertj
Copy link
Member Author

curl -L -o cipd "https://chrome-infra-packages.appspot.com/client?platform=linux-amd64&version=latest" && chmod +x cipd && ./cipd install fuchsia/sdk/linux-amd64 latest -root sdk && ./cipd install fuchsia/clang/linux-amd64 --root clang

will get you a sysroot, libs dir, and our version of clang, which you can use to compile w/

rustc foo.rs --target=x86_64-fuchsia -Clinker=clang/bin/clang -Clink-arg=--target=x86_64-fuchsia -Clink-arg=--sysroot=./sdk/arch/x64/sysroot -Lnative=./sdk/arch/x64/lib

I'll work on tracking down a minimal repro using this approach.

@cramertj
Copy link
Member Author

cramertj commented Aug 31, 2018

Okay, it's not exactly minimal, but I've put together this repo containing some scripts and an example project that will reproduce the error. To download the fuchsia SDK, run ./clone_sdk.sh, and to build (and get the error) run ./build.sh. Let me know if there's anything else I can do help debug this!

Note that small changes to src/main.rs will cause the problem to either go away or reappear (I'm assuming this is because of how the changes affect what codegen units different symbols wind up in).

@cramertj
Copy link
Member Author

cramertj commented Sep 5, 2018

Ping @michaelwoerister have you had any luck trying to track this down? If not, is there any possibility we could roll back the original change? This is blocking a number of different issues in Fuchsia. If there's any more information or support I can provide, let me know.

@michaelwoerister
Copy link
Member

I'm getting linker errors when trying to build your repo, but not the expected ones:

 = note: "cc" "-m64" "-L" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.114wtr7w3rrnmbc.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.13ppkwfv72ygxlmq.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.15cs9dwxejoitkxr.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.1bouoktkupx629ng.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.1jyur5iapam0o04y.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.1wtb65wyde2ltjx9.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.25ivz0kmy63xe9ow.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.27f0b9p57vvy39le.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.2gv2jhvyng3kp5wb.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.2jqz03txm7d1sssb.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.2pkbt36vpf5knaqz.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.2tg6s5bd7d8vqjkg.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.2ye9wwwdhpn5qspv.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.3dzekr1t4xolir6y.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.3qtydzyditwwd0wd.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.3v4z82rb45k5quma.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.42x4zspsrdihido3.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.44j8zz2r4t1d09xb.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.4ddqkjf8ait465ke.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.4e43nock91frmrv.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.4pklxt52j0gzdm1m.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.4sa6u4agrxsl3rzm.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.52zsza1zh6g17vvp.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.545o9vyvzic1cait.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.5bi44a22akyqli8k.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.cbtse3wria8c2qk.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.hsluffolb0omiow.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.kpw41dx583vpch1.rcgu.o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.rbudk13barf349l.rcgu.o" "-o" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/rolldice-cffa3aa890e6a2ef.4hf6vyz3t5sozjf3.rcgu.o" "-Wl,--gc-sections" "-pie" "-nodefaultlibs" "-L" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps" "-L" "/xoxo/stuff/link-error-repro/target/debug/deps" "-L" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib" "-Wl,-Bstatic" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libstructopt-e5a964627de99848.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libclap-5ee03f13a91e8b1d.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libvec_map-ff6127e186f66480.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libtextwrap-1c0d10b38abbb73c.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libunicode_width-80d61abf48dd7188.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libstrsim-38af06e60a2ab399.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libatty-492c49178fa5707b.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/liblibc-9eda77d3ab01d8c1.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libansi_term-ac1f71cffb3f6098.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/librand-e339844f5b01e440.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libfuchsia_zircon-62268e2b9cb6c79b.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libfuchsia_zircon_sys-23b01c7caef37a7b.rlib" "/xoxo/stuff/link-error-repro/target/x86_64-fuchsia/debug/deps/libbitflags-66a38365521f5fc7.rlib" "-Wl,--start-group" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/libstd-dcfd40c2ad884e65.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/libpanic_unwind-a6e0d74067cd6e1b.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/libunwind-99384df64c2c631c.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/liballoc_system-8b6ffb154d32d40f.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/liblibc-3588fa8a2cf7f341.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/liballoc-de52c8a296d65ffc.rlib" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/libcore-7dd9b1b4fecacf0d.rlib" "-Wl,--end-group" "/home/mw/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-fuchsia/lib/libcompiler_builtins-d58460cd70aeca06.rlib" "-Wl,-Bdynamic" "-lc" "-lfdio" "-lzircon" "-lzircon" "-lfdio" "-lunwind" "-lc" "-lfdio"
  = note: /usr/bin/ld: cannot find -lfdio
          /usr/bin/ld: cannot find -lzircon
          /usr/bin/ld: cannot find -lzircon
          /usr/bin/ld: cannot find -lfdio
          /usr/bin/ld: cannot find -lunwind
          collect2: error: ld returned 1 exit status

Looks like a problem with the SDK? Ran the following commands after cloning:

./clone_sdk.sh
./build.sh

My OS is Ubuntu 16.04.

@cramertj
Copy link
Member Author

cramertj commented Sep 6, 2018

@michaelwoerister Ugh... I've spent several hours trying to track this down. It seems that something has changed now since I originally tested, and I get the same error unless I change CARGO_TARGET_RUSTFLAGS to CARGO_TARGET_x86_64_FUCHSIA_RUSTFLAGS. I've pushed this change as long as a change to fix the specific versions of clang and the sdk that are being downloaded so as to prevent further breakages. However, once I do that, I not longer get any link errors at all 😢, so I'm no longer able to reproduce outside of the fuchsia tree (which still reproduces perfectly consistently). I'm still digging for a new reproducer and trying to figure out what changed between the time I originally submitted the example and now.

@cramertj
Copy link
Member Author

cramertj commented Sep 7, 2018

Encountered #54042 when working towards a repro. It may be related.

@alexcrichton
Copy link
Member

Ok I've done some digging with @cramertj and here's some things we've discovered. I was never able to reproduce the link error seen here exactly but I was able to get pretty close:

https://gist.github.com/alexcrichton/c79ba388aeb2d94e1ac22592e1bd9562

The bug appears to be because this comment is violated, namely the same CGU name is used in two different crates for different data. This later causes issues with ThinLTO which is where that requirement stems from.

The reproduction above shows that if you have two crates then the "volatile" CGUs which contain instantiations from upstream crates will end up having the same CGU name as the CGU name for a local crate doesn't consider the local crate's crate name and crate disambiguator, only the upstream one (which is now duplicated between two CGUs).

That brings up a whole bunch of questions of "why don't we see this everywhere?!" which I believe is all answered by:

  • In non-incremental mode we rename numbered CGUs based on the current crate, so non-incremental CGUs never collide in names.
  • Within one crate CGU names are always unique, meaning that ThinLTO's required guarantees are still upheld.

So this bug only shows up when we're doing whole-crate-graph ThinLTO (a rarity) and some dependencies were compiled incrementally. You can't even express this in Cargo because this invocation is invalid:

rustc foo.rs -C incremental=out -C lto=thin

as rustc prints "error: can't perform LTO when compiling incrementally" (as we haven't implemented it!). All that to say that this all makes sense that it's only Fuchsia's own build system, no one else can even encounter this with Cargo!

@michaelwoerister does that make sense? I think the fix here is to factor in the local crate name and crate disambiguator into "volatile" codegen units, but I'd want to confirm with your before sending a PR.

@michaelwoerister
Copy link
Member

michaelwoerister commented Sep 11, 2018

Oh yes, that makes sense! Always adding the instantiating crate ID to the CGU name would indeed be a valid fix for the problem.

@michaelwoerister
Copy link
Member

@alexcrichton, it sounds like you already have a PR ready? Otherwise, let me know and I'll create one.

@alexcrichton
Copy link
Member

Oh I don't have a patch yet myself, was gonna confirm first. if you'd like to make the patch though feel free!

@michaelwoerister
Copy link
Member

Sure, I'll do a PR tomorrow. It's me who introduced the regression after all :)

bors added a commit that referenced this issue Sep 12, 2018
Really make CGU names unique across crates.

This will hopefully fix issue #53794.

r? @alexcrichton
@cramertj
Copy link
Member Author

I've confirmed that #54152 fixed this. Thanks so much @alexcrichton and @michaelwoerister!

@michaelwoerister
Copy link
Member

Great to hear! Credit goes to @alexcrichton for identifying the underlying problem. The fix was pretty simple after that :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-linkage Area: linking into static, shared libraries and binaries
Projects
None yet
Development

No branches or pull requests

3 participants