Fix symbol tables in case of multiple object files with the same name

Fixes #1228
This commit is contained in:
bjorn3 2022-05-18 18:18:11 +02:00
parent 01ab51bb16
commit 7a10059268

View File

@ -117,7 +117,7 @@ enum BuilderKind {
let mut entries = Vec::new();
for (entry_name, entry) in self.entries {
for (mut entry_name, entry) in self.entries {
// FIXME only read the symbol table of the object files to avoid having to keep all
// object files in memory at once, or read them twice.
let data = match entry {
@ -140,6 +140,23 @@ enum BuilderKind {
};
if !self.no_builtin_ranlib {
if symbol_table.contains_key(&entry_name) {
// The ar crate can't handle creating a symbol table in case of multiple archive
// members with the same name. Work around this by prepending a number until we
// get a unique name.
for i in 1.. {
let new_name = format!("{}_", i)
.into_bytes()
.into_iter()
.chain(entry_name.iter().copied())
.collect::<Vec<_>>();
if !symbol_table.contains_key(&new_name) {
entry_name = new_name;
break;
}
}
}
match object::File::parse(&*data) {
Ok(object) => {
symbol_table.insert(