#!/usr/bin/env bash set -euo pipefail if [[ $# -lt 1 || $# -gt 2 ]]; then printf 'Usage: %s [memory.x]\n' "$0" >&2 exit 2 fi readonly input_elf="$1" readonly output_image="${input_elf%.elf}.bin" readonly script_directory="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly workspace_root="$(cd -- "$script_directory/.." && pwd)" readonly memory_x="${2:-$workspace_root/platforms/stm32f7/link/f722/memory.x}" readonly host="$(rustc -vV | sed -n 's/^host: //p')" readonly llvm_objcopy="$(rustc --print sysroot)/lib/rustlib/$host/bin/llvm-objcopy" if [[ ! -f "$input_elf" ]]; then printf 'firmware ELF does not exist: %s\n' "$input_elf" >&2 exit 1 fi if [[ ! -f "$memory_x" ]]; then printf 'cannot find linker layout: %s\n' "$memory_x" >&2 exit 1 fi if [[ ! -x "$llvm_objcopy" ]]; then printf 'llvm-objcopy is unavailable; install it with: rustup component add llvm-tools-preview\n' >&2 exit 1 fi "$script_directory/analyze-fw.py" "$input_elf" "$memory_x" temporary_image="$(mktemp "${output_image}.tmp.XXXXXX")" trap 'rm -f -- "$temporary_image"' EXIT "$llvm_objcopy" -O binary "$input_elf" "$temporary_image" mv -f -- "$temporary_image" "$output_image" trap - EXIT printf 'DFU image: %s\n' "$output_image"