#!/usr/bin/env python3
import sys
import subprocess
import os
import struct
def main():
if len(sys.argv) < 2:
sys.exit(1)
real_objcopy = sys.argv[1]
args = sys.argv[2:]
# 1. Сначала даем Zephyr собрать стандартные файлы прошивки (они пока в адресах 0x80000000)
final_cmd = [real_objcopy] + args
subprocess.run(final_cmd, check=True)
# Перехватываем этап генерации финального HEX-файла
if "--output-target=ihex" in " ".join(args):
elf_path = "zephyr.elf"
for arg in args:
if arg.endswith("zephyr.elf"):
elf_path = arg
break
build_dir = os.path.dirname(elf_path)
bin_path = os.path.join(build_dir, "zephyr.bin")
hex_path = os.path.join(build_dir, "zephyr.hex")
gdb_elf_path = os.path.join(build_dir, "zephyr_gdb.elf")
if os.path.exists(bin_path):
image_size = os.path.getsize(bin_path)
# Шаг А: Правим заголовок Boot Data Length (размер прошивки для BootROM)
with open(bin_path, "r+b") as f:
f.seek(0x24)
f.write(struct.pack("<I", image_size))
print(f"[LMA Filter] BootROM Patch: Fixed Boot Data Length to {image_size} bytes")
# Шаг Б: Смещаем LMA всего HEX-файла на физический адрес Flash (0x60000000).
# Вместо изменения отдельных секций, мы берем чистый бинарник (где адресов нет)
# и упаковываем его в HEX с нужного нам базового адреса флеш-памяти!
gen_hex_cmd = [
real_objcopy,
"-I", "binary",
"-O", "ihex",
"--change-addresses", "0x60000000",
bin_path,
hex_path
]
subprocess.run(gen_hex_cmd, check=True)
print("[LMA Filter] Successfully generated 0x60000000 LMA shifted zephyr.hex")
# Шаг В: Создаем корректный ELF для GDB-отладчика без разрушения сегментов.
# Мы смещаем ВСЕ адреса (LMA и VMA) в копии ELF-файла назад на величину 0x20000000.
# Это сдвинет LMA в честные 0x60000000, не ломая структуру сегментов!
gen_elf_cmd = [
real_objcopy,
"--change-addresses", "-0x20000000",
elf_path,
gdb_elf_path
]
try:
subprocess.run(gen_elf_cmd, check=True)
print(f"[LMA Filter] Generated clean {gdb_elf_path} for debugger.")
except Exception as e:
print(f"[LMA Filter] GDB ELF Generation failed: {e}")
if __name__ == "__main__":
main()