import struct, sys
src, outdir = sys.argv[1], sys.argv[2]
d = open(src, 'rb').read()
assert d[:4] == b'\x7fELF' and d[4] == 1, "not ELF32"
phoff, = struct.unpack_from('<I', d, 0x1C)
phentsize, phnum = struct.unpack_from('<HH', d, 0x2A)
for i in range(phnum):
    p_type, p_off, p_vaddr, p_paddr, p_filesz, p_memsz, _, _ = struct.unpack_from('<8I', d, phoff + i * phentsize)
    if p_type != 1:  # PT_LOAD
        continue
    flash_off = p_paddr & 0x0FFFFFFF          # same rule as SDK bootloader_uniflash_mcelf.c
    out = f"{outdir}/xip_seg{i}_0x{0x60000000 + flash_off:08X}.bin"
    open(out, 'wb').write(d[p_off:p_off + p_filesz])
    print(f"seg{i}: paddr=0x{p_paddr:08X} size=0x{p_filesz:X} flash_off=0x{flash_off:X} jtag_addr=0x{0x60000000+flash_off:08X} block={flash_off//0x10000}..{(flash_off+p_filesz-1)//0x10000} -> {out}")
