Skip to content

Commit

Permalink
rustc: Work around a segmentation fault
Browse files Browse the repository at this point in the history
On Linux/Mac, I got a segmentation fault:

  (gdb) bt
  #0  0x00000000007519af in glue_take584 ()
  rust-lang#1  0x00000000006d4bec in
    back::rpath::get_rpath_flags::_3899df2ca513c603 ()
  rust-lang#2  0x00000000006c7655 in back::link::link_binary::_7afde00a9791031c ()
  rust-lang#3  0x00000000007d3ff5 in driver::rustc::compile_input::thunk9212 ()
  rust-lang#4  0x0000000000710f24 in driver::rustc::time::_3e691b2a4ba58aee ()
  rust-lang#5  0x000000000071a79d in
    driver::rustc::compile_input::_7b4a41b87c18e034 ()
  rust-lang#6  0x000000000072f0a9 in driver::rustc::main::_cd8b8c8185af3dee ()
  rust-lang#7  0x000000000072f1ed in _rust_main ()
  rust-lang#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.
  • Loading branch information
lht committed Dec 12, 2011
1 parent 3d20a09 commit 7efc9b0
Showing 1 changed file with 24 additions and 24 deletions.
48 changes: 24 additions & 24 deletions src/comp/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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") {
Expand Down Expand Up @@ -655,7 +655,7 @@ fn link_binary(sess: session::session,
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
Expand Down

0 comments on commit 7efc9b0

Please sign in to comment.