| 1234567891011121314151617181920212223242526272829303132333435 | #!/usr/bin/env python3import argparseimport elftools.elf.elffilefrom lib.io import fataldef main():    ap = argparse.ArgumentParser()    ap.add_argument('elf', help='Firmware ELF file')    ap.add_argument('cat', help='Binary language catalog file')    ap.add_argument('bin', help='Firmware BIN file')    args = ap.parse_args()    # get the language table position    elf = elftools.elf.elffile.ELFFile(open(args.elf, "rb"))    symtab = elf.get_section_by_name('.symtab')    lang_table_sym = symtab.get_symbol_by_name('_SEC_LANG')[0]    lang_table_start = lang_table_sym.entry.st_value    lang_table_size = lang_table_sym.entry.st_size    # read the binary catalog    cat = open(args.cat, "rb").read()    if len(cat) > lang_table_size:        fatal("language catalog too large")    # patch the symbol    with open(args.bin, "r+b") as fw:        fw.seek(lang_table_start)        fw.write(cat)    return 0if __name__ == '__main__':    exit(main())
 |