diff options
| author | Mark Rowe <mark@vector35.com> | 2026-02-13 18:33:54 -0800 |
|---|---|---|
| committer | Mark Rowe <mark@vector35.com> | 2026-02-13 19:42:13 -0800 |
| commit | c9dbb48365bf1a0c5c06daa2234e21e64d9bc2f7 (patch) | |
| tree | dd476df611f5d74590d48afb869896670a8f560c /view/sharedcache/core/MachO.cpp | |
| parent | e2feac85c58785640a2760f137a44c08ef953931 (diff) | |
[DSC] Correctly mark symbols as having local, global, or weak binding
Diffstat (limited to 'view/sharedcache/core/MachO.cpp')
| -rw-r--r-- | view/sharedcache/core/MachO.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
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> SharedCacheMachOHeader::ParseHeaderForAddr return header; } -std::vector<CacheSymbol> SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo) const +std::vector<CacheSymbol> SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo, + BNSymbolBinding bindingOverride) const { std::vector<CacheSymbol> symbolList; // TODO: This assumes that 95% (or more) are going to be added. @@ -544,11 +545,15 @@ std::vector<CacheSymbol> 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); |
