rdoff.h
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:6k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* rdoff.h RDOFF Object File manipulation routines header file
  2.  *
  3.  * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
  4.  * Julian Hall. All rights reserved. The software is
  5.  * redistributable under the licence given in the file "Licence"
  6.  * distributed in the NASM archive.
  7.  *
  8.  * Permission to use this file in your own projects is granted, as long
  9.  * as acknowledgement is given in an appropriate manner to its authors,
  10.  * with instructions of how to obtain a copy via ftp.
  11.  */
  12. #ifndef _RDOFF_H
  13. #define _RDOFF_H "RDOFF2 support routines v0.3"
  14. /* Some systems don't define this automatically */
  15. extern char *strdup(const char *);
  16. typedef unsigned short int16;
  17. typedef unsigned char byte;
  18. #define RDF_MAXSEGS 64
  19. /* the records that can be found in the RDOFF header */
  20. struct RelocRec {
  21.   byte  type;           /* must be 1 */
  22.   byte reclen; /* content length */
  23.   byte  segment;        /* only 0 for code, or 1 for data supported,
  24.    but add 64 for relative refs (ie do not require
  25.    reloc @ loadtime, only linkage) */
  26.   long  offset;         /* from start of segment in which reference is loc'd */
  27.   byte  length;         /* 1 2 or 4 bytes */
  28.   int16 refseg;         /* segment to which reference refers to */
  29. };
  30. struct ImportRec {
  31.   byte  type;           /* must be 2 */
  32.   byte reclen; /* content length */
  33.   int16 segment;        /* segment number allocated to the label for reloc
  34.                            records - label is assumed to be at offset zero
  35.                            in this segment, so linker must fix up with offset
  36.                            of segment and of offset within segment */
  37.   char  label[33];      /* zero terminated... should be written to file until
  38.                            the zero, but not after it - max len = 32 chars */
  39. };
  40. struct ExportRec {
  41.   byte  type;           /* must be 3 */
  42.   byte reclen; /* content length */
  43.   byte  segment;        /* segment referred to (0/1) */
  44.   long  offset;         /* offset within segment */
  45.   char  label[33];      /* zero terminated as above. max len = 32 chars */
  46. };
  47. struct DLLRec {
  48.   byte  type;           /* must be 4 */
  49.   byte reclen; /* content length */
  50.   char  libname[128];   /* name of library to link with at load time */
  51. };
  52. struct BSSRec {
  53.   byte type; /* must be 5 */
  54.   byte reclen; /* content length */
  55.   long amount; /* number of bytes BSS to reserve */
  56. };
  57. /* GenericRec - contains the type and length field, plus a 128 byte
  58.    char array 'data', which will probably never be used! */
  59. struct GenericRec {
  60.     byte type;
  61.     byte reclen;
  62.     char data[128];
  63. };
  64. typedef union RDFHeaderRec {
  65.   char type; /* invariant throughout all below */
  66.   struct GenericRec g;
  67.   struct RelocRec r; /* type == 1 / 6 */
  68.   struct ImportRec i; /* type == 2 / 7 */
  69.   struct ExportRec e; /* type == 3 */
  70.   struct DLLRec d; /* type == 4 */
  71.   struct BSSRec b; /* type == 5 */
  72. } rdfheaderrec;
  73. struct SegmentHeaderRec {
  74.     /* information from file */
  75.     int16 type;
  76.     int16 number;
  77.     int16 reserved;
  78.     long  length;
  79.     /* information built up here */
  80.     long  offset;
  81.     byte  *data; /* pointer to segment data if it exists in memory */
  82. };
  83. typedef struct RDFFileInfo {
  84.   FILE *fp; /* file descriptor; must be open to use this struct */
  85.   int rdoff_ver; /* should be 1; any higher => not guaranteed to work */
  86.   long header_len;
  87.   long header_ofs; 
  88.   byte *header_loc; /* keep location of header */
  89.   long header_fp; /* current location within header for reading */
  90.   struct SegmentHeaderRec seg[RDF_MAXSEGS];
  91.   int  nsegs;
  92.   long eof_offset; /* offset of the first byte beyond the end of this
  93.    module */
  94.   char *name; /* name of module in libraries */
  95.   int  *refcount;       /* pointer to reference count on file, or NULL */
  96. } rdffile;
  97. #define BUF_BLOCK_LEN 4088              /* selected to match page size (4096)
  98.                                          * on 80x86 machines for efficiency */
  99. typedef struct memorybuffer {
  100.   int length;
  101.   byte buffer[BUF_BLOCK_LEN];
  102.   struct memorybuffer *next;
  103. } memorybuffer;
  104. typedef struct {
  105.     memorybuffer * buf; /* buffer containing header records */
  106.     int  nsegments; /* number of segments to be written */
  107.     long  seglength; /* total length of all the segments */
  108. } rdf_headerbuf;
  109. /* segments used by RDOFF, understood by rdoffloadseg */
  110. #define RDOFF_CODE 0
  111. #define RDOFF_DATA 1
  112. #define RDOFF_HEADER -1
  113. /* mask for 'segment' in relocation records to find if relative relocation */
  114. #define RDOFF_RELATIVEMASK 64
  115. /* mask to find actual segment value in relocation records */
  116. #define RDOFF_SEGMENTMASK 63
  117. extern int rdf_errno;
  118. /* utility functions */
  119. int16 translateshort(int16 in);
  120. long translatelong(long in);
  121. /* RDOFF file manipulation functions */
  122. int rdfopen(rdffile *f,const char *name);
  123. int rdfopenhere(rdffile *f, FILE *fp, int *refcount, const char *name);
  124. int rdfclose(rdffile *f);
  125. int rdffindsegment(rdffile * f, int segno);
  126. int rdfloadseg(rdffile *f,int segment,void *buffer);
  127. rdfheaderrec *rdfgetheaderrec(rdffile *f);   /* returns static storage */
  128. void rdfheaderrewind(rdffile *f);      /* back to start of header */
  129. void rdfperror(const char *app,const char *name);
  130. /* functions to write a new RDOFF header to a file -
  131.    use rdfnewheader to allocate a header, rdfaddheader to add records to it,
  132.    rdfaddsegment to notify the header routines that a segment exists, and
  133.    to tell it how long the segment will be.
  134.    rdfwriteheader to write the file id, object length, and header
  135.    to a file, and then rdfdoneheader to dispose of the header */
  136. rdf_headerbuf *rdfnewheader(void);
  137. int rdfaddheader(rdf_headerbuf *h,rdfheaderrec *r);
  138. int rdfaddsegment(rdf_headerbuf *h, long seglength);
  139. int rdfwriteheader(FILE *fp,rdf_headerbuf *h);
  140. void rdfdoneheader(rdf_headerbuf *h);
  141. #endif /* _RDOFF_H */