summaryrefslogtreecommitdiff
path: root/autodeps/irix6.prov
blob: a3a3b36b526db9a6ee470ae531fafa306821572a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#! /usr/bin/ksh

# Original Author: Tim Mooney (mooney@plains.nodak.edu)
# $Id: irix6.prov,v 1.5 1999/09/30 00:22:15 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: 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 -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

#
# 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 '

		BEGIN { 
			FS = " ";
			RS = "\n";
			OFS = "";

			# The character that should separate the soname from
			# the version information.  If you change this, you
			# should also change the same variable in the IRIX
			# find-requires script
			soname_version_delimiter=":"

			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, soname_version_delimiter, 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, soname_version_delimiter, 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, soname_version_delimiter, 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