#! /usr/bin/ksh # Original Author: Tim Mooney # $Id: irix6.prov,v 1.6 2000/12/02 16:52:14 jbj Exp $ # # 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