Skip to content

Commit

Permalink
Check if the archive has already been added to avoid duplicates
Browse files Browse the repository at this point in the history
This avoids adding archives multiple times, which results in duplicate
objects in the resulting rlib, leading to symbol collision and link
failures. This could happen when crate contains multiple link attributes
that all reference the same archive.
  • Loading branch information
petrhosek committed Jul 2, 2019
1 parent 17e62f7 commit 069c52f
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/librustc_codegen_llvm/back/archive.rs
Expand Up @@ -36,11 +36,20 @@ enum Addition {
name_in_archive: String,
},
Archive {
path: PathBuf,
archive: ArchiveRO,
skip: Box<dyn FnMut(&str) -> bool>,
},
}

impl Addition {
fn path(&self) -> &Path {
match self {
Addition::File { path, .. } | Addition::Archive { path, .. } => path,
}
}
}

fn is_relevant_child(c: &Child<'_>) -> bool {
match c.name() {
Some(name) => !name.contains("SYMDEF"),
Expand Down Expand Up @@ -188,12 +197,16 @@ impl<'a> LlvmArchiveBuilder<'a> {
-> io::Result<()>
where F: FnMut(&str) -> bool + 'static
{
let archive = match ArchiveRO::open(archive) {
let archive_ro = match ArchiveRO::open(archive) {
Ok(ar) => ar,
Err(e) => return Err(io::Error::new(io::ErrorKind::Other, e)),
};
if self.additions.iter().any(|ar| ar.path() == archive) {
return Ok(())
}
self.additions.push(Addition::Archive {
archive,
path: archive.to_path_buf(),
archive: archive_ro,
skip: Box::new(skip),
});
Ok(())
Expand Down Expand Up @@ -243,7 +256,7 @@ impl<'a> LlvmArchiveBuilder<'a> {
strings.push(path);
strings.push(name);
}
Addition::Archive { archive, skip } => {
Addition::Archive { archive, skip, .. } => {
for child in archive.iter() {
let child = child.map_err(string_to_io_error)?;
if !is_relevant_child(&child) {
Expand Down

0 comments on commit 069c52f

Please sign in to comment.