#! /usr/bin/ksh # Original Author: Tim Mooney # $Id: osf.req,v 1.9 2001/09/15 13:49:11 jbj Exp $ # # This file is distributed under the terms of the GNU Public License # # find-requires is part of RPM, the Red Hat Package Manager. find-requires # reads a list of full pathnames (in a package) on stdin, and outputs all # shared libraries the package requires to execute. # # On Digital/Tru64 Unix (OSF1), use `odump -Dl' to find the library # dependencies for an executable. `odump -D' does most of what we need, # but it doesn't give us library version information, so you must use # `odump -Dl'. Note that Tru64 5.x and on have `ldd', but this works just # as well, and works on older versions of the OS. # # Example `odump -Dl' output: # #$odump -Dl /usr/bin/X11/xterm # # # # # ***LIBRARY LIST SECTION*** # Name Time-Stamp CheckSum Flags Version #/usr/bin/X11/xterm: # libXaw.so Dec 9 00:15:35 1997 0x285006d0 0 6.0 # libXmu.so Dec 9 00:13:36 1997 0x3bf3a33d 0 # libXt.so Dec 9 00:12:18 1997 0x10dd9a17 0 # libSM.so Dec 9 00:08:11 1997 0xb64c7082 0 # libICE.so Dec 9 00:07:52 1997 0x1199be32 0 # libXext.so Dec 9 00:08:51 1997 0xafcb84d5 0 # libX11.so Dec 9 00:06:05 1997 0xaa1bf091 0 # libc.so Dec 8 18:41:11 1997 0x5e955f9b 0 osf.1 PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin export PATH # # TVM: Marc Stephenson (marc@austin.ibm.com) points out we run things # like `file', et. al. and expect the output to be what we see in the # C/POSIX locale. Make sure it is so. # LANG=C export LANG # # TVM: switch to using `while read ...' instead of `for f in ...', because # packages with a large number of files could be too big for one shell variable # to hold. # IFS="" while read f do # # Uncomment the next line for addtional debugging: # echo "read ->$f<-" # # Only run file once per file: # file_output=`file $f` # # handle shell scripts first # is_shell_script=`echo "$file_output" | grep 'shell script' | \ cut -d: -f 2 | awk '{ print $1 }'` # # If it's a script... # if test X"$is_shell_script" != X ; then echo "$is_shell_script" # # use `continue' to skip back up to the top of the loop. # We have already done as much as we need to for this # file, and this saves me from having to have an else, # and another indent level... ;-) # continue fi # # The `else' here is implied by the `continue' above... # # # it might be a shared library. # maybe_shared_lib=`echo "$file_output" | grep 'executable'` if test X"$maybe_shared_lib" != X ; then odump -Dl $f 2>/dev/null \ | awk ' # # Since this entire awk script is enclosed in single quotes, # you need to be careful to not use single quotes, even in awk # comments, if you modify this script. # BEGIN { found_program_name = 0; FS = " "; RS = "\n"; OFS=""; } # uncomment the next line for debugging information #{ print "Saw input:", $0 } found_program_name == 1 && $0 !~ /^$/ { # uncomment for debugging information #print "found shared library: $0" # get the library name (field 1) and the library version # (field 8) if present. numfields = split($0,fields) if (numfields == 7) { print fields[1] } else if (numfields == 8) { print fields[1], "(", fields[8], ")" } } /^.*: *$/ { found_program_name = 1 # # uncomment the next line for debugging information #print "found the program name: ", $1 } ' # end of awk fi done | sort -u # comment out the previous line and uncomment the next when debugging # done