Home | History | Annotate | Download | only in Modules
      1 #!/bin/sh
      2 #
      3 # ===========================================================================
      4 # FILE:         makexp_aix
      5 # TYPE:         standalone executable
      6 # SYSTEM:	AIX 3.2.5 and AIX 4
      7 #
      8 # DESCRIPTION:  This script creates an export list of ALL global symbols
      9 #               from a list of object or archive files.
     10 #
     11 # USAGE:        makexp_aix <OutputFile> "<FirstLine>" <InputFile> ...
     12 #
     13 #               where:
     14 #                      <OutputFile> is the target export list filename.
     15 #                      <FirstLine> is the path/file string to be appended
     16 #                         after the "#!" symbols in the first line of the
     17 #                         export file. Passing "" means deferred resolution.
     18 #                      <InputFile> is an object (.o) or an archive file (.a).
     19 #
     20 # HISTORY:
     21 #		3-Apr-1998  -- remove C++ entries of the form Class::method
     22 #		Vladimir Marangozov
     23 #
     24 #               1-Jul-1996  -- added header information
     25 #               Vladimir Marangozov
     26 #
     27 #               28-Jun-1996 -- initial code
     28 #               Vladimir Marangozov           (Vladimir.Marangozov (at] imag.fr)
     29 # ==========================================================================
     30 
     31 # Variables
     32 expFileName=$1
     33 toAppendStr=$2
     34 shift; shift;
     35 inputFiles=$*
     36 automsg="Generated automatically by makexp_aix"
     37 notemsg="NOTE: lists _all_ global symbols defined in the above file(s)."
     38 curwdir=`pwd`
     39 
     40 # Create the export file and setup the header info
     41 echo "#!"$toAppendStr > $expFileName
     42 echo "*" >> $expFileName
     43 echo "* $automsg  (`date -u`)" >> $expFileName
     44 echo "*" >> $expFileName
     45 echo "* Base Directory: $curwdir" >> $expFileName
     46 echo "* Input File(s) : $inputFiles" >> $expFileName
     47 echo "*" >> $expFileName
     48 echo "* $notemsg" >> $expFileName
     49 echo "*" >> $expFileName
     50 
     51 # Extract the symbol list using 'nm' which produces quite
     52 # different output under AIX 4 than under AIX 3.2.5.
     53 # The following handles both versions by using a common flagset.
     54 # Here are some hidden tricks:
     55 # 1. Use /usr/ccs/bin/nm. Relevant to AIX 3.2.5 which has
     56 #    another version under /usr/ucb/bin/nm.
     57 # 2. Use the -B flag to have a standard BSD representation
     58 #    of the symbol list on both AIX 3.2.5 and AIX 4. The "-B"
     59 #    flag is missing in the AIX 3.2.5 online usage help of 'nm'.
     60 # 3. Use the -x flag to have a hex representation of the symbol
     61 #    values. This fills the leading whitespaces on AIX 4,
     62 #    thus simplifying the sed statement.
     63 # 4. Eliminate all entries except those with either "B", "D"
     64 #    or "T" key letters. We are interested only in the global
     65 #    (extern) BSS, DATA and TEXT symbols. With the same statement
     66 #    we eliminate object member lines relevant to AIX 4.
     67 # 5. Eliminate entries containing a dot. We can have a dot only
     68 #    as a symbol prefix, but such symbols are undefined externs.
     69 # 6. Eliminate everything including the key letter, so that we're
     70 #    left with just the symbol name.
     71 # 7. Eliminate all entries containing two colons, like Class::method
     72 #
     73 
     74 # Use -X32_64 if it appears to be implemented in this version of 'nm'.
     75 NM=/usr/ccs/bin/nm
     76 xopt=-X32_64
     77 $NM -e $xopt $1 >/dev/null 2>&1 || xopt=""
     78 
     79 $NM -Bex $xopt $inputFiles					\
     80 | sed -e '/ [^BDT] /d' -e '/\./d' -e 's/.* [BDT] //' -e '/::/d'	\
     81 | sort | uniq >> $expFileName
     82