#! /usr/bin/ksh # Original Author: Tim Mooney (mooney@plains.nodak.edu) # $Id: irix6.req,v 1.3 1999/01/22 00:25:27 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. # # NOTE: I use `:' as the delimiter (by default) between the library soname # and any library version info. This is because IRIX libraries (even # system libraries) have "version information" in both the soname and the # internal version field, so it's important to be able to separate those # fields. If we just used `.', we wouldn't know where the soname ends and # the version infromation begins. # # On IRIX, use `elfdump -Dl' to find what libraries are required by # an executable. `elfdump -L' does what we need too, but it gives us more # than we really need. # # Example `elfdump -Dl' output: # #$elfdump -Dl /usr/bin/X11/xterm # # # #/usr/bin/X11/xterm: # # **** MIPS LIBLIST INFORMATION **** #.liblist : #[INDEX] Timestamp Checksum Flags Name Version #[1] Nov 23 15:39:02 1997 0x4da65893 ----- libXaw.so.2 sgi2.0 #[2] Nov 23 15:39:02 1997 0x414eece6 ----- libXmu.so sgi1.0 #[3] Nov 23 15:39:02 1997 0x6f314e69 ----- libXt.so sgi1.0 #[4] Nov 23 15:39:02 1997 0xcbe81fff ----- libXext.so sgi1.0 #[5] Nov 23 15:39:02 1997 0x89ae8e98 ----- libX11.so.1 sgi1.0 #[6] Oct 27 01:00:29 1997 0x99b27890 ----- libcurses.so sgi1.0 #[7] Jun 16 18:23:15 1997 0x92321a0c ----- libc.so.1 sgi1.0 # # # TVM: it might be better to re-write this so that `file' isn't used, since # it can all be done with `elfdump', but this works. # PATH=/usr/bin:/usr/sbin export PATH filelist=`cat -` # # Handle scripts first # for f in `echo $filelist | xargs file | grep 'script text' | cut -d: -f 2 \ | awk '{ print $1 }'` do print $f done | sort -u for f in `echo $filelist | xargs file | egrep 'executable|lib' | cut -d: -f1` do #echo "Working on $f" elfdump -Dl $f 2>/dev/null | awk ' # # For you non-awk-ers, no single quotes in comments -- the shell # sees them and things get hosed. # BEGIN { found_column_headers = 0; FS = " "; RS = "\n"; OFS=""; soname_version_delimiter=":"; } # uncomment the next line for debugging information #{ print "Saw input:", $0 } found_column_headers == 1 && $0 !~ /^$/ { # get the library name (field 15) and the library version (field 16) # if present. numfields = split($0,fields) if (numfields == 8) { print fields[8] } else if (numfields == 9) { # print fields[8], soname_version_delimiter, fields[9] } else if (numfields > 9) { # # SGI has this annoying habit of putting comments, complete # with whitespace, in their library IVERSION field. Yuck. # # Handle libraries like this gracefully. # verfields = split(fields[NF], junk, "#") if (verfields == 2) { print fields[8], soname_version_delimiter, junk[2] } else if (verfields > 2) { print fields[8], soname_version_delimiter, junk[verfields] } else { print "Cannot find version:", fields[numfields] | "cat 2>&1" } } } /^\[INDEX\].Timestamp.*Checksum.*Flags.*Name.*Version$/ { # we better start paying attention now. found_column_headers = 1 # # uncomment the next line for debugging information #print "found the column headers: ", $0 } ' # end of awk done | sort -u # comment out the previous line and uncomment the next when debugging #done