#!/bin/sh -ef elf1_undefined_symbols() { local elf="$1" err= err="$(ldd -r "$elf" 2>&1 1>/dev/null)" || return [ -n "$err" ] || return 0 echo "$err" |awk '/^undefined symbol:/ { gsub("^[(]|[)]$", "", $NF) print $3 "\t" $NF }' } elf1_verify_strict() { local elf="$1" err= err=$(elf1_undefined_symbols "$elf") || return 2 [ -n "$err" ] || return 0 echo "Error: $elf: undefined symbols" >&2 echo "$err" >&2 return 1 } elf1_verify_relaxed() { local elf="$1" symtab="$2" err= err=$(elf1_undefined_symbols "$elf") || return 2 [ -n "$err" ] || return 0 local rc=0 sym= obj= while IFS=$'\t' read -r sym obj; do if [ "$obj" != "$elf" ]; then echo "Error: $elf: undefined symbol: $sym ($obj)" >&2 rc=1 elif ! bloom -e "$sym" "$symtab"; then echo "Error: $elf: undefined symbol: $sym" >&2 rc=1 fi done <<<"$err" return $rc } rc=0 symtab="$1"; shift for elf; do type="$(file -b "$elf")" if [ -z "${type##*ELF*executable*dynamic*}" ]; then elf1_verify_strict "$elf" || rc=1 elif [ -z "${type##*ELF*shared*}" -a -z "${elf##*/lib/lib*.so*}" ]; then elf1_verify_strict "$elf" || rc=1 elif [ -z "${type##*ELF*dynamic*}" -o -z "${type##*ELF*shared*}" ]; then elf1_verify_relaxed "$elf" "$symtab" || rc=1 fi done exit $rc