#!/usr/bin/env python3 # # Copyright (c) 2017 Intel Corporation. # # SPDX-License-Identifier: Apache-2.0 # """ This script scans a specified object file and generates a header file that defined macros for the offsets of various found structure members (particularly symbols ending with ``_OFFSET`` or ``_SIZEOF``), primarily intended for use in assembly code. """ import argparse import sys from elftools.elf.elffile import ELFFile from elftools.elf.sections import SymbolTableSection def get_symbol_table(obj): for section in obj.iter_sections(): if isinstance(section, SymbolTableSection): return section raise LookupError("Could not find symbol table") def gen_offset_header(input_name, input_file, output_file): include_guard = "__GEN_OFFSETS_H__" output_file.write( f"""/* THIS FILE IS AUTO GENERATED. PLEASE DO NOT EDIT. * * This header file provides macros for the offsets of various structure * members. These offset macros are primarily intended to be used in * assembly code. */ #ifndef {include_guard} #define {include_guard}\n\n""" ) obj = ELFFile(input_file) for sym in get_symbol_table(obj).iter_symbols(): if isinstance(sym.name, bytes): sym.name = str(sym.name, 'ascii') if not sym.name.endswith(('_OFFSET', '_SIZEOF')): continue if sym.entry['st_shndx'] != 'SHN_ABS': continue if sym.entry['st_info']['bind'] != 'STB_GLOBAL': continue output_file.write(f"#define {sym.name} 0x{sym.entry['st_value']:x}\n") output_file.write(f"\n#endif /* {include_guard} */\n") return 0 if __name__ == '__main__': parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, allow_abbrev=False, ) parser.add_argument("-i", "--input", required=True, help="Input object file") parser.add_argument("-o", "--output", required=True, help="Output header file") args = parser.parse_args() with open(args.input, 'rb') as input_file, open(args.output, 'w') as output_file: ret = gen_offset_header(args.input, input_file, output_file) sys.exit(ret)