home *** CD-ROM | disk | FTP | other *** search
/ IRIS Development Option 6.2 / IRIS_Development_Option_6.2_814-0478-001.iso / dist / dev.idb / usr / bin / check_abi_compliance.z / check_abi_compliance
Text File  |  1996-03-14  |  3KB  |  149 lines

  1. #!/sbin/sh
  2. #ident    "$Revision: 1.5 $"
  3.  
  4. PROG=`basename $0`
  5. USAGE="Usage: $PROG [-abidir DIR -liblist LIBRARY_LIST -required -abi] file"
  6. CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
  7. TMPDIR=${TMPDIR:-/var/tmp}
  8. ENTRYNAMES=$TMPDIR/entrynames.$$
  9. PUBLICNAMES=$TMPDIR/publicnames.$$
  10. CHECKFILE=$TMPDIR/check.$$
  11. ABINAMES=$TMPDIR/abinames.$$
  12. REQNAMES=$TMPDIR/reqnames.$$
  13. TMPOUTPUT=$TMPDIR/tmpoutput.$$
  14. LIBLIST_GIVEN=0
  15. REQUIRED=1
  16. ABI=1
  17. ELFDUMP=elfdump
  18.  
  19. trap "rm -f $ENTRYNAMES $PUBLICNAMES $CHECKFILE $ABINAMES $REQNAMES $TMPOUTPUT; exit 1" 1 2 13 15
  20.  
  21. while [ $# -gt 1 ]
  22. do
  23.     case "$1" in
  24.     -abidir)
  25.         shift;
  26.         if [ $# -gt 1 ]
  27.         then
  28.             CHECKER_ABIDIR=$1; shift
  29.         else
  30.             echo $USAGE >&2 ;
  31.             exit 1;
  32.         fi;;
  33.     -liblist)
  34.         LIBLIST_GIVEN=1; shift
  35.         if [ $# -gt 1 ]
  36.         then
  37.             LIBLIST=$1; shift
  38.         else
  39.             echo $USAGE >&2 ;
  40.             exit 1;
  41.         fi;;
  42.     -required)
  43.         REQUIRED=1;
  44.         ABI=0;
  45.         shift;;
  46.     -abi)
  47.         REQUIRED=0;
  48.         ABI=1;
  49.         shift;;
  50.     *)
  51.         echo $USAGE >&2 ;
  52.         exit 1;;
  53.     esac
  54. done
  55.  
  56. if [ $# -ne 1 ]
  57. then
  58.     echo $USAGE >&2
  59.     exit 1
  60. fi
  61.  
  62. if [ -f $1 ]
  63. then
  64.     file $1 2>&1 | grep 'not stripped' > /dev/null 2>&1
  65.     if [ $? -ne 0 ] ; then
  66.         echo "$PROG: Cannot process stripped binary $1" >&2
  67.         exit 1
  68.     fi
  69. else
  70.     echo "$PROG: cannot access file $1" >&2
  71.     exit 1
  72. fi
  73.  
  74. if [ $REQUIRED -eq 1 ]
  75. then
  76.     nm -p $1 | sed -e "s/^[0-9A-Za-z]* //p" -e "s/^[     ]*//p" | awk '\
  77.     BEGIN { prev = 1 } \
  78.     NF == 0 { prev = 0 } \
  79.     NF > 0 { \
  80.         if (prev != 0) { \
  81.             print $0 \
  82.         } else { \
  83.             prev = 1 \
  84.         } \
  85.     }' | awk ' \
  86.         { \
  87.             if (($1 == "T") || \
  88.                 ($1 == "D") || \
  89.                 ($1 == "B") || \
  90.                 ($1 == "A") || \
  91.                 ($1 == "G") || \
  92.                 ($1 == "S") || \
  93.                 ($1 == "R") || \
  94.                 ($1 == "C") || \
  95.                 ($1 == "E")) { \
  96.                 print $2 \
  97.             } \
  98.         }' | sort -u | egrep -v "^\.bss$|^\.data$|^\.rdata$|^\.sbss$|^\.sdata$|^\.text$" > $PUBLICNAMES
  99. fi
  100.  
  101. if [ $ABI -eq 1 ]
  102. then
  103.     nm -pu $1 | awk '{print $3}' | sort -u | egrep -v "^_fdata$" | sed '/^$/d' > $ENTRYNAMES
  104.  
  105.     rm -rf $CHECKFILE
  106.     touch $CHECKFILE
  107.     if [ $LIBLIST_GIVEN -eq 0 ]
  108.     then
  109.         LIBLIST=`$ELFDUMP -Dl $1 | sed -e '1,/^.liblist/d' -e '/^$/d' | awk '{ print $1 }'`
  110.     fi
  111.  
  112.     for LIBRARY in $LIBLIST
  113.     do
  114.         egrep -v "^#" $CHECKER_ABIDIR/`basename $LIBRARY`.names >> $CHECKFILE
  115.     done
  116.  
  117.     sort -u $CHECKFILE > $ABINAMES
  118. fi
  119.  
  120. if [ $REQUIRED -eq 1 ]
  121. then
  122.     egrep -v "^#" $CHECKER_ABIDIR/required.names > $REQNAMES
  123.     comm -23 $REQNAMES $PUBLICNAMES > $TMPOUTPUT
  124.     if [ `wc -l < $TMPOUTPUT` -ne 0 ]
  125.     then
  126.         if [ $ABI -eq 1 ]
  127.         then
  128.             echo "The following symbols required by the ABI are missing:"
  129.         fi
  130.         cat $TMPOUTPUT
  131.     fi
  132. fi
  133.  
  134. if [ $ABI -eq 1 ]
  135. then
  136.     comm -23 $ENTRYNAMES $ABINAMES > $TMPOUTPUT
  137.     if [ `wc -l < $TMPOUTPUT` -ne 0 ]
  138.     then
  139.         if [ $REQUIRED -eq 1 ]
  140.         then
  141.             echo "\nThe following external references are not defined by the ABI:"
  142.         fi
  143.         cat $TMPOUTPUT
  144.     fi
  145. fi
  146.  
  147.  
  148. rm -f $ENTRYNAMES $PUBLICNAMES $CHECKFILE $ABINAMES $REQNAMES $TMPOUTPUT
  149.