diff options
Diffstat (limited to 'community/rust/musl-support-dynamic-linking.patch')
-rw-r--r-- | community/rust/musl-support-dynamic-linking.patch | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/community/rust/musl-support-dynamic-linking.patch b/community/rust/musl-support-dynamic-linking.patch deleted file mode 100644 index c6441272bb..0000000000 --- a/community/rust/musl-support-dynamic-linking.patch +++ /dev/null @@ -1,336 +0,0 @@ -From 3abd1f5e2f31b1c95535ef8c3b4bef6ff78b3fa9 Mon Sep 17 00:00:00 2001 -From: Samuel Holland <samuel@sholland.org> -From: Shiz <hi@shiz.me> -Date: Wed, 12 Apr 2017 22:31:06 +0200 -Subject: [PATCH] Support dynamically-linked and/or native musl targets - -These changes allow native compilation on musl-based distributions and the -use of dynamic libraries on linux-musl targets. This is intended to remove -limitations based on past assumptions about musl targets, while -maintaining existing behavior by default. - -Upstream-Issue: https://github.com/rust-lang/rust/pull/40113 -See-Also: https://internals.rust-lang.org/t/refining-cross-platform-crt-static-semantics/5085 - -diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs -index 90fd31ecbd..28520a2c60 100644 ---- a/src/bootstrap/bin/rustc.rs -+++ b/src/bootstrap/bin/rustc.rs -@@ -205,6 +205,15 @@ fn main() { - } - } - } -+ -+ if let Ok(s) = env::var("RUST_CRT_STATIC") { -+ if s == "true" { -+ cmd.arg("-C").arg("target-feature=+crt-static"); -+ } -+ if s == "false" { -+ cmd.arg("-C").arg("target-feature=-crt-static"); -+ } -+ } - } - - if verbose > 1 { -diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs -index 7c35151a6d..c83b6cc24c 100644 ---- a/src/bootstrap/compile.rs -+++ b/src/bootstrap/compile.rs -@@ -94,21 +94,24 @@ pub fn std_link(build: &Build, - let libdir = build.sysroot_libdir(target_compiler, target); - add_to_sysroot(&libdir, &libstd_stamp(build, compiler, target)); - -- if target.contains("musl") && !target.contains("mips") { -+ if target.contains("musl") { - copy_musl_third_party_objects(build, target, &libdir); - } - - if build.config.sanitizers && compiler.stage != 0 && target == "x86_64-apple-darwin" { - // The sanitizers are only built in stage1 or above, so the dylibs will - // be missing in stage0 and causes panic. See the `std()` function above - // for reason why the sanitizers are not built in stage0. - copy_apple_sanitizer_dylibs(&build.native_dir(target), "osx", &libdir); - } - } - - /// Copies the crt(1,i,n).o startup objects - /// --/// Only required for musl targets that statically link to libc -+/// Since musl supports fully static linking, we can cross link for it even -+/// with a glibc-targeting toolchain, given we have the appropriate startup -+/// files. As those shipped with glibc won't work, copy the ones provided by -+/// musl so we have them on linux-gnu hosts. - fn copy_musl_third_party_objects(build: &Build, target: &str, into: &Path) { - for &obj in &["crt1.o", "crti.o", "crtn.o"] { - copy(&build.musl_root(target).unwrap().join("lib").join(obj), &into.join(obj)); -diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs -index 6e077691b3..8d9be38959 100644 ---- a/src/bootstrap/config.rs -+++ b/src/bootstrap/config.rs -@@ -113,6 +113,7 @@ pub struct Target { - pub cc: Option<PathBuf>, - pub cxx: Option<PathBuf>, - pub ndk: Option<PathBuf>, -+ pub crt_static: Option<bool>, - pub musl_root: Option<PathBuf>, - } - -@@ -221,6 +222,7 @@ struct TomlTarget { - cc: Option<String>, - cxx: Option<String>, - android_ndk: Option<String>, -+ crt_static: Option<bool>, - musl_root: Option<String>, - } - -@@ -359,6 +361,7 @@ impl Config { - } - target.cxx = cfg.cxx.clone().map(PathBuf::from); - target.cc = cfg.cc.clone().map(PathBuf::from); -+ target.crt_static = cfg.crt_static.clone(); - target.musl_root = cfg.musl_root.clone().map(PathBuf::from); - - config.target_config.insert(triple.clone(), target); -diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs -index c98dd4751f..e7ee9511d8 100644 ---- a/src/bootstrap/lib.rs -+++ b/src/bootstrap/lib.rs -@@ -500,6 +500,10 @@ impl Build { - .env("RUSTDOC_REAL", self.rustdoc(compiler)) - .env("RUSTC_FLAGS", self.rustc_flags(target).join(" ")); - -+ if let Some(x) = self.crt_static(target) { -+ cargo.env("RUST_CRT_STATIC", x.to_string()); -+ } -+ - // Enable usage of unstable features - cargo.env("RUSTC_BOOTSTRAP", "1"); - self.add_rust_test_threads(&mut cargo); -@@ -883,6 +887,16 @@ impl Build { - return base - } - -+ /// Returns if this target should statically link the C runtime, if specified -+ fn crt_static(&self, target: &str) -> Option<bool> { -+ if target.contains("pc-windows-msvc") { -+ Some(true) -+ } else { -+ self.config.target_config.get(target) -+ .and_then(|t| t.crt_static) -+ } -+ } -+ - /// Returns the "musl root" for this `target`, if defined - fn musl_root(&self, target: &str) -> Option<&Path> { - self.config.target_config.get(target) -diff --git a/src/bootstrap/sanity.rs b/src/bootstrap/sanity.rs -index bc439d6f78..3ee1113516 100644 ---- a/src/bootstrap/sanity.rs -+++ b/src/bootstrap/sanity.rs -@@ -157,8 +157,15 @@ pub fn check(build: &mut Build) { - panic!("the iOS target is only supported on OSX"); - } - -- // Make sure musl-root is valid if specified -- if target.contains("musl") && !target.contains("mips") { -+ // Make sure musl-root is valid -+ if target.contains("musl") { -+ // If this is a native target (host is also musl) and no musl-root is given, -+ // fall back to the system toolchain in /usr before giving up -+ if build.musl_root(target).is_none() && build.config.build == *target { -+ let target = build.config.target_config.entry(target.clone()) -+ .or_insert(Default::default()); -+ target.musl_root = Some("/usr".into()); -+ } - match build.musl_root(target) { - Some(root) => { - if fs::metadata(root.join("lib/libc.a")).is_err() { -diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs -index 36a887e062..1075e4f0cf 100644 ---- a/src/librustc/session/mod.rs -+++ b/src/librustc/session/mod.rs -@@ -380,6 +381,24 @@ impl Session { - self.opts.debugging_opts.enable_nonzeroing_move_hints - } - -+ pub fn crt_static(&self) -> bool { -+ let requested_features = self.opts.cg.target_feature.split(','); -+ let found_negative = requested_features.clone().any(|r| r == "-crt-static"); -+ let found_positive = requested_features.clone().any(|r| r == "+crt-static"); -+ -+ // If the target we're compiling for requests a static crt by default, -+ // then see if the `-crt-static` feature was passed to disable that. -+ // Otherwise if we don't have a static crt by default then see if the -+ // `+crt-static` feature was passed. -+ let crt_static = if self.target.target.options.crt_static_default { -+ !found_negative -+ } else { -+ found_positive -+ }; -+ -+ return crt_static; -+ } -+ - pub fn must_not_eliminate_frame_pointers(&self) -> bool { - self.opts.debuginfo != DebugInfoLevel::NoDebugInfo || - !self.target.target.options.eliminate_frame_pointer -diff --git a/src/librustc_back/target/linux_musl_base.rs b/src/librustc_back/target/linux_musl_base.rs -index 18cca425a3..076bbe7193 100644 ---- a/src/librustc_back/target/linux_musl_base.rs -+++ b/src/librustc_back/target/linux_musl_base.rs -@@ -59,14 +59,7 @@ pub fn opts() -> TargetOptions { - base.pre_link_objects_exe.push("crti.o".to_string()); - base.post_link_objects.push("crtn.o".to_string()); - -- // MUSL support doesn't currently include dynamic linking, so there's no -- // need for dylibs or rpath business. Additionally `-pie` is incompatible -- // with `-static`, so we can't pass `-pie`. -- base.dynamic_linking = false; -- base.has_rpath = false; -- base.position_independent_executables = false; -- -- // These targets statically link libc by default -+ // Except for on MIPS, these targets statically link libc by default. - base.crt_static_default = true; - - base -diff --git a/src/librustc_back/target/mips_unknown_linux_musl.rs b/src/librustc_back/target/mips_unknown_linux_musl.rs -index e4a6d2a55d..77fcf9770d 100644 ---- a/src/librustc_back/target/mips_unknown_linux_musl.rs -+++ b/src/librustc_back/target/mips_unknown_linux_musl.rs -@@ -25,6 +25,7 @@ pub fn target() -> TargetResult { - features: "+mips32r2,+soft-float".to_string(), - max_atomic_width: Some(32), - -+ crt_static_default: false, - // see #36994 - exe_allocation_crate: "alloc_system".to_string(), - -diff --git a/src/librustc_back/target/mipsel_unknown_linux_musl.rs b/src/librustc_back/target/mipsel_unknown_linux_musl.rs -index 5693bddd04..6339e719e1 100644 ---- a/src/librustc_back/target/mipsel_unknown_linux_musl.rs -+++ b/src/librustc_back/target/mipsel_unknown_linux_musl.rs -@@ -25,6 +25,7 @@ pub fn target() -> TargetResult { - features: "+mips32,+soft-float".to_string(), - max_atomic_width: Some(32), - -+ crt_static_default: false, - // see #36994 - exe_allocation_crate: "alloc_system".to_string(), - -diff --git a/src/librustc_driver/target_features.rs b/src/librustc_driver/target_features.rs -index 124e7aafcc..492ceecaf1 100644 ---- a/src/librustc_driver/target_features.rs -+++ b/src/librustc_driver/target_features.rs -@@ -25,21 +25,7 @@ pub fn add_configuration(cfg: &mut ast::CrateConfig, sess: &Session) { - cfg.insert((tf, Some(feat))); - } - -- let requested_features = sess.opts.cg.target_feature.split(','); -- let found_negative = requested_features.clone().any(|r| r == "-crt-static"); -- let found_positive = requested_features.clone().any(|r| r == "+crt-static"); -- -- // If the target we're compiling for requests a static crt by default, -- // then see if the `-crt-static` feature was passed to disable that. -- // Otherwise if we don't have a static crt by default then see if the -- // `+crt-static` feature was passed. -- let crt_static = if sess.target.target.options.crt_static_default { -- !found_negative -- } else { -- found_positive -- }; -- -- if crt_static { -+ if sess.crt_static() { - cfg.insert((tf, Some(Symbol::intern("crt-static")))); - } - } -diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs -index defbb44448..f10c7d5c83 100644 ---- a/src/librustc_trans/back/link.rs -+++ b/src/librustc_trans/back/link.rs -@@ -703,13 +703,15 @@ fn link_natively(sess: &Session, - let root = sess.target_filesearch(PathKind::Native).get_lib_path(); - cmd.args(&sess.target.target.options.pre_link_args); - -- let pre_link_objects = if crate_type == config::CrateTypeExecutable { -- &sess.target.target.options.pre_link_objects_exe -- } else { -- &sess.target.target.options.pre_link_objects_dll -- }; -- for obj in pre_link_objects { -- cmd.arg(root.join(obj)); -+ if sess.crt_static() { -+ let pre_link_objects = if crate_type == config::CrateTypeExecutable { -+ &sess.target.target.options.pre_link_objects_exe -+ } else { -+ &sess.target.target.options.pre_link_objects_dll -+ }; -+ for obj in pre_link_objects { -+ cmd.arg(root.join(obj)); -+ } - } - - { -@@ -718,12 +720,14 @@ fn link_natively(sess: &Session, - cmd = linker.finalize(); - } - if let Some(args) = sess.target.target.options.late_link_args.get(&flavor) { - cmd.args(args); - } -- for obj in &sess.target.target.options.post_link_objects { -- cmd.arg(root.join(obj)); -+ if sess.crt_static() { -+ for obj in &sess.target.target.options.post_link_objects { -+ cmd.arg(root.join(obj)); -+ } - } - if let Some(args) = sess.target.target.options.post_link_args.get(&flavor) { - cmd.args(args); - } - -diff --git a/src/libstd/build.rs b/src/libstd/build.rs -index 9504194393..dd2008c206 100644 ---- a/src/libstd/build.rs -+++ b/src/libstd/build.rs -@@ -35,7 +35,7 @@ fn main() { - println!("cargo:rustc-link-lib=dl"); - println!("cargo:rustc-link-lib=log"); - println!("cargo:rustc-link-lib=gcc"); -- } else if !target.contains("musl") || target.contains("mips") { -+ } else if !target.contains("musl") { - println!("cargo:rustc-link-lib=dl"); - println!("cargo:rustc-link-lib=rt"); - println!("cargo:rustc-link-lib=pthread"); -diff --git a/src/libunwind/build.rs b/src/libunwind/build.rs -index db41a368a1..b1a86f04ef 100644 ---- a/src/libunwind/build.rs -+++ b/src/libunwind/build.rs -@@ -16,8 +16,8 @@ fn main() { - let target = env::var("TARGET").expect("TARGET was not set"); - - if target.contains("linux") { -- if target.contains("musl") && !target.contains("mips") { -- println!("cargo:rustc-link-lib=static=unwind"); -+ if target.contains("musl") { -+ println!("cargo:rustc-link-lib=unwind"); - } else if !target.contains("android") { - println!("cargo:rustc-link-lib=gcc_s"); - } -diff --git a/src/liblibc/src/unix/mod.rs b/src/liblibc/src/unix/mod.rs ---- a/src/liblibc/src/unix/mod.rs -+++ b/src/liblibc/src/unix/mod.rs -@@ -210,8 +210,7 @@ cfg_if! { - // cargo build, don't pull in anything extra as the libstd dep - // already pulls in all libs. -- } else if #[cfg(any(all(target_env = "musl", not(target_arch = "mips"))))] { -+ } else if #[cfg(target_env = "musl")] { -- #[link(name = "c", kind = "static", cfg(target_feature = "crt-static"))] -- #[link(name = "c", cfg(not(target_feature = "crt-static")))] -+ #[link(name = "c")] - extern {} - } else if #[cfg(target_os = "emscripten")] { - #[link(name = "c")] --- -2.12.2 - |