]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Work around a segmentation fault
authorHaitao Li <lihaitao@gmail.com>
Mon, 12 Dec 2011 13:40:03 +0000 (21:40 +0800)
committerGraydon Hoare <graydon@mozilla.com>
Tue, 13 Dec 2011 00:15:29 +0000 (16:15 -0800)
On Linux/Mac, I got a segmentation fault:

  (gdb) bt
  #0  0x00000000007519af in glue_take584 ()
  #1  0x00000000006d4bec in
    back::rpath::get_rpath_flags::_3899df2ca513c603 ()
  #2  0x00000000006c7655 in back::link::link_binary::_7afde00a9791031c ()
  #3  0x00000000007d3ff5 in driver::rustc::compile_input::thunk9212 ()
  #4  0x0000000000710f24 in driver::rustc::time::_3e691b2a4ba58aee ()
  #5  0x000000000071a79d in
    driver::rustc::compile_input::_7b4a41b87c18e034 ()
  #6  0x000000000072f0a9 in driver::rustc::main::_cd8b8c8185af3dee ()
  #7  0x000000000072f1ed in _rust_main ()
  #8  0x00007ffff7e6e146 in task_start_wrapper (a=<optimized out>) at
    ../src/rt/rust_task.cpp:176

The variable `output` or `out_filename` becomes (null) after the definition
of `fn unlib`. Move the function defintion to the beginning seems
prevent the crash on Linux.

src/comp/back/link.rs

index aa00cf680549a9f8ed4ad091202fd271bb96da04..d6cbd2aa9faea49fbba6e87e90c24b0e02e79979 100644 (file)
@@ -561,6 +561,29 @@ fn link_binary(sess: session::session,
                obj_filename: str,
                out_filename: str,
                lm: link_meta) {
+    // Converts a library file name into a gcc -l argument
+    fn unlib(config: @session::config, filename: str) -> str {
+        let rmlib =
+            bind fn (config: @session::config, filename: str) -> str {
+                     if config.os == session::os_macos ||
+                            config.os == session::os_linux &&
+                                str::find(filename, "lib") == 0 {
+                         ret str::slice(filename, 3u,
+                                        str::byte_len(filename));
+                     } else { ret filename; }
+                 }(config, _);
+        fn rmext(filename: str) -> str {
+            let parts = str::split(filename, '.' as u8);
+            vec::pop(parts);
+            ret str::connect(parts, ".");
+        }
+        ret alt config.os {
+              session::os_macos. { rmext(rmlib(filename)) }
+              session::os_linux. { rmext(rmlib(filename)) }
+              _ { rmext(filename) }
+            };
+    }
+
     let output = if sess.building_library() {
         let long_libname =
             std::os::dylib_filename(#fmt("%s-%s-%s",
@@ -585,29 +608,6 @@ fn link_binary(sess: session::session,
         lib_cmd = "-dynamiclib";
     } else { lib_cmd = "-shared"; }
 
-    // Converts a library file name into a gcc -l argument
-    fn unlib(config: @session::config, filename: str) -> str {
-        let rmlib =
-            bind fn (config: @session::config, filename: str) -> str {
-                     if config.os == session::os_macos ||
-                            config.os == session::os_linux &&
-                                str::find(filename, "lib") == 0 {
-                         ret str::slice(filename, 3u,
-                                        str::byte_len(filename));
-                     } else { ret filename; }
-                 }(config, _);
-        fn rmext(filename: str) -> str {
-            let parts = str::split(filename, '.' as u8);
-            vec::pop(parts);
-            ret str::connect(parts, ".");
-        }
-        ret alt config.os {
-              session::os_macos. { rmext(rmlib(filename)) }
-              session::os_linux. { rmext(rmlib(filename)) }
-              _ { rmext(filename) }
-            };
-    }
-
     let cstore = sess.get_cstore();
     for cratepath: str in cstore::get_used_crate_files(cstore) {
         if str::ends_with(cratepath, ".rlib") {
@@ -655,7 +655,7 @@ fn rmext(filename: str) -> str {
         gcc_args += ["-lmorestack"];
     }
 
-    gcc_args += rpath::get_rpath_flags(sess, out_filename);
+    gcc_args += rpath::get_rpath_flags(sess, output);
 
     log #fmt("gcc link args: %s", str::connect(gcc_args, " "));
     // We run 'gcc' here