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

VxWorks

开发平台:

C/C++

  1. /* bootEcoffLib.c - UNIX extended coff object module boot loader */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,22apr93,caf  ansification: added cast to cacheTextUpdate() parameter.
  8. 01c,31jul92,dnw  changed to use cacheTextUpdate().
  9. 01b,23jul92,jmm  removed #include "loadCommonLib.h"
  10. 01a,23jul92,ajm  created
  11. */
  12. /*
  13. DESCRIPTION
  14. This library provides an object module boot loading facility particuarly for 
  15. the MIPS compiler environment.  Any MIPS SYSV ECOFF
  16. format file may be boot loaded into memory.
  17. Modules may be boot loaded from any I/O stream.
  18. INCLUDE FILE: bootEcoffLib.h
  19. SEE ALSO: bootLoadLib
  20. .pG "Basic OS"
  21. */
  22. #include "vxWorks.h"
  23. #include "stdio.h"
  24. #include "bootEcoffLib.h"
  25. #include "ecoffSyms.h"
  26. #include "ecoff.h"
  27. #include "ioLib.h"
  28. #include "fioLib.h"
  29. #include "bootLoadLib.h"
  30. #include "loadLib.h"
  31. #include "memLib.h"
  32. #include "pathLib.h"
  33. #include "string.h"
  34. #include "cacheLib.h"
  35. /*******************************************************************************
  36. *
  37. * bootEcoffModule - load an object module into memory
  38. *
  39. * This routine loads an object module in ECOFF format from the specified
  40. * file, and places the code, data, and BSS at the locations specified within
  41. * the file.  The entry point of the module is returned in <pEntry>.  This 
  42. * routine is generally used for bootstrap loading.
  43. *
  44. * RETURNS:
  45. * OK, or
  46. * ERROR if the routine cannot read the file
  47. *
  48. * SEE ALSO: loadModuleAt()
  49. */
  50. LOCAL STATUS bootEcoffModule 
  51.     (
  52.     int fd,
  53.     FUNCPTR *pEntry  /* entry point of module */
  54.     )
  55.     {
  56.     FILHDR hdr; /* module's ECOFF header */
  57.     AOUTHDR optHdr;              /* module's ECOFF optional header */
  58.     int nBytes;
  59.     char tempBuf[MAX_SCNS * SCNHSZ];
  60.     int tablesAreLE;
  61.     /* read object module header */
  62.     if (ecoffHdrRead (fd, &hdr, &tablesAreLE) != OK)
  63. return (ERROR);
  64.     /* read in optional header */
  65.     if (ecoffOpthdrRead (fd, &optHdr, &hdr, tablesAreLE) != OK)
  66. return (ERROR);
  67.     /* 
  68.     *  Read till start of text, for some reason we can't do an ioctl FIOWHERE
  69.     *  on a rcmd opened file descriptor. 
  70.     */
  71.     nBytes = fioRead (fd, tempBuf, (N_TXTOFF(hdr, optHdr) - FILHSZ - AOUTHSZ));
  72.     if (nBytes < (N_TXTOFF(hdr, optHdr) - FILHSZ - AOUTHSZ))
  73.         return (ERROR);
  74.     printf ("%d", optHdr.tsize);
  75.     nBytes = fioRead (fd, (char *) optHdr.text_start, (int) optHdr.tsize);
  76.     if (nBytes < optHdr.tsize)
  77.         return (ERROR);
  78.     cacheTextUpdate ((void *) optHdr.text_start, optHdr.tsize);
  79.     printf (" + %d", optHdr.dsize);
  80.     nBytes = fioRead (fd, (char *) optHdr.data_start, (int) optHdr.dsize);
  81.     if (nBytes < optHdr.dsize)
  82.         return (ERROR);
  83.     printf (" + %dn", optHdr.bsize);
  84.     bzero ((char *) optHdr.bss_start, (int) optHdr.bsize);
  85.     *pEntry = (FUNCPTR) optHdr.entry;
  86.     return (OK);
  87.     }
  88. /********************************************************************************
  89. * bootEcoffInit - initialize the system for ecoff load modules
  90. *
  91. * This routine initialized VxWorks to use an extended coff format for
  92. * boot loading modules.
  93. *
  94. * RETURNS:
  95. * OK, or
  96. * ERROR if XXX
  97. *
  98. * SEE ALSO: loadModuleAt()
  99. */
  100. STATUS bootEcoffInit
  101.     (
  102.     )
  103.     {
  104.     /* XXX check for installed ? */
  105.     bootLoadRoutine = bootEcoffModule;
  106.     return (OK);
  107.     }