#!/bin/sh
rtld=/lib/ld.so.1
filename_magic_regex="((^|/)lib|.so$)"
silent=0
result=1
file=$1
[ $# -gt 0 ] || {
echo "Usage: ldd [-s] <file>"
echo "Option: -s silent (do not print shared libraries only perform the check)"
exit 1
}
case "$1" in
-s)
silent=1
shift
;
*)
;
esac
file=$1
case $file in
*/*) :
;
*) file=./$file
;
esac
if [ ! -e $file ]; then
echo "ldd: $file: No such file or directory" >&2
elif [ ! -f $file ]; then
echo "ldd: $file: not regular file" >&2
elif [ -r $file ]; then
if [ ! -x "$file" ] && eval echo "$file" \
| grep -v "$filename_magic_regex" > /dev/null; then
echo "ldd: warning: you do not have execution permission for '$file'"
fi
verify_out=
list_out=
trace_out=
ret=0
verify_out=$($rtld --verify "$file" 2>&1)
[ $? = 0 ] || ret=$?
[ $ret = 0 ] || { result=$ret; break; }
list_out=$($rtld --list "$file" 2>&1)
[ $? = 0 ] || ret=$?
[ $ret = 0 ] || { result=$ret; break; }
trace_out=$(LD_TRACE_LOADED_OBJECTS=1 $rtld "$file" 2>&1)
[ $ret = 0 ] || {
[ $silent = 1 ] || echo "ldd: $rtld returned with exit code ($ret)" >&2
[ -z "$verify_out" ] && [ $silent = 1 ] || echo "ldd: $verify_out" >&2
[ -z "$list_out" ] && [ $silent = 1 ] || echo "ldd: $list_out" >&2
[ -z "$trace_out" ] && [ $silent = 1 ] || echo "ldd: $trace_out" | tr '\t' ' ' >&2
exit $result
}
[ $silent = 1 ] || {
[ -z "$trace_out" ] || echo "ldd: $trace_out" | tr '\t' ' '
}
# If we reached here, everything went fine
result=0
else
echo "ldd: error: cannot read file '$file'" >&2
fi
exit $result