#!/usr/bin/env bash # build-aux/lint-bin - Lint final binary images # # Copyright (C) 2025 Luke T. Shumaker # SPDX-License-Identifier: AGPL-3.0-or-later set -euE -o pipefail shopt -s extglob # Output is a series of lines in the format "symbol location size # source". Whitespace may seem silly. objdump_globals() { sed -E -n '/^ \.t?(data|bss)\./{ / 0x/{ p; D; }; N; s/\n/ /; p; }' <"$1" } lint_globals() { local in_mapfile in_mapfile=$1 local rel_base rel_base=${in_mapfile#build/*/} rel_base=${rel_base%/*} local topdir topdir=$PWD { echo 'Source Symbol Size' objdump_globals "$in_mapfile" | { cd "$rel_base" total=0 while read -r symbol addr size source; do : "$addr" case "$source" in /*) # libg.a(whatever.o) -> libg.a source="${source%(*)}" # resolve `..` components source="$(realpath --canonicalize-missing --no-symlinks -- "$source")" ;; CMakeFiles/*.dir/*.@(obj|o)) # CMakeFiles/sbc_harnes_objs.dir/... source="${source#CMakeFiles/*.dir/}" source="${source%.@(obj|o)}" source="${source//__/..}" source="$(realpath --canonicalize-missing --no-symlinks --relative-to="$topdir" -- "$source")" ;; esac printf '%s %s 0x%04x\n' "$source" "$symbol" "$size" total=$((total + size)) done printf '~ Total 0x%04x\n' "$total" } | LC_COLLATE=C sort } | column -t } main() { echo 'Global variables:' lint_globals 'build/rp2040-Release/cmd/sbc_harness/sbc_harness.elf.map' | sed 's/^/ /' } main "$@"