From c9dbb48365bf1a0c5c06daa2234e21e64d9bc2f7 Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Fri, 13 Feb 2026 18:33:54 -0800 Subject: [DSC] Correctly mark symbols as having local, global, or weak binding --- view/sharedcache/core/MachO.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'view/sharedcache/core/MachO.cpp') diff --git a/view/sharedcache/core/MachO.cpp b/view/sharedcache/core/MachO.cpp index 29122dad..f3f9ec6c 100644 --- a/view/sharedcache/core/MachO.cpp +++ b/view/sharedcache/core/MachO.cpp @@ -457,7 +457,8 @@ std::optional SharedCacheMachOHeader::ParseHeaderForAddr return header; } -std::vector SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo) const +std::vector SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo, + BNSymbolBinding bindingOverride) const { std::vector symbolList; // TODO: This assumes that 95% (or more) are going to be added. @@ -544,11 +545,15 @@ std::vector SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory& if ((nlist.n_desc & N_ARM_THUMB_DEF) == N_ARM_THUMB_DEF) symbolAddress++; - CacheSymbol symbol; - symbol.address = symbolAddress; - symbol.name = std::move(symbolName); - symbol.type = symbolType.value(); - symbolList.emplace_back(symbol); + BNSymbolBinding symbolBinding = GlobalBinding; + if (bindingOverride != NoBinding) + symbolBinding = bindingOverride; + else if (dysymPresent && dysymtab.nlocalsym && entryIndex >= dysymtab.ilocalsym && entryIndex < dysymtab.ilocalsym + dysymtab.nlocalsym) + symbolBinding = LocalBinding; + else if (nlist.n_desc & N_WEAK_DEF) + symbolBinding = WeakBinding; + + symbolList.emplace_back(symbolType.value(), symbolBinding, symbolAddress, std::move(symbolName)); } return symbolList; @@ -566,6 +571,9 @@ bool SharedCacheMachOHeader::AddExportTerminalSymbol( if (symbolName.empty() || symbolAddress == 0) return false; + // Export trie entries are exported by definition. + BNSymbolBinding symbolBinding = (symbolFlags & EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION) ? WeakBinding : GlobalBinding; + // Tries to get the symbol type based off the section containing it. auto sectionSymbolType = [&]() -> BNSymbolType { uint32_t sectionFlags = 0; @@ -593,10 +601,10 @@ bool SharedCacheMachOHeader::AddExportTerminalSymbol( { case EXPORT_SYMBOL_FLAGS_KIND_REGULAR: case EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL: - symbols.emplace_back(sectionSymbolType(), symbolAddress, symbolName); + symbols.emplace_back(sectionSymbolType(), symbolBinding, symbolAddress, symbolName); break; case EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE: - symbols.emplace_back(DataSymbol, symbolAddress, symbolName); + symbols.emplace_back(DataSymbol, symbolBinding, symbolAddress, symbolName); break; default: LogWarnF("Unhandled export symbol kind: {:#x}", symbolFlags & EXPORT_SYMBOL_FLAGS_KIND_MASK); -- cgit v1.3.1