MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / ParseSymbolTable

Method ParseSymbolTable

view/macho/machoview.cpp:2959–3177  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2957
2958
2959void MachoView::ParseSymbolTable(BinaryReader& reader, MachOHeader& header, const symtab_command& symtab, const vector<uint32_t>& indirectSymbols)
2960{
2961 if (header.ident.filetype == MH_DSYM)
2962 {
2963 m_logger->LogDebug("Skipping symbol parsing");
2964 return;
2965 }
2966
2967 try
2968 {
2969 //First parse the imports
2970 if (header.dyldInfoPresent)
2971 {
2972 m_logger->LogDebug("Bind symbols");
2973 ParseDynamicTable(reader, header, ImportAddressSymbol, header.dyldInfo.bind_off,
2974 header.dyldInfo.bind_size, GlobalBinding);
2975 m_logger->LogDebug("Weak symbols");
2976 ParseDynamicTable(reader, header, ImportAddressSymbol, header.dyldInfo.weak_bind_off,
2977 header.dyldInfo.weak_bind_size, WeakBinding);
2978 m_logger->LogDebug("Lazy symbols");
2979 ParseDynamicTable(reader, header, ImportAddressSymbol, header.dyldInfo.lazy_bind_off,
2980 header.dyldInfo.lazy_bind_size, GlobalBinding);
2981 m_logger->LogDebug("Parsing rebase table");
2982 ParseRebaseTable(reader, header, header.dyldInfo.rebase_off, header.dyldInfo.rebase_size);
2983 }
2984 if (header.chainedFixupsPresent)
2985 {
2986 m_logger->LogDebug("Chained Fixups");
2987 ParseChainedFixups(header, header.chainedFixups);
2988 }
2989 else if (header.chainStartsPresent)
2990 {
2991 m_logger->LogDebug("Chained Starts");
2992 ParseChainedStarts(header, header.chainStarts);
2993 }
2994 if (header.exportTriePresent && header.isMainHeader)
2995 ParseExportTrie(reader, header.exportTrie);
2996
2997 //Then process the symtab
2998 if (header.stringListSize == 0)
2999 return;
3000 reader.Seek(symtab.symoff);
3001
3002 unordered_map<size_t, vector<std::pair<section_64*, size_t>>> stubSymbols;
3003 for (auto& symbolStubs : header.symbolStubSections)
3004 {
3005 if (!symbolStubs.reserved2)
3006 continue;
3007
3008 size_t needed = symbolStubs.size / symbolStubs.reserved2;
3009 for (size_t j = 0; (j < needed) && ((j + symbolStubs.reserved1) < indirectSymbols.size()); j++)
3010 {
3011 auto symNum = indirectSymbols[j + symbolStubs.reserved1];
3012 if (symNum == INDIRECT_SYMBOL_ABS)
3013 continue;
3014 else if (symNum == INDIRECT_SYMBOL_LOCAL)
3015 continue;
3016

Callers

nothing calls this directly

Calls 13

LogDebugMethod · 0.80
push_backMethod · 0.80
GetDataAtMethod · 0.80
c_strMethod · 0.80
findMethod · 0.80
SeekMethod · 0.45
sizeMethod · 0.45
Read32Method · 0.45
Read8Method · 0.45
Read16Method · 0.45
Read64Method · 0.45
lengthMethod · 0.45

Tested by

no test coverage detected