172 lines
4.7 KiB
Bash
Executable File
172 lines
4.7 KiB
Bash
Executable File
#! /usr/bin/ksh
|
|
|
|
# Original Author: Ralph Goers(rgoer@Candle.Com)
|
|
# Borrowed heavily from Tim Mooney's HP version.
|
|
# This file is distributed under the terms of the GNU General Public License
|
|
#
|
|
# find-requires is part of RPM, the RedHat Package Manager. find-requires
|
|
# reads a list of full pathnames (in a package) on stdin, and outputs all
|
|
# shared libraries the package requires to run correctly.
|
|
#
|
|
|
|
find_req_power ()
|
|
{
|
|
# On AIX Power, use `dump -H' to find the library dependencies
|
|
# for an executable
|
|
#
|
|
# Example dump output:
|
|
#
|
|
#$dump -H /usr/bin/dump
|
|
#
|
|
#/usr/bin/dump:
|
|
#
|
|
# ***Loader Section***
|
|
# Loader Header Information
|
|
#VERSION# #SYMtableENT #RELOCent LENidSTR
|
|
#0x00000001 0x00000021 0x0000006c 0x0000002f
|
|
#
|
|
##IMPfilID OFFidSTR LENstrTBL OFFstrTBL
|
|
#0x00000002 0x00000848 0x00000049 0x00000877
|
|
#
|
|
#
|
|
# ***Import File Strings***
|
|
#INDEX PATH BASE MEMBER
|
|
#0 /usr/lib:/lib:/usr/lpp/xlC/lib
|
|
#1 libc.a shr.o
|
|
|
|
#
|
|
#
|
|
|
|
while read f
|
|
do
|
|
# Find the required symbols in executables and the required shells in
|
|
# scripts
|
|
LANG=C /usr/bin/file $f | /usr/bin/grep -q -e ":.*shell script"
|
|
|
|
if [ $? -ne 0 ] # Use dump to examine executables
|
|
then
|
|
LANG=C /usr/bin/dump -H $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 {
|
|
in_shlib_list = 0;
|
|
in_file_strings = 0;
|
|
FS = " ";
|
|
RS = "\n";
|
|
}
|
|
|
|
in_shlib_list == 1 && /^$/ {
|
|
in_shlib_list = 0;
|
|
in_file_strings = 0;
|
|
}
|
|
|
|
in_shlib_list == 1 {
|
|
pos = index($2, "/")
|
|
numfields = split($0, fields, " ")
|
|
|
|
if (pos == 0) {
|
|
namevar = 2
|
|
}
|
|
else {
|
|
namevar = 3
|
|
}
|
|
if (namevar < numfields) {
|
|
printf("%s(%s)\n", fields[namevar], fields[namevar+1])
|
|
}
|
|
else {
|
|
if ((fields[namevar] != ".") && (fields[namevar] != "..")) {
|
|
print fields[namevar]
|
|
}
|
|
}
|
|
}
|
|
|
|
in_file_strings == 1 && $1 == "0" {
|
|
in_shlib_list = 1
|
|
}
|
|
|
|
/\*Import File Strings\*/ {
|
|
in_file_strings = 1
|
|
}
|
|
' # end of awk
|
|
else # shell scripts
|
|
if [ -x $f ]; then
|
|
/usr/bin/head -1 $f | /usr/bin/sed -e 's/^\#\![ ]*//' | /usr/bin/cut -d" " -f1
|
|
fi
|
|
fi
|
|
done | sort -u
|
|
}
|
|
|
|
find_req_ia64 ()
|
|
{
|
|
# On AIX IA64, use `dump -Lv' to find the library dependencies
|
|
# for an executable
|
|
#
|
|
# Example dump output:
|
|
#
|
|
#$dump -Lv /usr/bin/dump
|
|
#
|
|
#
|
|
#/usr/bin/dump:
|
|
#
|
|
# **** DYNAMIC SECTION INFORMATION ****
|
|
#[INDEX] Tag Value
|
|
#
|
|
#.dynamic:
|
|
#[1] NEEDED libC.so.1
|
|
#[2] NEEDED libelf.so
|
|
#[3] NEEDED /usr/lib/ia64l32/libc.so.1
|
|
#[4] INIT 0x1001d6c0
|
|
#[5] FINI 0x1001d700
|
|
#[6] HASH 0x1000011c
|
|
#[7] STRTAB 0x10000914
|
|
#[8] SYMTAB 0x10000364
|
|
#[9] STRSZ 0x3dd
|
|
#[10] SYMENT 0x10
|
|
#[11] PLTGOT 0x20018994
|
|
#[12] PLT_RESERVE 0x20018a00
|
|
#[13] PLTSZ 0x1c0
|
|
#[14] PLTREL REL
|
|
#[15] JMPREL 0x100024bc
|
|
#[16] REL 0x10000cf4
|
|
#[17] RELSZ 0x17c8
|
|
#[18] RELENT 0x8
|
|
#
|
|
#
|
|
|
|
while read f
|
|
do
|
|
# Find the required symbols in executables and the required shells in
|
|
# scripts
|
|
LANG=C /usr/bin/file $f | /usr/bin/grep -q -e ":.*shell script"
|
|
|
|
if [ $? -ne 0 ] # Use dump to examine executables
|
|
then
|
|
LANG=C /usr/bin/dump -Lv $f 2>/dev/null | \
|
|
awk '$2=="NEEDED" {print $3}' | xargs -i basename {}
|
|
|
|
else # Extract the exec module from shell scripts
|
|
if [ -x $f ]; then
|
|
head -1 $f | sed -e 's/^\#\![ ]*//' | cut -d" " -f1
|
|
fi
|
|
fi
|
|
done | sort -u
|
|
}
|
|
|
|
machinetype=`uname -m`
|
|
if [[ $machinetype = "ia64" ]]
|
|
then
|
|
/usr/bin/sed "s/['\"]/\\\&/g" | LANG=C /usr/bin/xargs /usr/bin/file | \
|
|
/usr/bin/grep -e ":.*executable" -e ":.*archive" -e ":.*shell script" | /usr/bin/cut -d: -f1 |
|
|
find_req_ia64
|
|
else
|
|
/usr/bin/sed "s/['\"]/\\\&/g" | LANG=C /usr/bin/xargs /usr/bin/file | \
|
|
/usr/bin/grep -e ":.*executable" -e ":.*archive" -e ":.*shell script" | /usr/bin/cut -d: -f1 |
|
|
find_req_power
|
|
fi
|
|
|