elfdepend.sh
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:2k
- #!/bin/ksh
- #
- # elfdepend.sh
- #
- # given a path, this scripts searches for ELF binaries and libraries
- # and generates package dependency file entries according to ther dependencies
- #
- # Usage: elfdepend <ELF-binary>|<directory>
- #
- # 2002/11 Stefan.Radman@CTBTO.ORG
- #
- # /var/sadm/install/contents format:
- #
- # /dev d none 0775 root sys SUNWcsr SUNWcsd
- # path type class mode owner group packages
- # /etc/.login f renamenew 0644 root sys 516 37956 904647695 SUNWcsr
- # /etc/acct/holidays e preserve 0664 bin bin 289 22090 904647603 SUNWaccr
- # path type class mode owner group x x x packages
- # /bin=./usr/bin s none SUNWcsr
- # path=link type class packages
- # /devices/pseudo/clone@0:hme c none 11 7 0600 root sys SUNWcsd
- # path type class x x owner mode packages
- #
- # types e (sed), v (volatile) have same format like type f (file)
- # type l (hardlink) has same format like type s (symlink)
- #
- prog=`basename $0`
- LAST_CHANCE=/opt/OSS/lib
- if [ -d "$1" ] ; then
- find $1 -type f -exec file {} ;
- elif [ -x "$1" ] ; then
- file $1
- else
- echo 1>&2 "usage: $0 <directory>|<ELF executable>"
- exit 1
- fi | awk '$2 == "ELF" { print }' | cut -d: -f1 |
- while read elf
- do
- ldd "$elf" | while read lib x path
- do
- [ -z "$path" ] && continue
- if [ "$path" = '(file not found)' ]
- then
- if [ -x $LAST_CHANCE/$lib ]
- then
- path="$LAST_CHANCE/$lib"
- else
- echo "# $prog: $lib $x $path"
- continue # not found
- fi
- fi
- echo "$path"
- # need symlink handling here - see /usr/platform/SUNW,*/lib/*
- done
- done | sort -u | while read libpath other
- do
- [ "$libpath" = "#" ] && echo "$libpath $other" && continue # error message
- set -- `grep "^$libpath[ =]" /var/sadm/install/contents | head -1`
- path=$1; type=$2
- case $type in
- f) # file
- shift 9 # first package
- ;;
- s|l) # link
- shift 3 # first package
- ;;
- '') # not found
- echo "# $prog: $libpath is not associated with any package"
- continue
- ;;
- *) # dubious file type
- echo "# $prog: path $1 has dubious file type $2"
- continue
- ;;
- esac
- set -- `echo $1 | tr : ' '`
- echo $1 # strip off classes
- done | sort -u | while read pkg other
- do
- if [ "$pkg" = "#" ] ; then # error message
- echo 1>&2 "$other" # goes to stderr
- continue
- fi
- eval `pkgparam -v $pkg PKG NAME`
- printf "P %-15s%sn" "$PKG" "$NAME"
- done