From 6c048723f83fad6c96c2e19d6dfa1db547371c11 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 21 Apr 2015 15:56:55 -0700 Subject: [PATCH] std: Prepare for linking to musl This commit modifies the standard library and its dependencies to link correctly when built against MUSL. This primarily ensures that the right libraries are linked against and when they're linked against they're linked against statically. --- src/liballoc/heap.rs | 4 +++- src/liblibc/lib.rs | 6 +++++- src/libstd/dynamic_lib.rs | 4 +++- src/libstd/rt/libunwind.rs | 7 ++++++- src/libstd/rtdeps.rs | 2 +- src/libstd/sys/unix/time.rs | 3 ++- src/libstd/thread/local.rs | 1 + 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/liballoc/heap.rs b/src/liballoc/heap.rs index 9d1d8a7ac24..86a04a0687a 100644 --- a/src/liballoc/heap.rs +++ b/src/liballoc/heap.rs @@ -211,7 +211,9 @@ mod imp { } // -lpthread needs to occur after -ljemalloc, the earlier argument isn't enough - #[cfg(all(not(windows), not(target_os = "android")))] + #[cfg(all(not(windows), + not(target_os = "android"), + not(target_env = "musl")))] #[link(name = "pthread")] extern {} diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs index 4fbcdaa378e..999e7c643e5 100644 --- a/src/liblibc/lib.rs +++ b/src/liblibc/lib.rs @@ -140,11 +140,15 @@ pub use funcs::bsd43::*; // On NaCl, these libraries are static. Thus it would be a Bad Idea to link them // in when creating a test crate. -#[cfg(not(any(windows, all(target_os = "nacl", test))))] +#[cfg(not(any(windows, target_env = "musl", all(target_os = "nacl", test))))] #[link(name = "c")] #[link(name = "m")] extern {} +#[cfg(all(target_env = "musl", not(test)))] +#[link(name = "c", kind = "static")] +extern {} + // libnacl provides functions that require a trip through the IRT to work. // ie: _exit, mmap, nanosleep, etc. Anything that would otherwise require a trip // to the kernel. diff --git a/src/libstd/dynamic_lib.rs b/src/libstd/dynamic_lib.rs index ef72cbc96e1..8b90fce6fc4 100644 --- a/src/libstd/dynamic_lib.rs +++ b/src/libstd/dynamic_lib.rs @@ -125,7 +125,9 @@ mod tests { use path::Path; #[test] - #[cfg_attr(any(windows, target_os = "android"), ignore)] // FIXME #8818, #10379 + #[cfg_attr(any(windows, + target_os = "android", // FIXME #10379 + target_env = "musl"), ignore)] fn test_loading_cosine() { // The math library does not need to be loaded since it is already // statically linked in diff --git a/src/libstd/rt/libunwind.rs b/src/libstd/rt/libunwind.rs index 4b754bd5f58..8f75ae5ef5c 100644 --- a/src/libstd/rt/libunwind.rs +++ b/src/libstd/rt/libunwind.rs @@ -97,10 +97,15 @@ pub type _Unwind_Exception_Cleanup_Fn = extern "C" fn(unwind_code: _Unwind_Reason_Code, exception: *mut _Unwind_Exception); -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(all(target_os = "linux", not(target_env = "musl")), + target_os = "freebsd"))] #[link(name = "gcc_s")] extern {} +#[cfg(all(target_os = "linux", target_env = "musl", not(test)))] +#[link(name = "unwind", kind = "static")] +extern {} + #[cfg(any(target_os = "android", target_os = "openbsd"))] #[link(name = "gcc")] extern {} diff --git a/src/libstd/rtdeps.rs b/src/libstd/rtdeps.rs index 96c4bcec853..a7f3bc2bdc8 100644 --- a/src/libstd/rtdeps.rs +++ b/src/libstd/rtdeps.rs @@ -24,7 +24,7 @@ extern {} // // On Linux, librt and libdl are indirect dependencies via std, // and binutils 2.22+ won't add them automatically -#[cfg(target_os = "linux")] +#[cfg(all(target_os = "linux", not(target_env = "musl")))] #[link(name = "dl")] #[link(name = "pthread")] extern {} diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index d2f51678d49..f59eb2c0301 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -82,7 +82,8 @@ mod inner { // OpenBSD provide it via libc #[cfg(not(any(target_os = "android", target_os = "bitrig", - target_os = "openbsd")))] + target_os = "openbsd", + target_env = "musl")))] #[link(name = "rt")] extern {} diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 6d8f1cba709..5b7d6fdd864 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -364,6 +364,7 @@ mod imp { use sys_common::thread_local as os; extern { + #[linkage = "extern_weak"] static __dso_handle: *mut u8; #[linkage = "extern_weak"] static __cxa_thread_atexit_impl: *const ();