diff --git a/src/librustc/back/archive.rs b/src/librustc/back/archive.rs index eec15f798278..c1916714bf28 100644 --- a/src/librustc/back/archive.rs +++ b/src/librustc/back/archive.rs @@ -103,8 +103,9 @@ impl Archive { } /// Adds an arbitrary file to this archive - pub fn add_file(&mut self, file: &Path) { - run_ar(self.sess, "r", None, [&self.dst, file]); + pub fn add_file(&mut self, file: &Path, has_symbols: bool) { + let cmd = if has_symbols {"r"} else {"rS"}; + run_ar(self.sess, cmd, None, [&self.dst, file]); } /// Removes a file from this archive @@ -112,6 +113,12 @@ impl Archive { run_ar(self.sess, "d", None, [&self.dst, &Path::new(file)]); } + /// Update all symbols in the archive (runs 'ar s' over it) + pub fn update_symbols(&mut self) { + run_ar(self.sess, "s", None, [&self.dst]); + } + + /// List all files in an archive pub fn files(&self) -> ~[~str] { let output = run_ar(self.sess, "t", None, [&self.dst]); str::from_utf8(output.output).lines().map(|s| s.to_owned()).collect() diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index 451213ab694f..43a08d1c998c 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -982,16 +982,21 @@ fn link_rlib(sess: Session, // contain the metadata in a separate file. let metadata = obj_filename.with_filename(METADATA_FILENAME); fs::File::create(&metadata).write(trans.metadata); - a.add_file(&metadata); + a.add_file(&metadata, false); fs::unlink(&metadata); // For LTO purposes, the bytecode of this library is also inserted // into the archive. let bc = obj_filename.with_extension("bc"); - a.add_file(&bc); + a.add_file(&bc, false); if !sess.opts.save_temps { fs::unlink(&bc); } + + // Now that we've added files, some platforms need us to now update + // the symbol table in the archive (because some platforms die when + // adding files to the archive without symbols). + a.update_symbols(); } None => {}