-
Notifications
You must be signed in to change notification settings - Fork 12.5k
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
musl staticlib builds include all of the musl symbols #65760
Comments
The culprit is likely https://github.com/gnzlbg/libc/blob/e07cd949b0f5f30c009066b8c074ae32afd7feed/src/unix/mod.rs#L299-L305, where musl libc is unconditionally statically linked in when including the rust stdlib with "crt-static". When working with @Twey on this, our general observation was that:
Unfortunately, the first is not handled correctly by Rust. The right way to solve this for staticlibs is likely to just not link to libc at all - the symbols will remain undefined (as they should) and can be filled out in the actual link later. Unfortunately there's no way (that I'm aware of) to switch a cfg based on the final "kind of thing" being linked/produced by Rust, i.e. "if this is a staticlib then please don't link libc statically". And I do think it has to be a special case for libc - it is entirely reasonable to want to be able to bundle staticlibs inside each other in general. In an interesting twist of fate, setting |
@aidanhs there was an attempt to do it, detailed discussion is available at rust-lang/libc#1327 |
Posted a plan for the fix in #72274. |
Observed Behaviour
If I produce a simple
staticlib
crate for thex86_64-unknown-linux-musl
target, I get a.a
file that includes all the symbols from musl, including standard libc symbols like (for example)readlink
. This makes it impossible to link this library into a C program that links against libc itself (or another Rust staticlib) as the linker will fail with duplicate symbol errors.Reproduction
A test repository is at https://github.com/Twey/musl-staticlib-test, along with a Nix description of the relevant build environment for those so inclined. You can execute
rustc -omusl-staticlib-test.a --target=x86_64-unknown-linux-musl --crate-type=staticlib lib.rs
to get a library, and use a tool such asnm
to view the symbols in the resulting binary. For example:Expected Behaviour
Normally, static libraries for consumption by C, like
rlib
s, contain only symbols from the project itself, not symbols from dependencies. Certainly symbols from libc should never make it into the binary, as these will always conflict.For example, here's
libev
, also built statically against musl:The text was updated successfully, but these errors were encountered: