Загрузка данных


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()