diff --git a/bolt/include/bolt/Core/BinaryData.h b/bolt/include/bolt/Core/BinaryData.h --- a/bolt/include/bolt/Core/BinaryData.h +++ b/bolt/include/bolt/Core/BinaryData.h @@ -117,6 +117,7 @@ bool isAbsolute() const; bool isMoveable() const; + bool isWeak() const; uint64_t getAddress() const { return Address; } uint64_t getEndAddress() const { return Address + Size; } diff --git a/bolt/lib/Core/BinaryData.cpp b/bolt/lib/Core/BinaryData.cpp --- a/bolt/lib/Core/BinaryData.cpp +++ b/bolt/lib/Core/BinaryData.cpp @@ -32,6 +32,8 @@ bool BinaryData::isAbsolute() const { return Flags & SymbolRef::SF_Absolute; } +bool BinaryData::isWeak() const { return Flags & SymbolRef::SF_Weak; } + bool BinaryData::isMoveable() const { return (!isAbsolute() && (IsMoveable && (!Parent || isTopLevelJumpTable()))); } diff --git a/bolt/lib/Passes/BinaryPasses.cpp b/bolt/lib/Passes/BinaryPasses.cpp --- a/bolt/lib/Passes/BinaryPasses.cpp +++ b/bolt/lib/Passes/BinaryPasses.cpp @@ -1159,7 +1159,7 @@ // Look up the symbol address in the global symbols map of the binary // context object. BinaryData *BD = BC.getBinaryDataByName(DisplSymbol->getName()); - if (!BD) + if (!BD || BD->isWeak()) continue; TargetAddress = BD->getAddress() + DisplOffset; } else if (!MIB->evaluateMemOperandTarget(Inst, TargetAddress)) {