202 lines
5.1 KiB
Plaintext
202 lines
5.1 KiB
Plaintext
|
#! /usr/bin/ksh
|
||
|
|
||
|
# Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
|
||
|
# $Id$
|
||
|
#
|
||
|
# This file is distributed under the terms of the GNU Public License
|
||
|
#
|
||
|
# find-provides is part of RPM, the Red Hat Package Manager. find-provides
|
||
|
# reads a list of full pathnames (in a package) on stdin, and outputs all
|
||
|
# shared libraries provided by (contained in) the package.
|
||
|
#
|
||
|
# NOTE: 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 the soname and internal version fields. As has
|
||
|
# become the case on other platforms, the soname/iversion delimiters have
|
||
|
# become the `(' and `)' characters.
|
||
|
#
|
||
|
# On IRIX, use `elfdump -L' to find what libraries a package provides
|
||
|
#
|
||
|
# Example `elfdump -L' output:
|
||
|
#
|
||
|
#$elfdump -L /usr/lib/libc.so
|
||
|
#
|
||
|
#
|
||
|
#/usr/lib/libc.so:
|
||
|
#
|
||
|
# **** DYNAMIC SECTION INFORMATION ****
|
||
|
#.dynamic :
|
||
|
#[INDEX] Tag Value
|
||
|
#[0] HASH 0xfa099d0
|
||
|
#[1] STRTAB 0xfa0027c
|
||
|
#[2] SYMTAB 0xfa10e3c
|
||
|
#[3] STRSZ 0x9751
|
||
|
#[4] SYMENT 0x10
|
||
|
#[5] INIT 0
|
||
|
#[6] FINI 0
|
||
|
#[7] RLDVERS 0x1
|
||
|
#[8] FLAGS 0x1411
|
||
|
#[9] BASEADDR 0xfa00000
|
||
|
#[10] LOCGOTNO 0x3c
|
||
|
#[11] PROTECT 0x3c
|
||
|
#[12] HIDDEN 0x12
|
||
|
#[13] CNFLCTNO 0
|
||
|
#[14] LBLISTNO 0
|
||
|
#[15] SYMTABNO 0xd19
|
||
|
#[16] UNREFEXT 0x8
|
||
|
#[17] GOTSYM 0x8b3
|
||
|
#[18] LOCAL 0x12
|
||
|
#[19] LOCALPG 0x1
|
||
|
#[20] LOCALPG 0x10
|
||
|
#[21] PLTGOT 0xfb483b0
|
||
|
#[22] RLDTXT_ADR0xfb6b580
|
||
|
#[23] OPTIONS 0xfa000f4
|
||
|
#[24] SONAME libc.so.1
|
||
|
#[25] TIMSTAMP Jun 16 18:23:15 1997
|
||
|
#[26] CHECKSUM 0x92321a0c
|
||
|
#[27] IVERSION sgi1.0
|
||
|
#[28] REL 0xfa1dfcc
|
||
|
#[29] RELSZ 0x1988
|
||
|
#[30] RELENT 0x8
|
||
|
#[31] MSYM 0xfa1f954
|
||
|
#[32] COMPCTSIZE0xc60c
|
||
|
#No Library List Section in /usr/lib/libc.so
|
||
|
#
|
||
|
|
||
|
PATH=/usr/bin:/usr/sbin
|
||
|
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
|
||
|
|
||
|
#
|
||
|
# Use `while read ...' instead of `for f in ...', because there may be too
|
||
|
# many files to stuff into one shell variable.
|
||
|
#
|
||
|
IFS=""
|
||
|
while read f
|
||
|
do
|
||
|
#
|
||
|
# If it's a shared library, run elfdump on it.
|
||
|
#
|
||
|
maybe_shared_lib=`file $f | egrep 'ELF.*dynamic lib'`
|
||
|
if test X"$maybe_shared_lib" != X ; then
|
||
|
elfdump -L $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 {
|
||
|
FS = " ";
|
||
|
RS = "\n";
|
||
|
OFS = "";
|
||
|
|
||
|
found_soname = 0;
|
||
|
found_iversion = 0;
|
||
|
}
|
||
|
|
||
|
# Uncomment the next line for some debugging info.
|
||
|
#{ print NR , ":", $0 }
|
||
|
|
||
|
/[ ]+SONAME .*[ ]*$/ {
|
||
|
found_soname = 1;
|
||
|
numfields = split($0, internal_name)
|
||
|
if (numfields == 3) {
|
||
|
soname = $3
|
||
|
} else {
|
||
|
#
|
||
|
# Should never be here.
|
||
|
#
|
||
|
print "Really odd looking soname:", $0 | "cat 1>&2"
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/[ ]+IVERSION .*[ ]*$/ {
|
||
|
if (found_soname == 1) {
|
||
|
numfields = split($0, iversion)
|
||
|
if (numfields == 3) {
|
||
|
version = $3
|
||
|
#
|
||
|
# handle libraries with multiple versions, like
|
||
|
# 1.1:1.2. Since they really provide both versions,
|
||
|
# we need to generate output for each version.
|
||
|
#
|
||
|
numfields = split(version, versions, ":")
|
||
|
if (numfields > 1) {
|
||
|
for (i = 1; i < numfields; i++) {
|
||
|
print soname, "(", versions[i], ")"
|
||
|
}
|
||
|
#
|
||
|
# let our END routine print out the *last* version
|
||
|
# provided
|
||
|
#
|
||
|
version = versions[numfields]
|
||
|
}
|
||
|
#
|
||
|
# stick a fork in us.
|
||
|
#
|
||
|
found_iversion = 1;
|
||
|
exit
|
||
|
} else {
|
||
|
#
|
||
|
# handle libraries with comments and other junk in
|
||
|
# the version field. IRIX has a number of system libraries
|
||
|
# with whitespace and other junk in the version field!
|
||
|
#
|
||
|
# we discard the whitespace and keep the identifier after
|
||
|
# the # sign.
|
||
|
#
|
||
|
version = iversion[numfields]
|
||
|
numfields = split(version, version_junk, "#")
|
||
|
if (numfields > 1) {
|
||
|
version = version_junk[numfields]
|
||
|
found_iversion = 1;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
#
|
||
|
# found an iversion without an soname. Is that possible?
|
||
|
#
|
||
|
print "Found version but no soname:", $0 | "cat 1>&2"
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#
|
||
|
# we could probably watch for some other token (like RELSZ)
|
||
|
# that *generally* occurs later in the input than the stuff we watch
|
||
|
# for, and exit if we see it, but it is just as easy to read all
|
||
|
# the output, even after we have seen what we are looking for.
|
||
|
#
|
||
|
|
||
|
END {
|
||
|
# Uncomment the next line for debugging info
|
||
|
#{ print "END: NR: ", NR }
|
||
|
if ( (found_soname == 1) && (found_iversion == 1) ) {
|
||
|
print soname, "(", version, ")"
|
||
|
exit
|
||
|
} else if ( (found_soname == 1) && (found_iversion == 0) ) {
|
||
|
#
|
||
|
# no library version information *BUT* any programs linked
|
||
|
# against this library will pick up a dependency on version 0
|
||
|
# of this library, so we output that.
|
||
|
#
|
||
|
print soname, "(", 0, ")"
|
||
|
}
|
||
|
# else do nothing
|
||
|
}
|
||
|
' # end of awk
|
||
|
fi # end of the 'if test X"$maybe_shared_lib != X ; then' clause
|
||
|
done | sort -u
|
||
|
#comment out the previous line and uncomment the next line when debugging
|
||
|
#done
|