Skip to content

musl staticlib builds include all of the musl symbols #65760

Open
@Twey

Description

@Twey

Observed Behaviour

If I produce a simple staticlib crate for the x86_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 as nm to view the symbols in the resulting binary. For example:

[twey@uruz:/tmp/musl-staticlib-test]$ nm musl_staticlib_test.a | grep readlink
                 U readlink
0000000000000000 T _ZN3std3sys4unix2fs8readlink17h4d68afd72996b214E
                 U readlink
readlink.lo:
0000000000000000 T readlink
readlinkat.lo:
0000000000000000 T readlinkat
                 U readlink

Expected Behaviour

Normally, static libraries for consumption by C, like rlibs, 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:

[twey@uruz:/tmp/musl-staticlib-test]$ nm /nix/store/6r9z7a007vrla17paac35c968fmbzilq-libev-4.27-x86_64-unknown-linux-musl/lib/libev.a | grep readlink
[twey@uruz:/tmp/musl-staticlib-test]$

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-linkageArea: linking into static, shared libraries and binariesC-bugCategory: This is a bug.O-muslTarget: The musl libcT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions