symShow.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* symShow.c - symbol table show routines */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01i,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  8. 01h,30sep93,dvs  changed default value of symLkupPgSz to 22.
  9. 01g,24aug93,dvs  modified symSysTblPrint() to display symbols in sets of 
  10.  symLkupPgSz, user can now quit from lkup() (SPR #921)
  11. 01f,13feb93,kdl  changed cplusLib.h to private/cplusLibP.h (SPR #1917).
  12. 01e,03feb93,jdi  changed INCLUDE_SHOW_RTNS to ...ROUTINES.
  13. 01d,01aug92,srh  added C++ demangling idiom to symSysTblPrint and symPrint
  14. 01c,20jul92,jmm  added group param to symSysTblPrint, lkup() now displays module
  15. 01b,12jul92,jcf  changed symShow (NULL) to summarize symbol table struct.
  16. 01a,04jul92,jcf  created.
  17. */
  18. /*
  19. DESCRIPTION
  20. This library provides a routine for showing symbol table information.
  21. The routine symShowInit() links the symbol table show facility into
  22. the VxWorks system.  It is called automatically when this
  23. facility is configured into VxWorks using either of the
  24. following methods:
  25. .iP
  26. If you use the configuration header files, define
  27. INCLUDE_SHOW_ROUTINES in config.h.
  28. .iP
  29. If you use the Tornado project facility, select INCLUDE_SYM_TABLE_SHOW.
  30. INCLUDE FILE: symLib.h
  31. SEE ALSO: symLib
  32. */
  33. #include "vxWorks.h"
  34. #include "string.h"
  35. #include "stdio.h"
  36. #include "a_out.h"
  37. #include "sysSymTbl.h"
  38. #include "symLib.h"
  39. #include "errno.h"
  40. #include "moduleLib.h"
  41. #include "fioLib.h"
  42. #include "types.h"
  43. #include "private/cplusLibP.h"
  44. /* locals */
  45. LOCAL char *typeName [] = /* system symbol table types */
  46.     {
  47.     "????",
  48.     "abs",
  49.     "text",
  50.     "data",
  51.     "bss",
  52.     };
  53. LOCAL int  symCount = 0; /* number of symbols printed */
  54. /* globals */
  55. uint32_t symLkupPgSz = 22; /* max symbols displayed at a time */
  56. /* forward declarations */
  57. LOCAL BOOL symPrint (char *name, int val, INT8 type, char *substr);
  58. LOCAL BOOL symSysTblPrint (char *name, int val, INT8 type, char *substr,
  59.    UINT16 group);
  60. LOCAL char *strMatch (FAST char *str1, FAST char *str2);
  61. /******************************************************************************
  62. *
  63. * symShowInit - initialize symbol table show routine
  64. *
  65. * This routine links the symbol table show facility into the VxWorks system.
  66. * It is called automatically when the symbol table show facility is
  67. * configured into VxWorks using either of the following methods:
  68. * .iP
  69. * If you use the configuration header files, define
  70. * INCLUDE_SHOW_ROUTINES in config.h.
  71. * .iP
  72. * If you use the Tornado project facility, select INCLUDE_SYM_TABLE_SHOW.
  73. *
  74. * RETURNS: N/A
  75. */
  76. void symShowInit (void)
  77.     {
  78.     classShowConnect (symTblClassId, (FUNCPTR)symShow);
  79.     }
  80. /*******************************************************************************
  81. *
  82. * symShow - show the symbols of specified symbol table with matching substring
  83. *
  84. * This routine lists all symbols in the specified symbol table whose names
  85. * contain the string <substr>.  If <substr> is is an empty * string (""), all
  86. * symbols in the table will be listed.  If <substr> is NULL then the symbol
  87. * table structure will be summarized.
  88. *
  89. * RETURNS: OK, or ERROR if invalid symbol table id.
  90. *
  91. * SEE ALSO: symLib, symEach()
  92. */
  93. STATUS symShow
  94.     (
  95.     SYMTAB * pSymTbl, /* pointer to symbol table to summarize */
  96.     char * substr /* substring to match */
  97.     )
  98.     {
  99.     if (OBJ_VERIFY (pSymTbl, symTblClassId) != OK)
  100. return (ERROR); /* invalid symbol table ID */
  101.     if (substr == NULL)
  102. {
  103. printf ("%-20s: %-10dn", "Number of Symbols", pSymTbl->nsymbols);
  104. printf ("%-20s: 0x%-10xn", "Symbol Mutex Id", &pSymTbl->symMutex);
  105. printf ("%-20s: 0x%-10xn", "Symbol Hash Id", pSymTbl->nameHashId);
  106. printf ("%-20s: 0x%-10xn", "Symbol memPartId", pSymTbl->symPartId);
  107. printf ("%-20s: %-10sn", "Name Clash Policy", 
  108. (pSymTbl->sameNameOk) ? "Allowed" : "Disallowed");
  109. }
  110.     else
  111. {
  112. if (pSymTbl == sysSymTbl)
  113.     {
  114.     symEach (pSymTbl, (FUNCPTR) symSysTblPrint, (int) substr);
  115.     symCount = 0;
  116.     }
  117. else
  118.     symEach (pSymTbl, (FUNCPTR) symPrint, (int) substr);
  119. }
  120.     return (OK);
  121.     }
  122. /*******************************************************************************
  123. *
  124. * symSysTblPrint - support routine for symShow()
  125. *
  126. * This routine is called by symEach() to deal with each symbol in the 
  127. * system symbol table.  If the symbol's name contains <substr>, this routine
  128. * prints the symbol.  Otherwise, it doesn't.  If <substr> is NULL, every
  129. * symbol is printed.  The type is printed along with the symbol value.
  130. */
  131. LOCAL BOOL symSysTblPrint
  132.     (
  133.     char * name,
  134.     int val,
  135.     INT8 type,
  136.     char * substr,
  137.     UINT16      group
  138.     )
  139.     {
  140.     char  moduleName [NAME_MAX];
  141.     MODULE_ID moduleId;
  142.     char demangled [MAX_SYS_SYM_LEN + 1];
  143.     char * nameToPrint;
  144.     char quitChar; /* q to quit displaying symbols */
  145.     /*
  146.      * If group is the system group default, don't print anything.  If
  147.      * it's not the default, try to get a corresponding module name.
  148.      * If you can't find a module, just print the group number.
  149.      */
  150.     if (group == symGroupDefault)
  151.         moduleName [0] = EOS;
  152.     else if ((moduleId = moduleFindByGroup (group)) != NULL)
  153.         sprintf (moduleName, "(%s)", moduleId->name);
  154.     else
  155.         sprintf (moduleName, "(%d)", group);
  156.     
  157.     if (substr == NULL || strMatch (name, substr) != NULL)
  158. {
  159. nameToPrint = cplusDemangle (name, demangled, MAX_SYS_SYM_LEN + 1);
  160. printf ("%-25s 0x%08x %-8s %s", nameToPrint, val,
  161. typeName [(type >> 1) & 7], moduleName);
  162. if ((type & N_EXT) == 0)
  163.     printf (" (local)");
  164. printf ("n");
  165. if (symLkupPgSz != 0) /* do paging */
  166.     {
  167.     symCount++;
  168.     if ((symCount % symLkupPgSz) == 0) /* prompt user to continue */
  169. {
  170. printf ("nType <CR> to continue, Q<CR> to stop: ");
  171. fioRdString (STD_IN, &quitChar, 1);
  172. if ((quitChar == 'q') || (quitChar == 'Q'))
  173.     return (FALSE);
  174. }
  175.     }
  176. }
  177.     return (TRUE);
  178.     }
  179. /*******************************************************************************
  180. *
  181. * symPrint - support routine for symShow()
  182. *
  183. * This routine is called by symEach() to deal with each symbol in the table.
  184. * If the symbol's name contains <substr>, this routine prints the symbol.
  185. * Otherwise, it doesn't.  If <substr> is NULL, every symbol is printed.
  186. */
  187. LOCAL BOOL symPrint
  188.     (
  189.     char * name,
  190.     int val,
  191.     INT8 type,
  192.     char * substr
  193.     )
  194.     {
  195.     char demangled [MAX_SYS_SYM_LEN + 1];
  196.     char * nameToPrint;
  197.     if (substr == NULL || strMatch (name, substr) != NULL)
  198.         {
  199. nameToPrint = cplusDemangle (name, demangled, MAX_SYS_SYM_LEN + 1);
  200. printf ("%-25s 0x%08xn", nameToPrint, val);
  201.         }
  202.     return (TRUE);
  203.     }
  204. /*******************************************************************************
  205. *
  206. * strMatch - find an occurrence of a string in another string
  207. *
  208. * This is a simple pattern matcher used by symPrint().  It looks for an
  209. * occurence of <str2> in <str1> and returns a pointer to that occurrence in
  210. * <str1>.  If it doesn't find one, it returns 0.
  211. */
  212. LOCAL char *strMatch
  213.     (
  214.     FAST char *str1, /* where to look for match */
  215.     FAST char *str2 /* string to find a match for */
  216.     )
  217.     {
  218.     FAST int str2Length = strlen (str2);
  219.     FAST int ntries = strlen (str1) - str2Length;
  220.     for (; ntries >= 0; str1++, --ntries)
  221. {
  222. if (strncmp (str1, str2, str2Length) == 0)
  223.     return (str1); /* we've found a match */
  224. }
  225.     return (NULL);
  226.     }