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

编译器/解释器

开发平台:

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. #ifndef _RDOFF_H
  9. #define _RDOFF_H "RDOFF1 support routines v0.1"
  10. typedef short int16;    /* not sure if this will be required to be altered
  11.                            at all... best to typedef it just in case */
  12. /* the records that can be found in the RDOFF header */
  13. struct RelocRec {
  14.   char  type;           /* must be 1 */
  15.   char  segment;        /* only 0 for code, or 1 for data supported,
  16.    but add 64 for relative refs (ie do not require
  17.    reloc @ loadtime, only linkage) */
  18.   long  offset;         /* from start of segment in which reference is loc'd */
  19.   char  length;         /* 1 2 or 4 bytes */
  20.   int16 refseg;         /* segment to which reference refers to */
  21. };
  22. struct ImportRec {
  23.   char  type;           /* must be 2 */
  24.   int16 segment;        /* segment number allocated to the label for reloc
  25.                            records - label is assumed to be at offset zero
  26.                            in this segment, so linker must fix up with offset
  27.                            of segment and of offset within segment */
  28.   char  label[33];      /* zero terminated... should be written to file until
  29.                            the zero, but not after it - max len = 32 chars */
  30. };
  31. struct ExportRec {
  32.   char  type;           /* must be 3 */
  33.   char  segment;        /* segment referred to (0/1) */
  34.   long  offset;         /* offset within segment */
  35.   char  label[33];      /* zero terminated as above. max len = 32 chars */
  36. };
  37. struct DLLRec {
  38.   char  type;           /* must be 4 */
  39.   char  libname[128];   /* name of library to link with at load time */
  40. };
  41. struct BSSRec {
  42.   char type; /* must be 5 */
  43.   long amount; /* number of bytes BSS to reserve */
  44. };
  45.   
  46. typedef union RDFHeaderRec {
  47.   char type; /* invariant throughout all below */
  48.   struct RelocRec r; /* type == 1 */
  49.   struct ImportRec i; /* type == 2 */
  50.   struct ExportRec e; /* type == 3 */
  51.   struct DLLRec d; /* type == 4 */
  52.   struct BSSRec b; /* type == 5 */
  53. } rdfheaderrec;
  54. typedef struct RDFFileInfo {
  55.   FILE *fp; /* file descriptor; must be open to use this struct */
  56.   int rdoff_ver; /* should be 1; any higher => not guaranteed to work */
  57.   long header_len;
  58.   long code_len;
  59.   long data_len;
  60.   long header_ofs; 
  61.   long code_ofs;
  62.   long data_ofs;
  63.   char *header_loc; /* keep location of header */
  64.   long header_fp; /* current location within header for reading */
  65.   char *name; /* name of module in libraries */
  66.   int  *refcount;       /* pointer to reference count on file, or NULL */
  67. } rdffile;
  68. #define BUF_BLOCK_LEN 4088              /* selected to match page size (4096)
  69.                                          * on 80x86 machines for efficiency */
  70. typedef struct memorybuffer {
  71.   int length;
  72.   char buffer[BUF_BLOCK_LEN];
  73.   struct memorybuffer *next;
  74. } memorybuffer;
  75. typedef memorybuffer rdf_headerbuf;
  76. /* segments used by RDOFF, understood by rdoffloadseg */
  77. #define RDOFF_CODE 0
  78. #define RDOFF_DATA 1
  79. #define RDOFF_HEADER -1
  80. /* mask for 'segment' in relocation records to find if relative relocation */
  81. #define RDOFF_RELATIVEMASK 64
  82. /* mask to find actual segment value in relocation records */
  83. #define RDOFF_SEGMENTMASK 63
  84. extern int rdf_errno;
  85. /* RDOFF file manipulation functions */
  86. int rdfopen(rdffile *f,const char *name);
  87. int rdfopenhere(rdffile *f, FILE *fp, int *refcount, char *name);
  88. int rdfclose(rdffile *f);
  89. int rdfloadseg(rdffile *f,int segment,void *buffer);
  90. rdfheaderrec *rdfgetheaderrec(rdffile *f);   /* returns static storage */
  91. void rdfheaderrewind(rdffile *f);      /* back to start of header */
  92. void rdfperror(const char *app,const char *name);
  93. /* functions to write a new RDOFF header to a file -
  94.    use rdfnewheader to allocate a header, rdfaddheader to add records to it,
  95.    rdfwriteheader to write 'RDOFF1', length of header, and the header itself
  96.    to a file, and then rdfdoneheader to dispose of the header */
  97. rdf_headerbuf *rdfnewheader(void);
  98. int rdfaddheader(rdf_headerbuf *h,rdfheaderrec *r);
  99. int rdfwriteheader(FILE *fp,rdf_headerbuf *h);
  100. void rdfdoneheader(rdf_headerbuf *h);
  101. #endif /* _RDOFF_H */