142 lines
3.5 KiB
Bash
142 lines
3.5 KiB
Bash
#! /usr/bin/ksh
|
|
|
|
# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
|
|
#
|
|
# 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
|