127 lines
2.1 KiB
Bash
127 lines
2.1 KiB
Bash
#!/sbin/sh
|
|
#ident "$Revision: 1.2 $"
|
|
|
|
PROG=`basename $0`
|
|
USAGE="Usage: $PROG [-abidir DIR -missing -extra -libname NAME] file"
|
|
CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
|
|
TMPDIR=${TMPDIR:-/var/tmp}
|
|
OUTPUT=$TMPDIR/output.$$
|
|
CHECKFILE=$TMPDIR/check.$$
|
|
TMPOUTPUT=$TMPDIR/tmpoutput.$$
|
|
MISSING=1
|
|
EXTRA=1
|
|
LIBNAME_GIVEN=0
|
|
|
|
trap "rm -f $OUTPUT $CHECKFILE $TMPOUTPUT; exit 1" 1 2 13 15
|
|
|
|
while [ $# -gt 1 ]
|
|
do
|
|
case "$1" in
|
|
-libname)
|
|
LIBNAME_GIVEN=1;
|
|
shift;
|
|
if [ $# -gt 1 ]
|
|
then
|
|
LIBNAME=$1; shift
|
|
else
|
|
echo $USAGE >&2
|
|
exit 1;
|
|
fi;;
|
|
-abidir)
|
|
shift;
|
|
if [ $# -gt 1 ]
|
|
then
|
|
CHECKER_ABIDIR=$1; shift
|
|
else
|
|
echo $USAGE >&2
|
|
exit 1;
|
|
fi;;
|
|
-missing)
|
|
MISSING=1;
|
|
EXTRA=0;
|
|
shift;;
|
|
-extra)
|
|
MISSING=0;
|
|
EXTRA=1;
|
|
shift;;
|
|
*)
|
|
echo $USAGE >&2
|
|
exit 1;;
|
|
esac
|
|
done
|
|
|
|
|
|
if [ $# -ne 1 ]
|
|
then
|
|
echo $USAGE >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f $1 ]
|
|
then
|
|
echo "$PROG: cannot access file $1" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ $LIBNAME_GIVEN -eq 0 ]
|
|
then
|
|
LIBNAME=`basename $1`
|
|
fi
|
|
|
|
nm -p $1 | sed -e "s/^[0-9A-Za-z]* //p" -e "s/^[ ]*//p" | awk '\
|
|
BEGIN { prev = 1 } \
|
|
NF == 0 { prev = 0 } \
|
|
NF > 0 { \
|
|
if (prev != 0) { \
|
|
print $0 \
|
|
} else { \
|
|
prev = 1 \
|
|
} \
|
|
}' | awk '{ \
|
|
if (($1 == "T") || \
|
|
($1 == "D") || \
|
|
($1 == "B") || \
|
|
($1 == "A") || \
|
|
($1 == "G") || \
|
|
($1 == "S") || \
|
|
($1 == "R") || \
|
|
($1 == "C") || \
|
|
($1 == "E")) { \
|
|
print $2 \
|
|
} \
|
|
}' | sort -u | egrep -v "^\.bss$|^\.data$|^\.rdata$|^\.sbss$|^\.sdata$|^\.text$" > $OUTPUT
|
|
|
|
if [ $MISSING -eq 1 ] || [ $EXTRA -eq 1 ]
|
|
then
|
|
grep -v "^#" $CHECKER_ABIDIR/$LIBNAME.names | sort -u > $CHECKFILE
|
|
fi
|
|
|
|
if [ $MISSING -eq 1 ]
|
|
then
|
|
comm -23 $CHECKFILE $OUTPUT > $TMPOUTPUT
|
|
if [ `wc -l < $TMPOUTPUT` -ne 0 ]
|
|
then
|
|
if [ $EXTRA -eq 1 ]
|
|
then
|
|
echo "The following ABI routines are missing from the library:"
|
|
fi
|
|
cat $TMPOUTPUT
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ $EXTRA -eq 1 ]
|
|
then
|
|
comm -13 $CHECKFILE $OUTPUT | grep -v "^_" > $TMPOUTPUT
|
|
if [ `wc -l < $TMPOUTPUT` -ne 0 ]
|
|
then
|
|
if [ $MISSING -eq 1 ]
|
|
then
|
|
echo "\nThe following public routines are not part of the ABI:"
|
|
fi
|
|
cat $TMPOUTPUT
|
|
fi
|
|
fi
|
|
|
|
rm -f $OUTPUT $CHECKFILE $TMPOUTPUT
|