-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
If I want to link statically to e.g. Android libc, the libc crate will ignore the +crt-static request and will link libc dynamically anyway.
The libc crate should respect user requests like this and link to libc statically in #[cfg(target_feature = "crt-static")] mode if the target provides a static version of libc at all.
The relevant code is here:
Lines 295 to 357 in bcbfeb5
| cfg_if! { | |
| if #[cfg(target_os = "l4re")] { | |
| // required libraries for L4Re are linked externally, ATM | |
| } else if #[cfg(feature = "std")] { | |
| // cargo build, don't pull in anything extra as the libstd dep | |
| // already pulls in all libs. | |
| } else if #[cfg(target_env = "musl")] { | |
| #[cfg_attr(feature = "rustc-dep-of-std", | |
| link(name = "c", kind = "static", | |
| cfg(target_feature = "crt-static")))] | |
| #[cfg_attr(feature = "rustc-dep-of-std", | |
| link(name = "c", cfg(not(target_feature = "crt-static"))))] | |
| extern {} | |
| } else if #[cfg(target_os = "emscripten")] { | |
| #[link(name = "c")] | |
| extern {} | |
| } else if #[cfg(all(target_os = "netbsd", | |
| feature = "rustc-dep-of-std", | |
| target_vendor = "rumprun"))] { | |
| // Since we don't use -nodefaultlibs on Rumprun, libc is always pulled | |
| // in automatically by the linker. We avoid passing it explicitly, as it | |
| // causes some versions of binutils to crash with an assertion failure. | |
| #[link(name = "m")] | |
| extern {} | |
| } else if #[cfg(any(target_os = "macos", | |
| target_os = "ios", | |
| target_os = "android", | |
| target_os = "openbsd"))] { | |
| #[link(name = "c")] | |
| #[link(name = "m")] | |
| extern {} | |
| } else if #[cfg(target_os = "haiku")] { | |
| #[link(name = "root")] | |
| #[link(name = "network")] | |
| extern {} | |
| } else if #[cfg(target_env = "newlib")] { | |
| #[link(name = "c")] | |
| #[link(name = "m")] | |
| extern {} | |
| } else if #[cfg(target_os = "hermit")] { | |
| // no_default_libraries is set to false for HermitCore, so only a link | |
| // to "pthread" needs to be added. | |
| #[link(name = "pthread")] | |
| extern {} | |
| } else if #[cfg(target_env = "illumos")] { | |
| #[link(name = "c")] | |
| #[link(name = "m")] | |
| extern {} | |
| } else if #[cfg(target_os = "redox")] { | |
| #[cfg_attr(feature = "rustc-dep-of-std", | |
| link(name = "c", kind = "static-nobundle", | |
| cfg(target_feature = "crt-static")))] | |
| #[cfg_attr(feature = "rustc-dep-of-std", | |
| link(name = "c", cfg(not(target_feature = "crt-static"))))] | |
| extern {} | |
| } else { | |
| #[link(name = "c")] | |
| #[link(name = "m")] | |
| #[link(name = "rt")] | |
| #[link(name = "pthread")] | |
| extern {} | |
| } | |
| } |
Static libc may require additionally linking some startup objects etc, and for some targets this is supported implicitly by rustc, but such support is not critical because the necessary linking can be done explicitly by the user with -C link-args and similar options.
Metadata
Metadata
Assignees
Labels
No labels