36 lines
979 B
Python
Executable File
36 lines
979 B
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import elftools.elf.elffile
|
|
|
|
from lib.io import fatal
|
|
|
|
|
|
def 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 0
|
|
|
|
if __name__ == '__main__':
|
|
exit(main())
|