vxwLoadLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:11k
源码类别:

VxWorks

开发平台:

C/C++

  1. // VXWModule/vxwLoadLib.h - object module class
  2. // Copyright 1995-1999 Wind River Systems, Inc.
  3. // modification history
  4. // --------------------
  5. // 01e,08mar99,jdi  doc: fixed wrong cross-references.
  6. // 01d,23feb99,fle  made it refgen parsable
  7. // 01c,21feb99,jdi  added library section, checked in documentation.
  8. // 01b,03oct95,rhp  documented.
  9. // 01a,15jun95,srh  written.
  10. // DESCRIPTION
  11. // The `VXWModule' class provides a generic object-module loading
  12. // facility.  Any object files in a supported format may be loaded
  13. // into memory, relocated properly, their external references
  14. // resolved, and their external definitions added to the system symbol
  15. // table for use by other modules.  Modules may be loaded from any I/O
  16. // stream.
  17. //
  18. // INCLUDE FILE: vxwLoadLib.h
  19. //
  20. // SEE ALSO: usrLib, symLib, VXWMemPart,
  21. // .pG "C++ Development"
  22. //
  23. // SECTION: 1C
  24. //
  25. #ifndef vxwLoadLib_h
  26. #define vxwLoadLib_h
  27. #include "vxWorks.h"
  28. #include "loadLib.h"
  29. #include "moduleLib.h"
  30. #include "unldLib.h"
  31. #include "vxwObject.h"
  32. #include "vxwErr.h"
  33. class VXWModule : virtual public VXWIdObject
  34.     {
  35.   public:
  36. ///////////////////////////////////////////////////////////////////////////////
  37. //
  38. // VXWModule::VXWModule - build module object from module ID
  39. // 
  40. // Use this constructor to manipulate a module that was not loaded
  41. // using C++ interfaces.  The argument <id> is the module
  42. // identifier returned and used by the C interface to the VxWorks
  43. // target-resident load facility.
  44. // 
  45. // RETURNS: N/A.
  46. // 
  47. // SEE ALSO: loadLib
  48.     VXWModule (MODULE_ID aModuleId)
  49. : mid_ (aModuleId)
  50. {
  51. }
  52. ///////////////////////////////////////////////////////////////////////////////
  53. //
  54. // VXWModule::VXWModule - load an object module at specified memory addresses
  55. // 
  56. // This constructor reads an object module from <fd>, and loads the
  57. // code, data, and BSS segments at the specified load addresses in
  58. // memory set aside by the caller using VXWMemPart::alloc(), or in the
  59. // system memory partition as described below.  The module is properly
  60. // relocated according to the relocation commands in the file.
  61. // Unresolved externals will be linked to symbols found in the system
  62. // symbol table.  Symbols in the module being loaded can optionally be
  63. // added to the system symbol table.
  64. //
  65. // LINKING UNRESOLVED EXTERNALS
  66. // As the module is loaded, any unresolved external references are resolved
  67. // by looking up the missing symbols in the the system symbol table.
  68. // If found, those references are correctly linked to the new module.
  69. // If unresolved external references cannot be found in the system symbol
  70. // table, then an error message ("undefined symbol: ...") is printed for
  71. // the symbol, but the loading/linking continues.  In this case, NULL is
  72. // returned after the module is loaded.
  73. //
  74. // ADDING SYMBOLS TO THE SYMBOL TABLE
  75. // The symbols defined in the module to be loaded may be optionally added
  76. // to the target-resident system symbol table, depending on the value of
  77. // <symFlag>:
  78. // .iP "LOAD_NO_SYMBOLS" 29
  79. // add no symbols to the system symbol table
  80. // .iP "LOAD_LOCAL_SYMBOLS"
  81. // add only local symbols to the system symbol table
  82. // .iP "LOAD_GLOBAL_SYMBOLS"
  83. // add only external symbols to the system symbol table
  84. // .iP "LOAD_ALL_SYMBOLS"
  85. // add both local and external symbols to the system symbol table
  86. // .iP "HIDDEN_MODULE"
  87. // do not display the module via moduleShow().
  88. // .LP
  89. //
  90. // In addition, the following symbols are also added to the symbol table
  91. // to indicate the start of each segment:
  92. // <filename>_text, <filename>_data, and <filename>_bss,
  93. // where <filename> is the name associated with the fd.
  94. //
  95. // RELOCATION
  96. // The relocation commands in the object module are used to relocate
  97. // the text, data, and BSS segments of the module.  The location of each
  98. // segment can be specified explicitly, or left unspecified in which
  99. // case memory is allocated for the segment from the system memory
  100. // partition.  This is determined by the parameters <ppText>, <ppData>, and
  101. // <ppBss>, each of which can have the following values:
  102. // .iP "NULL"
  103. // no load address is specified, none will be returned;
  104. // .iP "A pointer to LD_NO_ADDRESS"
  105. // no load address is specified, the return address is referenced by the
  106. // pointer;
  107. // .iP "A pointer to an address"
  108. // the load address is specified.
  109. // .LP
  110. //
  111. // The <ppText>, <ppData>, and <ppBss> parameters specify where to load
  112. // the text, data, and bss sections respectively.  Each of these
  113. // parameters is a pointer to a  pointer; for example, **<ppText>
  114. // gives the address where the text segment is to begin.
  115. //
  116. // For any of the three parameters, there are two ways to request that
  117. // new memory be allocated, rather than specifying the section's
  118. // starting address: you can either specify the parameter itself as
  119. // NULL, or you can write the constant LD_NO_ADDRESS in place of an
  120. // address.  In the second case, this constructor replaces the
  121. // LD_NO_ADDRESS value with the address actually used for each section
  122. // (that is, it records the address at *<ppText>, *<ppData>, or
  123. // *<ppBss>).
  124. //
  125. // The double indirection not only permits reporting the addresses
  126. // actually used, but also allows you to specify loading a segment
  127. // at the beginning of memory, since the following cases can be
  128. // distinguished:
  129. // .IP (1) 4
  130. // Allocate memory for a section (text in this example):  <ppText> == NULL
  131. // .IP (2)
  132. // Begin a section at address zero (the text section, below):  *<ppText> == 0
  133. // .LP
  134. // Note that loadModule() is equivalent to this routine if all three of the
  135. // segment-address parameters are set to NULL.
  136. //
  137. // COMMON
  138. // Some host compiler/linker combinations internally use another
  139. // storage class known as f2commonf1.  In the C language,
  140. // uninitialized global variables are eventually put in the BSS
  141. // segment.  However, in partially linked object modules they are
  142. // flagged internally as common and the static linker on the host
  143. // resolves these and places them in BSS as a final step in creating a
  144. // fully linked object module.  However, the VxWorks target-resident
  145. // dynamic loader is most often used to load partially linked object
  146. // modules.  When the VxWorks loader encounters a variable labeled as
  147. // common, memory for the variable is allocated, and the variable is
  148. // entered in the system symbol table (if specified) at that address.
  149. // Note that most static loaders have an option that forces resolution
  150. // of the common storage while leaving the module relocatable.
  151. //
  152. // RETURNS: N/A.
  153. //
  154. // SEE ALSO
  155. // .pG "C++ Development"
  156.     VXWModule (int fd, int symFlag, char **ppText,
  157.        char **ppData=0, char **ppBss=0)
  158. : mid_ (loadModuleAt (fd, symFlag, ppText, ppData, ppBss))
  159. {
  160. if (mid_ == NULL)
  161.     vxwThrowErrno ();
  162. }
  163. ///////////////////////////////////////////////////////////////////////////////
  164. //
  165. // VXWModule::VXWModule - load an object module into memory
  166. // 
  167. // This constructor loads an object module from the file descriptor
  168. // <fd>, and places the code, data, and BSS into memory allocated from
  169. // the system memory pool.
  170. //
  171. // RETURNS: N/A
  172.     VXWModule (int fd, int symFlag)
  173. : mid_ (loadModule (fd, symFlag))
  174. {
  175. if (mid_ == NULL)
  176.     vxwThrowErrno ();
  177. }
  178. ///////////////////////////////////////////////////////////////////////////////
  179. //
  180. // VXWModule::VXWModule - create and initialize an object module
  181. // 
  182. // This constructor creates an object module descriptor.  It is usually
  183. // called from another constructor.
  184. // 
  185. // The arguments specify the name of the object module file, 
  186. // the object module format, and a collection of options <flags>.
  187. // 
  188. // Space for the new module is dynamically allocated.
  189. // 
  190. // RETURNS: N/A
  191.     VXWModule (char *name, int format, int flags)
  192. : mid_ (moduleCreate (name, format, flags))
  193. {
  194. if (mid_ == 0)
  195.     vxwThrowErrno ();
  196. }
  197. ///////////////////////////////////////////////////////////////////////////////
  198. //
  199. // VXWModule::~VXWModule - unload an object module
  200. // 
  201. // This destructor unloads the object module from the target system.  
  202. // For a.out and ECOFF format modules, unloading does the following:
  203. // .IP (1) 4
  204. // It frees the space allocated for text, data,
  205. // and BSS segments, unless VXWModule::VXWModule() was called with specific
  206. // addresses, in which case the application is responsible for freeing space.
  207. // .IP (2)
  208. // It removes all symbols associated with the object module from the
  209. // system symbol table.
  210. // .IP (3)
  211. // It removes the module descriptor from the module list.
  212. // .LP
  213. //
  214. // For other modules of other formats, unloading has similar effects.
  215. // 
  216. // Unloading modules with this interface has no effect on breakpoints
  217. // in other modules.
  218. // 
  219. // RETURNS: N/A
  220.     ~VXWModule ()
  221. {
  222. if (unldByModuleId (mid_, UNLD_KEEP_BREAKPOINTS) != OK)
  223.     vxwThrowErrno ();
  224. }
  225. ///////////////////////////////////////////////////////////////////////////////
  226. //
  227. // VXWModule::flags - get the flags associated with this module
  228. //
  229. // This routine returns the flags associated with its module.
  230. //
  231. // RETURNS: The option flags.
  232.     int flags () const
  233. {
  234. return moduleFlagsGet (mid_);
  235. }
  236. ///////////////////////////////////////////////////////////////////////////////
  237. //
  238. // VXWModule::info - get information about object module
  239. // 
  240. // This routine fills in a MODULE_INFO structure with information about the
  241. // object module.
  242. // 
  243. // RETURNS: OK or ERROR.
  244.     STATUS info (MODULE_INFO * pModuleInfo) const
  245. {
  246. return moduleInfoGet (mid_, pModuleInfo);
  247. }
  248. ///////////////////////////////////////////////////////////////////////////////
  249. //
  250. // VXWModule::name - get the name associated with module
  251. //
  252. // This routine returns a pointer to the name associated with its module.
  253. //
  254. // RETURNS: A pointer to the module name.
  255.     char * name () const
  256. {
  257. return moduleNameGet (mid_);
  258. }
  259. ///////////////////////////////////////////////////////////////////////////////
  260. //
  261. // VXWModule::segFirst - find the first segment in module
  262. // 
  263. // This routine returns information about the first segment of a module
  264. // descriptor.
  265. // 
  266. // RETURNS: A pointer to the segment ID.
  267. //
  268. // SEE ALSO: VXWModule::segGet()
  269.     SEGMENT_ID segFirst () const
  270. {
  271. return moduleSegFirst (mid_);
  272. }
  273. ///////////////////////////////////////////////////////////////////////////////
  274. //
  275. // VXWModule::segGet - get (delete and return) the first segment from module
  276. // 
  277. // This routine returns information about the first segment of a module
  278. // descriptor, and then deletes the segment from the module.
  279. // 
  280. // RETURNS: A pointer to the segment ID, or NULL if the segment list is empty.
  281. // 
  282. // SEE ALSO: VXWModule::segFirst()
  283.     SEGMENT_ID segGet ()
  284. {
  285. return moduleSegGet (mid_);
  286. }
  287. ///////////////////////////////////////////////////////////////////////////////
  288. //
  289. // VXWModule::segNext - find the next segment in module
  290. // 
  291. // This routine returns the segment in the list immediately following
  292. // <segmentId>.
  293. // 
  294. // RETURNS: A pointer to the segment ID, or NULL if there is no next segment.
  295.     SEGMENT_ID segNext (SEGMENT_ID segmentId) const
  296. {
  297. return moduleSegNext (segmentId);
  298. }
  299.   protected:
  300.     VXWModule ()
  301. {
  302. }
  303.     VXWModule (const VXWModule &)
  304. {
  305. }
  306.     VXWModule & operator = (const VXWModule &)
  307. {
  308. return *this;
  309. }
  310.     virtual void * myValue ();
  311.     MODULE_ID mid_;
  312.     };
  313. #endif /* ifndef vxwLoadLib_h */