|
|
1.1 ! root 1: /* ! 2: * General Loader-Binder ! 3: * ! 4: * Knows about FILE struct to the extent it is revealed in putc ! 5: * if BREADBOX is non-zero ! 6: * ! 7: */ ! 8: #include <stdio.h> ! 9: #ifdef GEMDOS ! 10: #include <stat.h> ! 11: #define DIRSIZ 14 ! 12: typedef unsigned long fsize_t; ! 13: #else ! 14: #include <sys/stat.h> ! 15: #include <sys/dir.h> ! 16: #endif ! 17: #include <mtype.h> ! 18: #include <coff.h> ! 19: #include <arcoff.h> ! 20: ! 21: #ifdef DEBUG ! 22: #define TRACE(x) printf("Trace %lx %s(%d)\n", x, __FILE__, __LINE__); ! 23: #define TRACES(x) printf("Trace %s %s(%d)\n", x, __FILE__, __LINE__); ! 24: #else ! 25: #define TRACE(x) ! 26: #define TRACES(x) ! 27: #endif ! 28: ! 29: typedef unsigned long uaddr_t; /* universal address type */ ! 30: ! 31: #define NLSEG 3 ! 32: ! 33: #define S_TEXT 0 ! 34: #define S_DATA 1 ! 35: #define S_BSSD 2 ! 36: ! 37: /* ! 38: * Macro to test for symbol equality. ! 39: */ ! 40: #define eq(s1,s2) ( strcmp( s1, s2) == 0 ) ! 41: ! 42: /* ! 43: * Segment descriptor ! 44: */ ! 45: typedef struct seg_s { ! 46: uaddr_t vbase; /* virtual address base */ ! 47: fsize_t daddr, /* seek addr of segment */ ! 48: size; /* size */ ! 49: long relptr; /* seek addr of rel records */ ! 50: long nreloc; /* number of relocation records */ ! 51: } seg_t; ! 52: ! 53: /* ! 54: * Symbol descriptor ! 55: */ ! 56: typedef struct sym_t { ! 57: struct sym_t *next; /* chained together */ ! 58: struct mod_t *mod; /* pass 1; defining module */ ! 59: unsigned int symno; /* pass 2; symbol number */ ! 60: char sclass; /* storage class */ ! 61: char scnum; /* section number */ ! 62: long value; /* value of symbol */ ! 63: char name[1]; /* symbol id */ ! 64: } sym_t; ! 65: ! 66: /* ! 67: * Descriptor for each input module ! 68: */ ! 69: typedef struct mod_t { ! 70: struct mod_t *next; /* chained together */ ! 71: char *fname; /* file containing module */ ! 72: char mname[DIRSIZ]; /* module name if in archive */ ! 73: seg_t seg[NLSEG]; /* descriptor for each segment */ ! 74: uaddr_t symptr; /* location of symbol table */ ! 75: unsigned int nsym; /* #symbols for this module */ ! 76: sym_t *sym[]; /* array of nsym symbol ptrs */ ! 77: } mod_t; ! 78: ! 79: /* ! 80: * Command line flag option ! 81: */ ! 82: typedef char flag_t; ! 83: ! 84: /* ! 85: * Structures built in pass 1, used in pass 2 ! 86: */ ! 87: #define NHASH 64 ! 88: ! 89: /* ! 90: * Seconds between ranlib update and archive modify times ! 91: */ ! 92: #define SLOPTIME 150 ! 93: ! 94: /* ! 95: * Values for worder ! 96: */ ! 97: #define LOHI 0 ! 98: #define HILO 1 ! 99: ! 100: /* ! 101: * For pass 2; these will change if format of relocation changed ! 102: */ ! 103: #define getaddr getlohi ! 104: #define putaddr(addr, fp, sgp) putlohi((short)(addr), fp, sgp) ! 105: #define getsymno getlohi ! 106: #define putsymno putlohi ! 107: ! 108: /* ! 109: * C requires this... ! 110: */ ! 111: void setbase(), endbind(), undef(); ! 112: uaddr_t newpage(), lentry(); ! 113: fsize_t segoffs(), baseall(); ! 114: void symredef(), rdsystem(); ! 115: sym_t *addsym(), *symref(), *newsym(); ! 116: fsize_t symoff(); ! 117: void loadmod(); ! 118: unsigned short getword(), getlohi(), gethilo(), hash(); ! 119: void message(), fatal(), usage(), filemsg(), modmsg(), mpmsg(), spmsg(); ! 120: void mpfatal(); ! 121: void putlong(); ! 122: unsigned long getlong(); ! 123: ! 124: /* ! 125: * Start variables & constants ! 126: */ ! 127: ! 128: extern sym_t * symtable[NHASH]; /* hashed symbol table */ ! 129: extern mod_t * modhead, *modtail; /* module list head and tail */ ! 130: extern sym_t * etext_s,*edata_s,*end_s;/* special loader generated symbols */ ! 131: extern char etext_id[SYMNMLEN], /* and their names */ ! 132: edata_id[SYMNMLEN], ! 133: end_id[SYMNMLEN]; ! 134: ! 135: extern FILEHDR fileh; /* output load file headers */ ! 136: extern AOUTHDR aouth; ! 137: extern SCNHDR secth[NLSEG]; ! 138: ! 139: extern char *mchname[]; /* names of known machines */ ! 140: extern uaddr_t segsize[], /* size of segment on target machine */ ! 141: drvbase[], /* base of loadable driver */ ! 142: drvtop[]; /* address limit of loadable driver */ ! 143: ! 144: extern flag_t noilcl, /* discard internal symbols `L...' */ ! 145: nolcl, /* discard local symbols */ ! 146: watch, /* watch everything happen */ ! 147: worder, /* byte order in word; depends on machine */ ! 148: comflag, /* don't flag coff of diff size */ ! 149: reloc, /* write reloc symbols */ ! 150: dcomm; /* define commons even if reloc out */ ! 151: ! 152: extern int errCount; /* Errors detected here */ ! 153: /* ! 154: * Structures associated with storage economy ! 155: */ ! 156: extern mod_t *mtemp; /* only one module in core at a time */ ! 157: extern FILE *mfp; /* temp file for module structures */ ! 158: extern int mdisk, /* flag <>0 means module struct to disk */ ! 159: nmod, /* module count */ ! 160: mxmsym; /* max # of symbols ref'd by 1 module */ ! 161: ! 162: extern mod_t *modhead, *modtail; /* module list head and tail */ ! 163: extern seg_t oseg[NLSEG]; /* output segment descriptors */ ! 164: extern int nundef; /* number of undefined symbols */ ! 165: extern uaddr_t comnb; /* byte aligned commons */ ! 166: extern uaddr_t comns; /* short aligned commons */ ! 167: extern uaddr_t comnl; /* long aligned commons */ ! 168: ! 169: extern char *outbuf; /* buffer for in-memory load */ ! 170: extern FILE *outputf[NLSEG]; /* output ptrs (for each segment) */ ! 171: extern FILE *outputr[NLSEG]; /* reloc output ptrs (for each segment) */ ! 172: ! 173: extern char *alloc(); /* malloc or die */ ! 174: /* ! 175: * Kludge for maximum size of a loadable data segment ! 176: * for the 8086, used in both fixstack and ld ! 177: */ ! 178: ! 179: #define MAXSEG86 0x10000L /* Maximum Segment Size */ ! 180: #define DEFSTACK 0x1000 /* Initial Stack Size by Kernel */ ! 181: #define WARNSIZE 0x1000 /* Warning Tolerance Distance */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.