#!/bin/sh

helpmsg() {
	echo "usage: $0 [-v|-h]"
	echo "  -v   be verbose"
	echo "  -h   print this help message"
	exit 0
}

SEARCH_DIRS="/bin /usr/bin /sbin /usr/sbin /lib /usr/lib /usr/libexec"
TMPFILE=$(mktemp)

trap 'rm -f $TMPFILE; printf "\033[0K"; exit 1' 1 2 3 15

while [ "$1" ]; do
	case $1 in
		-v) verbose=1;;
		-h) helpmsg;;
	esac
	shift
done

find $SEARCH_DIRS -type f \( -perm /+u+x -o -name '*.so' -o -name '*.so.*' \) -print 2> /dev/null | sort -u > $TMPFILE
total=$(wc -l $TMPFILE | awk '{print $1}')
count=0
while read -r line; do
	count=$(( count + 1 ))
	libname=${line##*/}
	if [ "$verbose" ]; then
		printf " $(( 100*count/total ))%% $libname\033[0K\r"
	fi
	case "$(file -bi "$line")" in
		*application/x-sharedlib* | *application/x-executable* | *application/x-pie-executable*)
			missinglib=$(ldd /$line 2>&1 | grep "Error loading shared library" | awk '{print $5}' | sed 's/://' | sort | uniq)
			if [ "$missinglib" ]; then
				for i in $missinglib; do
					objdump -p /$line | grep NEEDED | awk '{print $2}' | grep -qx $i && {
						ownby=$(pkginfo -o $line | tail -n1 | awk '{print $1}')
						[ "$ownby" ] || continue
						if [ "$verbose" ]; then
							echo " $ownby: $line (requires $i)"
						else
							echo "$p" | tr ' ' '\n' | grep -xq $ownby || {
								echo $ownby
								p="$p $ownby"
							}
						fi
					}
				done
			fi;;
	esac
done < $TMPFILE
printf "\033[0K"

rm -f $TMPFILE

exit 0
