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

VxWorks

开发平台:

C/C++

  1. /* cplusLoad.c - load-time functions for C++  */
  2. /* Copyright 1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,19mar02,sn   SPR 71699 - Pull in cplusUsr.o if cplusLoad.o is included
  8. 01c,22jan02,sn   Changed to C file
  9. 01b,03jun93,srh  doc cleanup
  10. 01a,21apr93,srh  split out from cplusLib.C
  11. */
  12. /*
  13. DESCRIPTION
  14. This module supports the module loader. It contains no user-callable routines
  15. NOMANUAL
  16. */
  17. /* Includes */
  18. #include "vxWorks.h"
  19. #include "string.h"
  20. #include "cplusLib.h"
  21. #include "taskLib.h"
  22. /* Defines */
  23. /* Globals */
  24. extern char __cplusUsr_o;
  25. char __cplusLoad_o = 0;
  26. char * __cplusLoadObjFiles [] =
  27.     {
  28.     & __cplusUsr_o
  29.     };
  30. /* Locals */
  31. /* Forward declarations */
  32. /*******************************************************************************
  33. *
  34. * findXtors - find initializers for module's _ctors and _dtors members
  35. *
  36. * This function is used by cplusLoadFixup. It called by symEach to
  37. * scan the symbol table for ctors and dtors arrays, as generated
  38. * by the munch utility.
  39. *
  40. * RETURNS: FALSE after values are found for both ctors and dtors,
  41. *          otherwise TRUE.
  42. *
  43. * NOMANUAL
  44. */
  45. LOCAL BOOL findXtors
  46.     (
  47.     char *name,
  48.     int val,
  49.     SYM_TYPE dummy,
  50.     int module_arg,
  51.     UINT16 group
  52.     )
  53.     {
  54.     MODULE_ID module = (MODULE_ID) module_arg;
  55.     
  56.     /* First check to see if this symbol belongs to the module of interest */
  57.     if (group == module->group)
  58. {
  59. /*
  60.  * This symbol belongs to the current module, so check to
  61.  * see if it is a ctors or dtors array, and if so, fill out the module
  62.  */
  63. if ((strcmp (name, "__ctors") == 0)
  64.     ||
  65.     (strcmp (name, "_ctors") == 0))
  66.     {
  67.     module->ctors = (VOIDFUNCPTR *) val;
  68.     }
  69. else if ((strcmp (name, "__dtors") == 0)
  70.  ||
  71.  (strcmp (name, "_dtors") == 0))
  72.     {
  73.     module->dtors = (VOIDFUNCPTR *) val;
  74.     }
  75. }
  76.     /* Stop scanning iff we've found both ctors and dtors */
  77.     if ((module->ctors == 0) || (module->dtors == 0))
  78. {
  79. return TRUE;
  80. }
  81.     return FALSE;
  82.     }
  83. /*******************************************************************************
  84. *
  85. * cplusLoadFixup - post-load module manipulations for C++
  86. *
  87. * Search the given module for _ctors and _dtors. These symbols indicate
  88. * lists pointers to cfront-composed functions that call constructors
  89. * and destructors for a module's static objects. If matching symbols
  90. * are found, set the module's ctors and dtors members to the symbols' values.
  91. * Otherwise set to 0.
  92. *
  93. * RETURNS: OK
  94. *
  95. * NOMANUAL
  96. */
  97. STATUS cplusLoadFixup
  98.     (
  99.     MODULE_ID module, /* just-loaded module */
  100.     int dummy, /* which symbols were added */
  101.     SYMTAB_ID symTab /* which symbol table to use */
  102.     )
  103.     {
  104.     module->ctors = 0;
  105.     module->dtors = 0;
  106.     symEach (symTab, (FUNCPTR) findXtors, (int) module);
  107.     if (module->ctors != 0 && cplusXtorStrategy == 1)
  108. {
  109. cplusCallCtors (module->ctors);
  110. }
  111.     return OK;
  112.     }
  113. /*******************************************************************************
  114. *
  115. * cplusUnoadFixup - pre-unload module manipulations for C++
  116. *
  117. * Call static destructors if the current xtor strategy is automatic.
  118. * Otherwise do nothing.
  119. *
  120. * RETURNS: OK
  121. *
  122. * NOMANUAL
  123. */
  124. STATUS cplusUnloadFixup
  125.     (
  126.     MODULE_ID module /* module to be deleted */
  127.     )
  128.     {
  129.     if (module && module->dtors && cplusXtorStrategy == 1)
  130. {
  131. cplusCallDtors (module->dtors);
  132. }
  133.     return OK;
  134.     }