/rpm-4.10.0/autodeps/irix6.prov
Korn Shell | 201 lines | 120 code | 4 blank | 77 comment | 3 complexity | e619763042fa76ca4aceeec936afa2c1 MD5 | raw file
Possible License(s): LGPL-2.0
- #! /usr/bin/ksh
- # Original Author: Tim Mooney <mooney@golem.phys.ndsu.NoDak.edu>
- # $Id: irix6.prov,v 1.7 2001/09/15 13:49:11 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 | grep -E '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