def testCreateNameToSymbolInfo(self): name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo( self.symbol_infos) self.assertEquals(len(name_to_symbol_info), 3) for i in range(3): name = self.symbol_infos[i].name self.assertIn(name, name_to_symbol_info) self.assertEquals(self.symbol_infos[i], name_to_symbol_info[name])
def testSymbolCollisions(self): symbol_infos_with_collision = list(self.symbol_infos) symbol_infos_with_collision.append( symbol_extractor.SymbolInfo('secondNameAtOffset', 0x84, 42, '.text')) # The symbol added above should not affect the output. name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo( self.symbol_infos) self.assertEquals(len(name_to_symbol_info), 3) for i in range(3): name = self.symbol_infos[i].name self.assertIn(name, name_to_symbol_info) self.assertEquals(self.symbol_infos[i], name_to_symbol_info[name])
def _CountMisorderedSymbols(symbols, symbol_infos): """Count the number of misordered symbols, and log them. Args: symbols: ordered sequence of symbols from the orderfile symbol_infos: ordered list of SymbolInfo from the binary Returns: (misordered_pairs_count, matched_symbols_count, unmatched_symbols_count) """ name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo(symbol_infos) matched_symbol_infos = [] missing_count = 0 misordered_count = 0 # Find the SymbolInfo matching the orderfile symbols in the binary. for symbol in symbols: if symbol in name_to_symbol_info: matched_symbol_infos.append(name_to_symbol_info[symbol]) else: missing_count += 1 if missing_count < _MAX_WARNINGS_TO_PRINT: logging.warning( 'Symbol "%s" is in the orderfile, not in the binary' % symbol) logging.info( '%d matched symbols, %d un-matched (Only the first %d unmatched' ' symbols are shown)' % (len(matched_symbol_infos), missing_count, _MAX_WARNINGS_TO_PRINT)) # In the order of the orderfile, find all the symbols that are at an offset # smaller than their immediate predecessor, and record the pair. previous_symbol_info = symbol_extractor.SymbolInfo(name='', offset=-1, size=0, section='') for symbol_info in matched_symbol_infos: if symbol_info.offset < previous_symbol_info.offset and not ( _IsSameMethod(symbol_info.name, previous_symbol_info.name)): logging.warning('Misordered pair: %s - %s' % (str(previous_symbol_info), str(symbol_info))) misordered_count += 1 previous_symbol_info = symbol_info return (misordered_count, len(matched_symbol_infos), missing_count)