if(TARGET zephyr_interface)
# Путь к нашему скрипту-перехватчику
set(WR_OBJCOPY "${CMAKE_BINARY_DIR}/objcopy_wrapper.sh")
# Пишем умный wrapper
file(WRITE ${WR_OBJCOPY}
"#!/bin/bash\n"
"ARGS=\"$*\"\n"
"\n"
"# Перехватываем деструктивный шаг: objcopy --change-section-lma ... zephyr.elf zephyr.elf\n"
"if [[ \"$ARGS\" == *\"--change-section-lma\"* && \"$ARGS\" == *\"zephyr.elf zephyr.elf\"* ]]; then\n"
" echo \"[Wrapper] Защита zephyr.elf: пропускаем деструктивный lma-adjust для самого ELF...\"\n"
" # Просто создаем резервную копию без изменений, чтобы цепочка '&&' в Zephyr не прервалась\n"
" cp -f zephyr.elf zephyr_debug.elf 2>/dev/null || true\n"
" exit 0\n"
"fi\n"
"\n"
"# Перехватываем генерацию HEX: objcopy --output-target=ihex ... zephyr.elf zephyr.hex\n"
"if [[ \"$ARGS\" == *\"--output-target=ihex\"* ]]; then\n"
" echo \"[Wrapper] Применяем lma-adjust (+3758096384) напрямую при генерации HEX...\"\n"
" # Вызываем настоящий objcopy, внедряя сдвиг LMA прямо на лету при конвертации в ihex.\n"
" # При конвертации структуры ELF не пересчитываются, и ошибки 'private header data' не будет!\n"
" exec ${CMAKE_BINARY_DIR}/../zephyrsdk/zephyr-sdk-0.16.3/arm-zephyr-eabi/bin/arm-zephyr-eabi-objcopy --change-section-lma *+3758096384 --change-section-lma !.dtcm_bss+3758096384 --change-section-lma !.dtcm_noinit+3758096384 \"$@\"\n"
"fi\n"
"\n"
"# Перехватываем генерацию BIN: objcopy --output-target=binary ... zephyr.elf zephyr.bin\n"
"if [[ \"$ARGS\" == *\"--output-target=binary\"* ]]; then\n"
" echo \"[Wrapper] Применяем lma-adjust (+3758096384) напрямую при генерации BIN...\"\n"
" exec ${CMAKE_BINARY_DIR}/../zephyrsdk/zephyr-sdk-0.16.3/arm-zephyr-eabi/bin/arm-zephyr-eabi-objcopy --change-section-lma *+3758096384 --change-section-lma !.dtcm_bss+3758096384 --change-section-lma !.dtcm_noinit+3758096384 \"$@\"\n"
"fi\n"
"\n"
"# Для всех остальных стандартных вызовов (чтение заголовков, удаление секций комментариев) вызываем оригинал\n"
"exec ${CMAKE_BINARY_DIR}/../zephyrsdk/zephyr-sdk-0.16.3/arm-zephyr-eabi/bin/arm-zephyr-eabi-objcopy \"$@\"\n"
)
# Делаем скрипт исполняемым
execute_process(COMMAND chmod +x ${WR_OBJCOPY})
# Принудительно заставляем Zephyr использовать наш оберточный скрипт вместо прямого бинарника
set(CMAKE_OBJCOPY ${WR_OBJCOPY} CACHE INTERNAL "Objcopy wrapper" FORCE)
endif()