Loading...
--- dyld/dyld-1340/other-tools/SymbolicatedImage.cpp
+++ dyld/dyld-1285.19/other-tools/SymbolicatedImage.cpp
@@ -32,6 +32,7 @@
// llvm
#if HAVE_LIBLTO
+ #include <llvm-c/Disassembler.h>
extern "C" void lto_initialize_disassembler(); // from libLTO.dylib but not in Disassembler.h
extern "C" int LLVMSetDisasmOptions(LLVMDisasmContextRef context, uint64_t options);\
WEAK_LINK_FORCE_IMPORT(LLVMCreateDisasm);
@@ -70,10 +71,7 @@
{
// build list of sections
_image.header()->forEachSection(^(const Header::SectionInfo& sectInfo, bool& stop) {
- std::string sectName(sectInfo.segmentName);
- sectName += ",";
- sectName += sectInfo.sectionName;
- _sectionSymbols.push_back({sectName, sectInfo});
+ _sectionSymbols.push_back({sectInfo});
});
// check for encrypted range
@@ -98,13 +96,13 @@
// add symbols from nlist
_image.symbolTable().forEachDefinedSymbol(^(const Symbol& symbol, uint32_t symbolIndex, bool& stop) {
uint64_t absAddress;
- if ( !symbol.isAbsolute(absAddress) && (symbol.implOffset() != 0 || prefLoadAddress() == 0) && (symbol.sectionOrdinal()-1) < _sectionSymbols.size() ) {
+ if ( !symbol.isAbsolute(absAddress) && (symbol.implOffset() != 0) && symbol.sectionOrdinal() < _sectionSymbols.size() ) {
const char* symName = symbol.name().c_str();
_symbolsMap[_prefLoadAddress+symbol.implOffset()] = symName;
SectionSymbols& ss = _sectionSymbols[symbol.sectionOrdinal()-1];
uint64_t offsetInSection = _prefLoadAddress+symbol.implOffset()-ss.sectInfo.address;
- ss.symbols.push_back({offsetInSection, symName, symbol.isThumb()});
+ ss.symbols.push_back({offsetInSection, symName});
}
if ( symbol.scope() == Symbol::Scope::translationUnit )
hasLocalSymbols = true;
@@ -299,8 +297,6 @@
// sort symbols within section
for (SectionSymbols& ss : _sectionSymbols) {
std::sort(ss.symbols.begin(), ss.symbols.end(), [](const SectionSymbols::Sym& a, const SectionSymbols::Sym& b) {
- if ( a.offsetInSection == b.offsetInSection )
- return CString(a.name) < CString(b.name);
return (a.offsetInSection < b.offsetInSection);
});
}
@@ -348,7 +344,9 @@
uint64_t segOffset = (uint8_t*)fixup.location - (uint8_t*)(fixup.segment->content);
uint64_t runtimeOffset = fixup.segment->runtimeOffset + segOffset;
uint64_t address = _prefLoadAddress + runtimeOffset;
- SymbolLoc symbolLoc = findClosestSymbol(address);
+ const char* inSymbolName;
+ uint32_t inSymbolOffset;
+ this->findClosestSymbol(runtimeOffset, inSymbolName, inSymbolOffset);
uint32_t sectNum = 1;
for ( const SectionSymbols& ss : _sectionSymbols ) {
if ( ss.sectInfo.segmentName == fixup.segment->segName ) {
@@ -357,7 +355,7 @@
}
sectNum++;
}
- _fixups.push_back({fixup, symbolLoc, address, sectNum});
+ _fixups.push_back({fixup, address, inSymbolName, inSymbolOffset, sectNum});
}
@@ -366,40 +364,34 @@
// FIXME:
}
-SymbolicatedImage::SymbolLoc SymbolicatedImage::findClosestSymbol(uint64_t runtimeOffset) const
-{
- SymbolLoc loc;
+void SymbolicatedImage::findClosestSymbol(uint64_t runtimeOffset, const char*& inSymbolName, uint32_t& inSymbolOffset) const
+{
+ inSymbolName = "";
+ inSymbolOffset = 0;
for (const SectionSymbols& ss : _sectionSymbols) {
if ( (runtimeOffset >= ss.sectInfo.address) && (runtimeOffset < ss.sectInfo.address+ss.sectInfo.size) ) {
- if ( ss.symbols.empty() ) {
- loc.name = ss.sectStartName.c_str();
- loc.inSymbolOffset = (uint32_t)(runtimeOffset - ss.sectInfo.address);
- loc.isThumb = false;
- continue;
- }
-
// find largest symbol address that is <= target address
const uint64_t targetSectOffset = runtimeOffset-ss.sectInfo.address;
auto it = std::lower_bound(ss.symbols.begin(), ss.symbols.end(), targetSectOffset, [](const SectionSymbols::Sym& sym, uint64_t sectOffset) -> bool {
return sym.offsetInSection <= sectOffset;
});
// lower_bound returns the symbol after the one we need
- if ( it != ss.symbols.begin() ) {
+ if ( (it != ss.symbols.end()) && (it != ss.symbols.begin()) ) {
--it;
- loc.name = it->name;
- loc.inSymbolOffset = (uint32_t)(runtimeOffset - (ss.sectInfo.address+it->offsetInSection));
- loc.isThumb = it->thumb;
+ inSymbolName = it->name;
+ inSymbolOffset = (uint32_t)(runtimeOffset - (ss.sectInfo.address+it->offsetInSection));
+ }
+ else if ( ss.symbols.empty() ) {
+ inSymbolName = "";
+ inSymbolOffset = 0;
}
else {
- const SectionSymbols::Sym& sym = ss.symbols.front();
- loc.name = sym.name;
- loc.isThumb = sym.thumb;
- loc.inSymbolOffset = (uint32_t)(runtimeOffset - (ss.sectInfo.address + sym.offsetInSection));
+ inSymbolName = ss.symbols.front().name;
+ inSymbolOffset = (uint32_t)(runtimeOffset - (ss.sectInfo.address + ss.symbols.front().offsetInSection));
}
break;
}
}
- return loc;
}
const char* SymbolicatedImage::selectorFromObjCStub(uint64_t sectionVmAdr, const uint8_t* sectionContent, uint32_t& offset) const
@@ -926,16 +918,18 @@
}
else {
if ( symbolic ) {
- SymbolLoc loc = findClosestSymbol(fixup.rebase.targetVmOffset);
- if ( loc.name.starts_with("__TEXT,") ) {
+ const char* inSymbolName;
+ uint32_t inSymbolOffset;
+ this->findClosestSymbol(fixup.rebase.targetVmOffset, inSymbolName, inSymbolOffset);
+ if ( strncmp(inSymbolName, "__TEXT,", 7) == 0 ) {
const char* str = this->cStringAt(_prefLoadAddress+fixup.rebase.targetVmOffset);
snprintf(buffer, 4096, "\"%s\"%s", str, authInfo);
}
- else if ( loc.inSymbolOffset == 0 ) {
- snprintf(buffer, 4096, "%s%s", loc.name.c_str(), authInfo);
+ else if ( inSymbolOffset == 0 ) {
+ snprintf(buffer, 4096, "%s%s", inSymbolName, authInfo);
}
else {
- snprintf(buffer, 4096, "%s+%u%s", loc.name.c_str(), loc.inSymbolOffset, authInfo);
+ snprintf(buffer, 4096, "%s+%u%s", inSymbolName, inSymbolOffset, authInfo);
}
}
else {
@@ -952,10 +946,6 @@
LLVMDisasmDispose(_llvmRef);
_llvmRef = nullptr;
}
- if ( _llvmThumbRef != nullptr ) {
- LLVMDisasmDispose(_llvmThumbRef);
- _llvmThumbRef = nullptr;
- }
#endif
}
@@ -977,18 +967,10 @@
const char* SymbolicatedImage::targetTriple() const
{
Architecture arch = _image.header()->arch();
- if ( arch.usesArm64AuthPointers() )
+ if ( arch.usesArm64Instructions() )
return "arm64e-apple-darwin";
- else if ( arch.usesArm64Instructions() )
- return "arm64-apple-darwin";
else if ( arch.usesx86_64Instructions() )
return "x86_64h-apple-darwin";
- else if ( arch.usesThumbInstructions() && !arch.usesArm32Instructions() )
- return "thumbv7em-apple-darwin";
- else if ( arch.usesArm32Instructions() )
- return "armv7-apple-darwin";
- else if ( arch == Architecture::i386 )
- return "i386-apple-darwin";
else
return "unknown";
}
@@ -1010,13 +992,6 @@
_llvmRef = LLVMCreateDisasm(targetTriple(), this, 0, &printDumpOpInfoCallback, &printDumpSymbolCallback);
if ( _llvmRef != nullptr )
LLVMSetDisasmOptions(_llvmRef, LLVMDisassembler_Option_PrintImmHex);
-
- Architecture arch = _image.header()->arch();
- if ( arch.usesArm32Instructions() && arch.usesThumbInstructions() ) {
- _llvmThumbRef = LLVMCreateDisasm("thumbv7em-apple-darwin", this, 0, &printDumpOpInfoCallback, &printDumpSymbolCallback);
- if ( _llvmThumbRef != nullptr )
- LLVMSetDisasmOptions(_llvmThumbRef, LLVMDisassembler_Option_PrintImmHex);
- }
}