Annotation of researchv10no/cmd/reloc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * relocate command--
                      3:  * reloc file [-]octal [ - ]
                      4:  *
                      5:  * relocate object or a.out file up in core
                      6:  * by the possibly negated octal number.
                      7:  *
                      8:  * if optional 3rd arg is given,
                      9:  * replace "setd" at start by "nop"
                     10:  */
                     11: 
                     12: int    tbuf[256];
                     13: int    rbuf[256];
                     14: int    fin;
                     15: int    fout;
                     16: int    *txtp;
                     17: int    *relp;
                     18: long   relloc;
                     19: long   txtloc;
                     20: int    dotdot;
                     21: long   txtsiz;
                     22: unsigned       t1;
                     23: unsigned       t2;
                     24: unsigned       t4;
                     25: unsigned       t7;
                     26: int    txtw;
                     27: 
                     28: main(argc, argv)
                     29: char *argv[];
                     30: {
                     31:        int sign, c;
                     32: 
                     33:        if (argc<3) {
                     34:        usage:
                     35:                write(1, "reloc file [-]octal\n", 20);
                     36:                exit(1);
                     37:        }
                     38:        dotdot = 0;
                     39:        if (*argv[2] == '-') {
                     40:                sign = -1;
                     41:                argv[2]++;
                     42:        } else
                     43:                sign = 1;
                     44:        while (*argv[2]) {
                     45:                c = *argv[2]++ - '0';
                     46:                if (c<0 || c>7)
                     47:                        goto usage;
                     48:                dotdot = (dotdot<<3) + c;
                     49:        }
                     50:        dotdot *= sign;
                     51:        if ((fin = open(argv[1], 0)) < 0) {
                     52:                write(1, "File not readable\n", 18);
                     53:                exit(1);
                     54:        }
                     55:        if ((fout = open(argv[1], 1)) < 0) {
                     56:                write(1, "File not writable\n", 18);
                     57:                exit(1);
                     58:        }
                     59:        txtw = read(fin, (char *)tbuf, 512);
                     60:        if (tbuf[0]!=0411 && tbuf[0]!=0410 && tbuf[0]!=0407) {  /* magic */
                     61:                write(1, "Bad format\n", 11);
                     62:                exit(1);
                     63:        }
                     64:        if (tbuf[7] != 0) {             /* relocation? */
                     65:                write (1, "No relocation bits\n", 19);
                     66:                exit(1);
                     67:        }
                     68:        t1 = tbuf[1];
                     69:        t2 = tbuf[2];
                     70:        t4 = tbuf[4];
                     71:        txtloc = 020;
                     72:        if (argc>3 && argv[3][1]=='o') {
                     73:                dotdot += 020;
                     74:                tbuf[0] = 0405; /* old magic */
                     75:                tbuf[1] += tbuf[2];
                     76:                tbuf[2] = 0;
                     77:                tbuf[4] = tbuf[3];
                     78:                tbuf[3] = 0;
                     79:                tbuf[6] = 0240;
                     80:                tbuf[7] = t7 = 0240;
                     81:        }
                     82:        txtsiz = (unsigned)tbuf[1];
                     83:        txtsiz += (unsigned)tbuf[2];
                     84:        relloc = txtloc + txtsiz;
                     85:        txtsiz /= 2;
                     86:        lseek(fin, relloc & ~0777, 0);
                     87:        read(fin, (char *)rbuf, 512);
                     88:        txtp = &tbuf[8];
                     89:        relp = &rbuf[(relloc&0777) >> 1];
                     90:        if (argc>3)             /* nop out "setd" at start */
                     91:                if (tbuf[8] == 0170011)
                     92:                        tbuf[8] = 0240;
                     93:        while(txtsiz--) {
                     94:                switch (*relp & 017) {
                     95: 
                     96:                case 01:        /* pc ref to abs */
                     97:                        *txtp -= dotdot;
                     98:                        break;
                     99: 
                    100:                case 02:        /* ref to text */
                    101:                case 04:                /* ref to data */
                    102:                case 06:                /* ref to bss */
                    103:                        *txtp += dotdot;
                    104: 
                    105:                }
                    106:                advance();
                    107:        }
                    108:        if (txtp != &tbuf[0])
                    109:                write(fout, (char *)&tbuf[0], txtw);
                    110: 
                    111: 
                    112:        txtsiz = t4 / 2;
                    113:        relloc = 020;
                    114:        relloc += t1;
                    115:        relloc += t1;
                    116:        relloc += t2;
                    117:        relloc += t2;
                    118:        lseek(fin, relloc & ~0777, 0);
                    119:        lseek(fout, relloc & ~0777, 0);
                    120:        txtw = read(fin, (char *)tbuf, 512);
                    121:        txtp = &tbuf[(relloc&0777) >> 1] + 4;
                    122:        while((txtsiz -= 6) > 0) {
                    123:                switch(*txtp & 77) {
                    124: 
                    125:                case 2:
                    126:                case 3:
                    127:                case 4:
                    128:                        *(txtp + 1) += dotdot;
                    129:                }
                    130:                adv6();
                    131:        }
                    132:        if(txtp != &tbuf[0])
                    133:                write(fout, (char *)&tbuf[0], txtw);
                    134:        exit(0);
                    135: }
                    136: 
                    137: advance()
                    138: {
                    139:        
                    140:        relp++;
                    141:        relloc += 2;
                    142:        if (relp == &rbuf[256]) {
                    143:                lseek(fin, relloc, 0);
                    144:                read(fin, (char *)&rbuf[0], 512);
                    145:                relp = &rbuf[0];
                    146:        }
                    147:        txtp++;
                    148:        txtloc += 2;
                    149:        if (txtp >= &tbuf[256]) {
                    150:                write(fout, (char *)&tbuf[0], txtw);
                    151:                lseek(fin, txtloc, 0);
                    152:                txtw = read(fin, (char *)&tbuf[0], 512);
                    153:                txtp = &tbuf[0];
                    154:        }
                    155: }
                    156: 
                    157: adv6()
                    158: {
                    159:        txtp += 6;
                    160:        if(txtp >= &tbuf[256]) {
                    161:                write(fout, (char *)tbuf, txtw);
                    162:                txtw = read(fin, (char *)tbuf, 512);
                    163:                txtp -= 256;
                    164:        }
                    165: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.