| 2957 | |
| 2958 | |
| 2959 | void 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 |
nothing calls this directly
no test coverage detected