[BOLT] Ignore duplicate global symbols

We noticed some binaries with duplicated global symbol
entries (same name, address and size). Ignore them as it is possibly a
bug in the linker, and continue processing, unless the symbol has a
different size or address.

Reviewed By: #bolt, maksfb

Differential Revision: https://reviews.llvm.org/D136122
This commit is contained in:
Rafael Auler 2022-10-17 19:01:46 -07:00
parent 925be4e7de
commit c0d954a068
1 changed files with 13 additions and 1 deletions

View File

@ -966,7 +966,19 @@ void RewriteInstance::discoverFileObjects() {
if (Name.empty()) {
UniqueName = "ANONYMOUS." + std::to_string(AnonymousId++);
} else if (cantFail(Symbol.getFlags()) & SymbolRef::SF_Global) {
assert(!BC->getBinaryDataByName(Name) && "global name not unique");
if (const BinaryData *BD = BC->getBinaryDataByName(Name)) {
if (BD->getSize() == ELFSymbolRef(Symbol).getSize() &&
BD->getAddress() == Address) {
if (opts::Verbosity > 1)
errs() << "BOLT-WARNING: ignoring duplicate global symbol " << Name
<< "\n";
// Ignore duplicate entry - possibly a bug in the linker
continue;
}
errs() << "BOLT-ERROR: bad input binary, global symbol \"" << Name
<< "\" is not unique\n";
exit(1);
}
UniqueName = Name;
} else {
// If we have a local file name, we should create 2 variants for the