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

VxWorks

开发平台:

C/C++

  1. /* loadEcoffComm.c - UNIX extended coff object module common routines */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,23jul92,ajm  created
  8. */
  9. /*
  10. DESCRIPTION
  11. This module contains the routines that are common to dynamic loading
  12. and booting of ECOFF object files.  Including this module significantly
  13. reduces the size of the standard bootroms.
  14. SEE ALSO: loadLib, usrLib
  15. .pG "Basic OS"
  16. */
  17. #include "vxWorks.h"
  18. #include "loadEcoffComm.h"
  19. #include "ecoffSyms.h"
  20. #include "ecoff.h"
  21. LOCAL char fileTypeUnsupported [] =
  22.     "loadEcoffComm error: File type with magic number %#x is not supported.n";
  23. /*******************************************************************************
  24. *
  25. * ecoffHdrRead - read in COFF header and swap if necessary
  26. */
  27. STATUS ecoffHdrRead
  28.     (
  29.     int fd,
  30.     FILHDR *pHdr,
  31.     BOOL *pSwap 
  32.     )
  33.     {
  34.     if (fioRead (fd, (char *) pHdr, sizeof (*pHdr)) != sizeof (*pHdr))
  35. {
  36. return (ERROR);
  37. }
  38.     switch (pHdr->f_magic)
  39. {
  40. case MIPSEBMAGIC: /* big-endian target, same sex headers */
  41.     *pSwap = FALSE;
  42.     break;
  43. case SMIPSEBMAGIC: /* big-endian target, opposite sex headers */
  44.     *pSwap = TRUE;
  45.     break;
  46. case MIPSELMAGIC: /* little-endian target, same sex headers */
  47. case SMIPSELMAGIC: /* little-endian target, opposite sex headers*/
  48. default:
  49.     printErr (fileTypeUnsupported, pHdr->f_magic);
  50.     return (ERROR);
  51.     break;
  52. }
  53.     if (*pSwap)
  54. swapCoffhdr(pHdr);
  55.     return (OK);
  56.     }
  57. /*******************************************************************************
  58. *
  59. * ecoffOpthdrRead - read in COFF optional header and swap if necessary
  60. */
  61. STATUS ecoffOpthdrRead
  62.     (
  63.     int     fd,
  64.     AOUTHDR *pOptHdr,
  65.     FILHDR  *pHdr,
  66.     BOOL    swapTables 
  67.     )
  68.     {
  69.     if (fioRead (fd, (char *)pOptHdr,(int) pHdr->f_opthdr) != pHdr->f_opthdr)
  70.         {
  71.         return (ERROR);
  72.         }
  73.     if (swapTables)
  74. swapCoffoptHdr (pOptHdr);
  75.     return (OK);
  76.     }
  77. /*******************************************************************************
  78. *
  79. * swapCoffoptHdr - swap endianess of COFF optional header
  80. *
  81. */
  82. void swapCoffoptHdr 
  83.     (
  84.     AOUTHDR *pOptHdr           /* module's ECOFF optional header */
  85.     )
  86.     {
  87.     AOUTHDR tempOptHdr;
  88.     swab ((char *) &pOptHdr->magic, (char *) &tempOptHdr.magic,
  89.         sizeof(pOptHdr->magic));
  90.     swab ((char *) &pOptHdr->vstamp, (char *) &tempOptHdr.vstamp,
  91.         sizeof(pOptHdr->vstamp));
  92.     swabLong ((char *) &pOptHdr->tsize, (char *) &tempOptHdr.tsize);
  93.     swabLong ((char *) &pOptHdr->dsize, (char *) &tempOptHdr.dsize);
  94.     swabLong ((char *) &pOptHdr->bsize, (char *) &tempOptHdr.bsize);
  95.     swabLong ((char *) &pOptHdr->entry, (char *) &tempOptHdr.entry);
  96.     swabLong ((char *) &pOptHdr->text_start, (char *) &tempOptHdr.text_start);
  97.     swabLong ((char *) &pOptHdr->data_start, (char *) &tempOptHdr.data_start);
  98.     swabLong ((char *) &pOptHdr->bss_start, (char *) &tempOptHdr.bss_start);
  99.     swabLong ((char *) &pOptHdr->gprmask, (char *) &tempOptHdr.gprmask);
  100.     swabLong ((char *) &pOptHdr->cprmask[0], (char *) &tempOptHdr.cprmask[0]);
  101.     swabLong ((char *) &pOptHdr->cprmask[1], (char *) &tempOptHdr.cprmask[1]);
  102.     swabLong ((char *) &pOptHdr->cprmask[2], (char *) &tempOptHdr.cprmask[2]);
  103.     swabLong ((char *) &pOptHdr->cprmask[3], (char *) &tempOptHdr.cprmask[3]);
  104.     swabLong ((char *) &pOptHdr->gp_value, (char *) &tempOptHdr.gp_value);
  105.     bcopy ((char *) &tempOptHdr, (char *) pOptHdr, sizeof(AOUTHDR));
  106.     }
  107. /*******************************************************************************
  108. *
  109. * swapCoffhdr - swap endianess of COFF header
  110. */
  111. void swapCoffhdr
  112.     (
  113.     FILHDR *pHdr  /* module's ECOFF header */
  114.     )
  115.     {
  116.     FILHDR tempHdr;
  117.     swab ((char *) &pHdr->f_magic, (char *) &tempHdr.f_magic, 
  118. sizeof(pHdr->f_magic));
  119.     swab ((char *) &pHdr->f_nscns, (char *) &tempHdr.f_nscns, 
  120. sizeof(pHdr->f_magic));
  121.     swabLong ((char *) &pHdr->f_timdat, (char *) &tempHdr.f_timdat);
  122.     swabLong ((char *) &pHdr->f_symptr, (char *) &tempHdr.f_symptr);
  123.     swabLong ((char *) &pHdr->f_nsyms, (char *) &tempHdr.f_nsyms);
  124.     swab ((char *) &pHdr->f_opthdr, (char *) &tempHdr.f_opthdr, 
  125. sizeof(pHdr->f_opthdr));
  126.     swab ((char *) &pHdr->f_flags, (char *) &tempHdr.f_flags, 
  127. sizeof(pHdr->f_flags));
  128.     bcopy ((char *) &tempHdr, (char *) pHdr, sizeof(FILHDR));
  129.     }
  130. /*******************************************************************************
  131. *
  132. *  swabLong - swap endianess of long word
  133. *
  134. */
  135. void swabLong 
  136.     (
  137.     char input[],
  138.     char output[] 
  139.     )
  140.     {
  141.     output[0] = input[3];
  142.     output[1] = input[2];
  143.     output[2] = input[1];
  144.     output[3] = input[0];
  145.     }