11 #    find_global_symbol.sh options symbol.  See help message below for details.
    17 #    o    Search through all .so files in all directories defined
    18 #         in LD_LIBRARY path for supplied symbol.
    20 #    o    If located, attempt to demangle or mangle as appropriate..
    41   -v) let verbose=${verbose}+1;;
    42   -u) textonly=0;;   # show U undefined as well (other than T W V )
    50   if [ $print_types = 1 ] ; then
    53   echo '   Symbol types are a single character from the following list:-'
    56   echo '           The symbols value is absolute, and will not be changed by'
    57   echo '           further linking.'
    60   echo '           The symbol is in the uninitialized data section (known as'
    64   echo '           The symbol is common.  Common symbols are uninitialized data.'
    65   echo '           When linking, multiple common symbols may appear with the'
    66   echo '           same name.  If the symbol is defined anywhere, the common'
    67   echo '           symbols are treated as undefined references.  For more'
    68   echo '           details on common symbols, see the discussion of -warn-common'
    69   echo '           in *Note Linker options: (ld.info)Options.'
    70   echo '           details on common symbols, see the discussion of -warn-common'
    71   echo '           in *Note Linker options: (ld.info)Options.'
    74   echo '           The symbol is in the initialized data section.'
    77   echo '           The symbol is in an initialized data section for small'
    78   echo '           objects.  Some object file formats permit more efficient'
    79   echo '           access to small data objects, such as a global int variable'
    80   echo '           as opposed to a large global array.'
    83   echo '           The symbol is an indirect reference to another symbol.  This'
    84   echo '           is a GNU extension to the a.out object file format which is'
    88   echo '           The symbol is a debugging symbol.'
    91   echo '           The symbol is in a read only data section.'
    94   echo '           The symbol is in an uninitialized data section for small'
    98   echo '           The symbol is in the text (code) section.'
   101   echo '           The symbol is undefined.'
   104   echo '           The symbol is a weak object.  When a weak defined symbol is'
   105   echo '           linked with a normal defined symbol, the normal defined'
   106   echo '           symbol is used with no error.  When a weak undefined symbol'
   107   echo '           is linked and the symbol is not defined, the value of the'
   108   echo '           weak symbol becomes zero with no error.'
   111   echo '           The symbol is a weak symbol that has not been specifically'
   112   echo '           tagged as a weak object symbol.  When a weak defined symbol'
   113   echo '           is linked with a normal defined symbol, the normal defined'
   114   echo '           symbol is used with no error.  When a weak undefined symbol'
   115   echo '           is linked and the symbol is not defined, the value of the'
   116   echo '           weak symbol becomes zero with no error.'
   119   echo '           The symbol is a stabs symbol in an a.out object file.  In'
   120   echo '           this case, the next values printed are the stabs other field,'
   121   echo '           the stabs desc field, and the stab type.  Stabs symbols are'
   122   echo '           used to hold debugging information.  For more information,'
   123   echo '           see *Note Stabs: (stabs.info)Top.'
   126   echo '           The symbol type is unknown, or object file format specific.'
   129   echo '   U (undefined)'
   131   echo '   T (text section symbol)'
   132   echo '   D (data section symbol)'
   133   echo '   B (bss section symbol)'
   134   echo '   C (common symbol)'
   135   echo '   - (for debugger  symbol  table  entries; see -a below)'
   136   echo '   S (symbol in a section other than those above), or'
   137   echo '   I (indirect symbol).'
   138   echo "  If the symbol is local (non-external), the symbol's type is instead"
   139   echo '  represented by the corresponding lowercase letter.  A lower case u'
   140   echo '  in a dynamic shared library indicates a undefined reference to a'
   141   echo '   private external in  another module in the same library.'
   145 if [ "$symbol" = "" -o $print_help -ne 0 ] ; then
   146   echo "  find_global_symbol finds mangled or demangled symbols in libraries"
   147   echo "  within LD_LIBRARY_PATH.  Invocation:-"
   149   echo "     find_global_symbol.sh options name"
   151   echo "   where options are none or more of the following:-"
   153   echo "   -a    All libs: search all libs."
   154   echo "         Default:  exclude /usr/lib"
   156   echo "   -d    Demangled: Force name to be treated as demangled"
   157   echo "         Default:  treat name as mangled unless it contains a ("
   159   echo "   -f    Fragment search: name is a fragment, match any symbol that"
   160   echo "         contains name."
   161   echo "         Default:  symbol must exactly match name."
   163   echo "   -u    Print all references, including undefined symbols."
   164   echo "         Default:  only print symbol types T, W or V"
   166   echo "   -v    Increase verbosity."
   167   echo "         -v prints each directory path as searched."
   168   echo "         -v -v for debugging."
   170   echo "   -t    Print list of symbol types (may not exactly match nm)"
   172   echo "   -h    Print this help message."
   177 #  Escape puntuation characters.
   178 search_string=`echo $symbol | awk                           \
   181       while (loc <= length($0)) {                           \
   182         c = substr($0,loc,1);                               \
   183         if ( c < "0" || c == "[" || c == "]") print "\\\\"; \
   188 if [ $frag_search -eq 0 ] ; then search_string=" $search_string\$"; fi
   191 if [ $demangled -eq 0 ]; then
   192   demangled=`echo $symbol | awk '{ print index($0,"(") }'`
   194 if [ $demangled -eq 0 ]; then demangled=""; fi
   196 if [ $sysname == "Darwin" ]; then
   197    #DEMANGLEFLG="--defined-only -g"
   207   echo "Searching for demangled symbol '$symbol'"
   209      Darwin ) transform1="c++filt"
   214      * ) transform1="tr x x"   # no-op pass through
   222   #opt2="${DEMANGLEFLG}"
   223   echo "Searching for mangled symbol '$symbol'"
   225      Darwin ) transform1="tr x x"
   230      * ) transform1="tr x x"   # no-op pass through
   238 list=`echo ${LD_LIBRARY_PATH}:${DYLD_LIBRARY_PATH} | \
   239                               awk ' { num_elem = split($1,list,":"); \
   241                                       while (i_elem <= num_elem) {   \
   242                                         print list[i_elem];          \
   250 # Skip unwanted directories.
   252        -o ! -d $path  ]; then  echo "Skipping $path"; continue; fi
   253   if [  $all_libs -eq 0 -a "$path" = "/usr/lib" ]; then echo "Skipping $path"; continue; fi
   256   tried_before=`echo $tried :$path: | awk ' { print index($1,$2) }'`
   257   if [ $tried_before -ne 0 ]; then continue; fi
   261   if [ $verbose -gt 0 ]; then
   262     echo "Checking libraries in $path..."
   265   for file in `ls -1 *.so *.dylib 2>/dev/null`
   267      # echo "nm $opt1 $file | $tranform1 | egrep -n \"$search_string\""
   268      resultmulti=`nm $opt1 $file | $transform1 | egrep -n "$search_string"`
   271     if [ "$resultmulti"  != "" ]
   273        if [ $verbose -gt 1 ]; then
   274           echo "-->>> start resultmulti"
   276           echo "--<<<   end resultmulti"
   278       while read -r result; do
   279          if [ $textonly -ne 0 ]; then
   280             # S = Mac OS X "other section" (where typeinfo might be found)
   281             nmatch=`echo $result | egrep -c -v ' U ' `
   282             if [ $nmatch -eq 0 ]; then continue; fi
   284          if [ $verbose -eq 0 -a $printpath -eq 0 ]; then
   285             echo "Found in path $path/..."
   289          echo "    Found in $file"
   290          echo "        Entry: $result"
   291          line=`echo $result | awk ' { loc = index($1,":");\
   292                                     print substr($1,1,loc-1) }'`
   293          if [ $verbose -gt 1 ]; then
   294             echo "awk returned $line"
   296          result=`nm $opt2 $file | $transform2 | head -$line | tail -1`
   297          echo "        Translates to $result"
   298       done <<< "$resultmulti"
   304 echo "Note that  U       <symbol>    means the symbol is undefined (required) here"
   305 echo "           T, W, V <symbol>    is defined here"
   307 echo "For a full list of codes type"
   309 echo "    find_global_symbol.sh -h"