#!/usr/bin/env python3 """Embed a binary file into the kernel image as a C byte array. Used by the build to carry the statically linked /sbin/init ELF inside the kernel, so the ELF loader has something to run before any filesystem is mounted. usage: mkblob.py """ import os import sys def main(): if len(sys.argv) != 4: sys.stderr.write(f"usage: {os.path.basename(sys.argv[0])} " " \n") return 2 src, dst, symbol = sys.argv[1], sys.argv[2], sys.argv[3] try: with open(src, "rb") as handle: payload = handle.read() except OSError as exc: sys.stderr.write(f"mkblob: cannot read {src}: {exc}\n") return 1 if not payload: sys.stderr.write(f"mkblob: {src} is empty\n") return 1 out = [ "/* Automatically generated by scripts/mkblob.py. Do not edit. */", f'/* source: {os.path.basename(src)} ({len(payload)} bytes) */', "", "#include ", "", f"const unsigned char {symbol}[] = {{", ] for offset in range(0, len(payload), 12): chunk = payload[offset:offset + 12] out.append(" " + " ".join(f"0x{b:02x}," for b in chunk)) out += [ "};", "", f"const size_t {symbol}_len = sizeof({symbol});", "", ] os.makedirs(os.path.dirname(os.path.abspath(dst)), exist_ok=True) try: with open(dst, "w") as handle: handle.write("\n".join(out)) except OSError as exc: sys.stderr.write(f"mkblob: cannot write {dst}: {exc}\n") return 1 return 0 if __name__ == "__main__": sys.exit(main())