|
|
1.1 ! root 1: /* ! 2: * ld/data.c ! 3: * General Loader-Binder ! 4: * ! 5: * Knows about FILE struct to the extent it is revealed in putc ! 6: * if BREADBOX is non-zero ! 7: */ ! 8: ! 9: #include "data.h" ! 10: ! 11: /* ! 12: * Start variables & constants ! 13: */ ! 14: ! 15: sym_t *symtable[NHASH]; /* hashed symbol table */ ! 16: mod_t *modhead, *modtail; /* module list head and tail */ ! 17: seg_t oseg[NLSEG]; /* output segment descriptors */ ! 18: int nundef; /* number of undefined symbols */ ! 19: uaddr_t comnb; /* byte aligned commons */ ! 20: uaddr_t comns; /* short aligned commons */ ! 21: uaddr_t comnl; /* long aligned commons */ ! 22: sym_t *etext_s, *edata_s, *end_s; /* special loader generated symbols */ ! 23: char etext_id[SYMNMLEN] = "etext", /* and their names */ ! 24: edata_id[SYMNMLEN] = "edata", ! 25: end_id[SYMNMLEN] = "end"; ! 26: ! 27: FILEHDR fileh /* output load file header */ ! 28: = { C_386_MAGIC }; ! 29: AOUTHDR aouth; ! 30: SCNHDR secth[NLSEG]; ! 31: ! 32: char *mchname[] /* names of known machines */ ! 33: = { "Turing Machine", ! 34: "PDP-11", ! 35: "VAX-11", ! 36: "3sickly", ! 37: "Z8001", ! 38: "Z8002", ! 39: "iAPX 86", ! 40: "i8080", ! 41: "6800", ! 42: "6809", ! 43: "68000", ! 44: "80386", ! 45: "68020" ! 46: }; ! 47: uaddr_t segsize[] /* size of segment on target machine */ ! 48: = { 0, ! 49: 8192, ! 50: 512, ! 51: 2048, ! 52: 0, ! 53: 512, ! 54: 16, ! 55: 0, ! 56: 0, ! 57: 0, ! 58: 0, ! 59: 16, ! 60: 0 ! 61: }, ! 62: drvbase[] /* base of loadable driver */ ! 63: = { 0, ! 64: 0120000, ! 65: 0, ! 66: 0, ! 67: 0, ! 68: 0xD000, ! 69: 0xD000, ! 70: 0, ! 71: 0, ! 72: 0, ! 73: 0, ! 74: 0xFFC00000L, ! 75: 0 ! 76: }, ! 77: drvtop[] /* address limit of loadable driver */ ! 78: = { 0, ! 79: 0140000, ! 80: 0, ! 81: 0, ! 82: 0, ! 83: 0xF000, ! 84: 0xF000, ! 85: 0, ! 86: 0, ! 87: 0, ! 88: 0, ! 89: 0xFFFFFFFFL, ! 90: 0 ! 91: }; ! 92: flag_t noilcl, /* discard internal symbols `L...' */ ! 93: nolcl, /* discard local symbols */ ! 94: watch, /* watch everything happen */ ! 95: worder, /* byte order in word; depends on machine */ ! 96: comflag, /* don't flag comm of diff size */ ! 97: reloc, /* write reloc symbols */ ! 98: dcomm; /* define commons even if reloc out */ ! 99: ! 100: int errCount; /* Count of errors */ ! 101: char *outbuf; /* buffer for in-memory load */ ! 102: FILE *outputf[NLSEG]; /* output ptrs (for each segment) */ ! 103: FILE *outputr[NLSEG]; /* output pointerf for relocation */ ! 104: /* ! 105: * Structures associated with storage economy ! 106: */ ! 107: mod_t *mtemp; /* only one module in core at a time */ ! 108: FILE *mfp; /* temp file for module structures */ ! 109: int mdisk, /* flag <>0 means module struct to disk */ ! 110: nmod, /* module count */ ! 111: mxmsym; /* max # of symbols ref'd by 1 module */ ! 112: ! 113: /* ! 114: * Seconds between ranlib update and archive modify times ! 115: */ ! 116: #define SLOPTIME 150 ! 117: ! 118: /* values for worder */ ! 119: #define LOHI 0 ! 120: #define HILO 1 ! 121: ! 122: /* ! 123: * For pass 2; these will change if format of relocation changed ! 124: */ ! 125: #define getaddr getlohi ! 126: #define putaddr(addr, fp, sgp) putlohi((short)(addr), fp, sgp) ! 127: #define getsymno getlohi ! 128: #define putsymno putlohi ! 129: ! 130: /* ! 131: * C requires this... ! 132: */ ! 133: void setbase(), endbind(), undef(); ! 134: uaddr_t newpage(), lentry(); ! 135: void symredef(), rdsystem(); ! 136: sym_t *addsym(), *symref(), *newsym(); ! 137: fsize_t symoff(), baseall(); ! 138: void loadmod(); ! 139: unsigned short getword(), getlohi(), gethilo(); ! 140: void message(), fatal(), usage(), filemsg(), modmsg(), mpmsg(), spmsg();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.