def main(argv): status = 0 try: config = Config().init({ **memdf.util.config.CONFIG, **memdf.collect.PREFIX_CONFIG, **memdf.collector.readelf.NM_CONFIG, **memdf.report.REPORT_CONFIG, **memdf.report.OUTPUT_CONFIG, **BLOCKLIST_CONFIG, }) config.argparse.add_argument('inputs', metavar='FILE', nargs='+') config = config.parse(argv) block_re: Optional[Pattern] = config.get_re('symbol.block') if block_re is None: logging.warning('No block list') else: frames = [] for filename in config.get('args.inputs', []): ssdf = memdf.collector.readelf.read_sources(config, filename) frames.append(ssdf[ssdf.kind == 'U']) ssdf = pd.concat(frames) ssdf = ssdf[ssdf.symbol.str.fullmatch(block_re)] memdf.report.write_dfs(config, {'Symbols': ssdf}) except Exception as exception: raise exception return status
def postprocess_symbols(config: Config, symbols: SymbolDF) -> SymbolDF: """Postprocess a symbol table after collecting from one source. If the symbol table contains FILE symbols, they will be removed and replaced by a 'file' column on other symbols. If the symbol table contains ARM mode symbols, they will be removed and replaced by an 'arm' column on other symbols. """ files = [] arms = [] arm_symbols = {} current_file = '' current_arm = '' has_file = False if config['collect.prefix-file']: prefixes = config.get_re('collect.prefix') else: prefixes = None if 'type' in symbols.columns: for symbol in symbols.itertuples(): if symbol.type == 'FILE': has_file = True current_file = symbol.symbol if prefixes: current_file = simplify_source(current_file, prefixes) elif symbol.type == 'NOTYPE': if symbol.symbol.startswith('$'): if current_arm or symbol.symbol in ARM_SPECIAL_SYMBOLS: current_arm = symbol.symbol arm_symbols[current_arm] = True files.append(current_file) arms.append(current_arm) if has_file: symbols['file'] = files if current_arm: symbols['arm'] = arms if has_file: symbols = symbols[symbols['type'] != 'FILE'] if current_arm: syms = arm_symbols.keys() symbols = symbols[~symbols.symbol.isin(syms)] return symbols