]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Pass --enable-long-section-names to gcc
authorAlex Crichton <alex@alexcrichton.com>
Thu, 3 Apr 2014 01:27:12 +0000 (18:27 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Sun, 6 Apr 2014 00:53:44 +0000 (17:53 -0700)
This was quite a curious bug on windows, and the details can be found in the
comment I added to src/librustc/back/link.rs

src/liblibc/lib.rs
src/librustc/back/link.rs
src/test/run-make/lto-smoke-c/Makefile
src/test/run-make/lto-smoke-c/foo.rs

index 00aee1d17dcfa3cbb56432b6b2b6b03c8a1c0899..fc7044ed88ad53ac064e2b7d5fb65a99d9f5b858 100644 (file)
@@ -75,6 +75,8 @@
 #![allow(missing_doc)]
 #![allow(uppercase_variables)]
 
+#![feature(link_args)] // NOTE: remove after stage0
+
 #[cfg(test)] extern crate std;
 #[cfg(test)] extern crate test;
 #[cfg(test)] extern crate native;
 #[link(name = "m")]
 extern {}
 
+// NOTE: remove this after a stage0 snap
+#[cfg(stage0, windows)]
+#[link_args = "-Wl,--enable-long-section-names"]
+extern {}
+
 /// A wrapper for a nullable pointer. Don't use this except for interacting
 /// with libc. Basically Option, but without the dependance on libstd.
 // If/when libprim happens, this can be removed in favor of that
index a329f850ed40ca149d9dafd66701cc5b222d2350..19ec2d465c2dac74af5c07bcbd4c01e3fa89d3c3 100644 (file)
@@ -1127,6 +1127,33 @@ fn link_args(sess: &Session,
         // DWARF stack unwinding will not work.
         // This behavior may be overridden by --link-args "-static-libgcc"
         args.push(~"-shared-libgcc");
+
+        // And here, we see obscure linker flags #45. On windows, it has been
+        // found to be necessary to have this flag to compile liblibc.
+        //
+        // First a bit of background. On Windows, the file format is not ELF,
+        // but COFF (at least according to LLVM). COFF doesn't officially allow
+        // for section names over 8 characters, apparently. Our metadata
+        // section, ".note.rustc", you'll note is over 8 characters.
+        //
+        // On more recent versions of gcc on mingw, apparently the section name
+        // is *not* truncated, but rather stored elsewhere in a separate lookup
+        // table. On older versions of gcc, they apparently always truncated the
+        // section names (at least in some cases). Truncating the section name
+        // actually creates "invalid" objects [1] [2], but only for some
+        // introspection tools, not in terms of whether it can be loaded.
+        //
+        // Long story shory, passing this flag forces the linker to *not*
+        // truncate section names (so we can find the metadata section after
+        // it's compiled). The real kicker is that rust compiled just fine on
+        // windows for quite a long time *without* this flag, so I have no idea
+        // why it suddenly started failing for liblibc. Regardless, we
+        // definitely don't want section name truncation, so we're keeping this
+        // flag for windows.
+        //
+        // [1] - https://sourceware.org/bugzilla/show_bug.cgi?id=13130
+        // [2] - https://code.google.com/p/go/issues/detail?id=2139
+        args.push(~"-Wl,--enable-long-section-names");
     }
 
     if sess.targ_cfg.os == abi::OsAndroid {
index 6a7039277365291e5832a349881b5b3e12465c49..8658950f1744364dd2398e77d29a2a155ec34606 100644 (file)
@@ -4,6 +4,9 @@ ifneq ($(shell uname),Darwin)
        EXTRAFLAGS := -lm -lrt -ldl -lpthread
 endif
 
+# Apparently older versions of GCC segfault if -g is passed...
+CC := $(CC:-g=)
+
 all:
        $(RUSTC) foo.rs -Z lto
        ln -s $(call STATICLIB,foo-*) $(call STATICLIB,foo)
index 4cb7a7493857a0ced19c09805d178349934d20f3..1bb1901670035c4ad6c04084ca4fc81af281faaa 100644 (file)
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#[crate_type = "staticlib"];
+#![crate_type = "staticlib"]
 
 #[no_mangle]
 pub extern "C" fn foo() {}