#!/usr/bin/env bash # Verifica i requisiti di portabilita' di un binario compilato: # - tipo di ELF, architettura, ABI minima del kernel # - statico o dinamico, librerie richieste # - versioni di GLIBC richieste (max) come fa scripts/build-binaries.sh di Cellar # - simboli di syscall "moderne" che romperebbero i kernel vecchi set -uo pipefail bin="${1:?uso: verify_binary.sh }" [ -x "$bin" ] || { echo "non eseguibile: $bin"; exit 1; } echo "== binario ==" file -b "$bin" printf 'dimensione: %s\n' "$(du -h "$bin" | cut -f1)" printf 'sha256: %s\n' "$(sha256sum "$bin" | cut -d' ' -f1)" echo echo "== link ==" ldd_out=$(ldd "$bin" 2>&1) if grep -qiE "not a dynamic executable|non รจ un eseguibile dinamico" <<<"$ldd_out"; then echo "STATICO: nessuna dipendenza a runtime โœ”" else echo "DINAMICO โ€” librerie:" sed 's/^/ /' <<<"$ldd_out" fi echo echo "== ABI minima del kernel (ELF note) ==" readelf -n "$bin" 2>/dev/null | grep -iE "ABI|OS:" | sed 's/^ */ /' || echo " (nessuna nota)" echo echo "== simboli GLIBC richiesti ==" versions=$(objdump -p "$bin" 2>/dev/null | grep -oE 'GLIBC_[0-9]+\.[0-9]+(\.[0-9]+)?' | sort -Vu) if [ -z "$versions" ]; then echo " nessuno (binario statico o solo simboli base)" else max=$(tail -1 <<<"$versions") echo " massimo richiesto: $max" sed 's/^/ /' <<<"$versions" case "$max" in GLIBC_2.1*|GLIBC_2.2|GLIBC_2.3|GLIBC_2.4|GLIBC_2.5|GLIBC_2.6|GLIBC_2.7|GLIBC_2.8|GLIBC_2.9|GLIBC_2.1[0-7]) echo " -> compatibile anche con distro molto vecchie (glibc <= 2.17)" ;; *) echo " ATTENZIONE: richiede una glibc piu' recente di 2.17 (CentOS 7 / Debian 8)" ;; esac fi echo echo "== syscall moderne (compatibilita' kernel vecchi) ==" if nm "$bin" 2>/dev/null | grep -qE '^[0-9a-f]+ [TtDd] '; then hits=$(nm "$bin" 2>/dev/null | grep -oE '\b(statx|openat2|memfd_create|getrandom|pidfd_open|copy_file_range|renameat2|close_range)\b' | sort -u || true) else hits=$(objdump -T "$bin" 2>/dev/null | grep -oE '\b(statx|openat2|memfd_create|getrandom|pidfd_open|copy_file_range|renameat2|close_range)\b' | sort -u || true) fi if [ -z "$hits" ]; then echo " nessuna: il binario usa solo syscall classiche โœ”" else echo " presente/i: $(tr '\n' ' ' <<<"$hits")" fi echo echo "== prova di esecuzione ==" if "$bin" --help >/dev/null 2>&1; then echo " --help OK" else echo " --help FALLITO (probabile incompatibilita' di piattaforma)" fi