@@ -457,7 +457,8 @@ std::optional<SharedCacheMachOHeader> SharedCacheMachOHeader::ParseHeaderForAddr
457457 return header;
458458}
459459
460- std::vector<CacheSymbol> SharedCacheMachOHeader::ReadSymbolTable (VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo) const
460+ std::vector<CacheSymbol> SharedCacheMachOHeader::ReadSymbolTable (VirtualMemory& vm, const TableInfo &symbolInfo, const TableInfo &stringInfo,
461+ BNSymbolBinding bindingOverride) const
461462{
462463 std::vector<CacheSymbol> symbolList;
463464 // TODO: This assumes that 95% (or more) are going to be added.
@@ -544,11 +545,15 @@ std::vector<CacheSymbol> SharedCacheMachOHeader::ReadSymbolTable(VirtualMemory&
544545 if ((nlist.n_desc & N_ARM_THUMB_DEF) == N_ARM_THUMB_DEF)
545546 symbolAddress++;
546547
547- CacheSymbol symbol;
548- symbol.address = symbolAddress;
549- symbol.name = std::move (symbolName);
550- symbol.type = symbolType.value ();
551- symbolList.emplace_back (symbol);
548+ BNSymbolBinding symbolBinding = GlobalBinding;
549+ if (bindingOverride != NoBinding)
550+ symbolBinding = bindingOverride;
551+ else if (dysymPresent && dysymtab.nlocalsym && entryIndex >= dysymtab.ilocalsym && entryIndex < dysymtab.ilocalsym + dysymtab.nlocalsym )
552+ symbolBinding = LocalBinding;
553+ else if (nlist.n_desc & N_WEAK_DEF)
554+ symbolBinding = WeakBinding;
555+
556+ symbolList.emplace_back (symbolType.value (), symbolBinding, symbolAddress, std::move (symbolName));
552557 }
553558
554559 return symbolList;
@@ -566,6 +571,9 @@ bool SharedCacheMachOHeader::AddExportTerminalSymbol(
566571 if (symbolName.empty () || symbolAddress == 0 )
567572 return false ;
568573
574+ // Export trie entries are exported by definition.
575+ BNSymbolBinding symbolBinding = (symbolFlags & EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION) ? WeakBinding : GlobalBinding;
576+
569577 // Tries to get the symbol type based off the section containing it.
570578 auto sectionSymbolType = [&]() -> BNSymbolType {
571579 uint32_t sectionFlags = 0 ;
@@ -593,10 +601,10 @@ bool SharedCacheMachOHeader::AddExportTerminalSymbol(
593601 {
594602 case EXPORT_SYMBOL_FLAGS_KIND_REGULAR:
595603 case EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL:
596- symbols.emplace_back (sectionSymbolType (), symbolAddress, symbolName);
604+ symbols.emplace_back (sectionSymbolType (), symbolBinding, symbolAddress, symbolName);
597605 break ;
598606 case EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE:
599- symbols.emplace_back (DataSymbol, symbolAddress, symbolName);
607+ symbols.emplace_back (DataSymbol, symbolBinding, symbolAddress, symbolName);
600608 break ;
601609 default :
602610 LogWarnF (" Unhandled export symbol kind: {:#x}" , symbolFlags & EXPORT_SYMBOL_FLAGS_KIND_MASK);
0 commit comments