aboutsummaryrefslogtreecommitdiffstats
path: root/community/rust/musl-fix-static-linking.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/rust/musl-fix-static-linking.patch')
-rw-r--r--community/rust/musl-fix-static-linking.patch85
1 files changed, 5 insertions, 80 deletions
diff --git a/community/rust/musl-fix-static-linking.patch b/community/rust/musl-fix-static-linking.patch
index fe9b39ea64..c697785ab8 100644
--- a/community/rust/musl-fix-static-linking.patch
+++ b/community/rust/musl-fix-static-linking.patch
@@ -1,13 +1,10 @@
From: Shiz <hi@shiz.me>
Date: Fri, 21 Apr 2017 01:04:46 +0200
+Last-Updated: Sat, 19 May 2018 23:54:30 +0200
Subject: [PATCH] Support fully static linking on *nix targets
It adds the proper linker argument for static result objects to `Linker`
-and implements them for `GnuLinker` and `MsvcLinker`. Additionally, when
-statically linking, all the objects are linked in a group (-Wl,-( and -Wl,-)
-on GNU-compatible linkers) to resolve dependency and order issues that may
-normally arise. For `MsvcLinker`, this is a no-op as it already exhibits
-this behavior by default.
+and implements them for `GnuLinker` and `MsvcLinker`.
Finally, if no linking preference is given for native libraries
(`NativeLibraryKind::NativeUnknown`), they are linked statically if full
@@ -15,32 +12,11 @@ static linking is requested, instead of dynamically as before.
--- a/src/librustc_trans/back/link.rs
+++ b/src/librustc_trans/back/link.rs
-@@ -951,17 +951,12 @@
- // list can't depend on items higher up in the list. For example nothing can
- // depend on what we just generated (e.g. that'd be a circular dependency).
- // Upstream rust libraries are not allowed to depend on our local native
-- // libraries as that would violate the structure of the DAG, in that
-- // scenario they are required to link to them as well in a shared fashion.
-- //
-- // Note that upstream rust libraries may contain native dependencies as
-- // well, but they also can't depend on what we just started to add to the
-- // link line. And finally upstream native libraries can't depend on anything
-- // in this DAG so far because they're only dylibs and dylibs can only depend
-- // on other dylibs (e.g. other native deps).
-+ // libraries as that would violate the structure of the DAG.
-+ cmd.start_group();
- add_local_native_libraries(cmd, sess, trans);
- add_upstream_rust_crates(cmd, sess, trans, crate_type, tmpdir);
- add_upstream_native_libraries(cmd, sess, trans, crate_type);
-+ cmd.end_group();
-
- // # Telling the linker what we're doing
-
-@@ -983,13 +983,13 @@
- let relevant_libs = sess.cstore.used_libraries().into_iter().filter(|l| {
+@@ -1151,13 +1151,13 @@
+ let relevant_libs = trans.crate_info.used_libraries.iter().filter(|l| {
relevant_lib(sess, l)
});
-
+
let search_path = archive_search_paths(sess);
for lib in relevant_libs {
match lib.kind {
@@ -51,54 +27,3 @@ static linking is requested, instead of dynamically as before.
NativeLibraryKind::NativeStatic => cmd.link_whole_staticlib(&lib.name.as_str(),
&search_path)
}
---- a/src/librustc_trans/back/linker.rs
-+++ b/src/librustc_trans/back/linker.rs
-@@ -116,6 +116,8 @@ pub trait Linker {
- fn subsystem(&mut self, subsystem: &str);
- // Should have been finalize(self), but we don't support self-by-value on trait objects (yet?).
- fn finalize(&mut self) -> Command;
-+ fn start_group(&mut self);
-+ fn end_group(&mut self);
- }
-
- pub struct GccLinker<'a> {
-@@ -178,6 +180,8 @@ impl<'a> Linker for GccLinker<'a> {
- fn output_filename(&mut self, path: &Path) { self.cmd.arg("-o").arg(path); }
- fn add_object(&mut self, path: &Path) { self.cmd.arg(path); }
- fn position_independent_executable(&mut self) { self.cmd.arg("-pie"); }
-+ fn start_group(&mut self) { self.cmd.arg("-Wl,-("); }
-+ fn end_group(&mut self) { self.cmd.arg("-Wl,-)"); }
- fn partial_relro(&mut self) { self.linker_arg("-z,relro"); }
- fn full_relro(&mut self) { self.linker_arg("-z,relro,-z,now"); }
- fn build_static_executable(&mut self) { self.cmd.arg("-static"); }
-@@ -577,6 +581,15 @@ impl<'a> Linker for MsvcLinker<'a> {
- }
- }
-
-+
-+ fn start_group(&mut self) {
-+ // Not needed
-+ }
-+
-+ fn end_group(&mut self) {
-+ // Not needed
-+ }
-+
- fn finalize(&mut self) -> Command {
- let mut cmd = Command::new("");
- ::std::mem::swap(&mut cmd, &mut self.cmd);
-@@ -727,6 +740,14 @@ impl<'a> Linker for EmLinker<'a> {
- // noop
- }
-
-+ fn start_group(&mut self) {
-+ self.cmd.arg("-Wl,-(");
-+ }
-+
-+ fn end_group(&mut self) {
-+ self.cmd.arg("-Wl,-)");
-+ }
-+
- fn finalize(&mut self) -> Command {
- let mut cmd = Command::new("");
- ::std::mem::swap(&mut cmd, &mut self.cmd);