|
|
1.1 root 1: /* reloc for 5620's */
2:
3: #include "stdio.h"
4: #include "filehdr.h"
5: #include "aouthdr.h"
6: #include "reloc.h"
7: #include "scnhdr.h"
8: #include "sys/types.h"
9: #include "sys/stat.h"
10: extern char *malloc();
11:
12: int textorg;
13: struct stat stb;
14: char *buf;
15: struct scnhdr *ts, *ds, *bs;
16: struct filehdr *fhdr;
17: long swapb4();
18:
19: #ifdef TEST
20: #define DEBUG(X,Y) printf(X,Y)
21: #else
22: #define DEBUG(X,Y)
23: #endif
24:
25: main(argc, argv)
26: char **argv;
27: { int fd;
28: struct aouthdr *ahdr;
29: if(argc != 4) {
30: fprintf(stderr, "usage: %s -b addr file\n",argv[0]);
31: exit(1);
32: }
33: sscanf(argv[2], "%x", &textorg);
34: fd = open(argv[3], 0);
35: if(fd < 0) {
36: perror(argv[3]);
37: exit(1);
38: }
39: fstat(fd, &stb);
40: if(stb.st_size <= sizeof(struct filehdr)) {
41: perror("stdin");
42: exit(1);
43: }
44: buf = malloc(stb.st_size);
45: if(read(fd, buf, stb.st_size) != stb.st_size) {
46: perror("read");
47: exit(1);
48: }
49: fhdr = (struct filehdr *) buf;
50: if(fhdr->f_magic != FBOMAGIC) {
51: fprintf(stderr, "reloc: file magic was 0%o expected 0%o\n",
52: fhdr->f_magic, FBOMAGIC);
53: exit(1);
54: }
55: if(fhdr->f_nscns != 3) {
56: fprintf(stderr, "reloc: file has %d sections instead of 3\n",
57: fhdr->f_nscns);
58: exit(1);
59: }
60:
61: ts = (struct scnhdr *) (buf + sizeof(struct filehdr) + fhdr->f_opthdr);
62: ds = ts + 1; /* is this arithmetic ok? */
63: bs = ds + 1;
64: reloc(ts);
65: reloc(ds);
66: reloc(bs);
67: fhdr->f_flags |= F_RELFLG;
68:
69: ahdr = (struct aouthdr *) (buf + sizeof(struct filehdr));
70: ahdr->entry += textorg;
71: ahdr->text_start += textorg;
72: ahdr->data_start += textorg;
73: ahdr->vstamp = 0;
74: fhdr->f_symptr = fhdr->f_nsyms = 0;
75: write(1, buf, stb.st_size);
76: exit(0);
77: }
78:
79: reloc(sp, org)
80: struct scnhdr *sp;
81: { struct reloc *rp, *realrp, copyarea;
82: int i, j;
83: int space;
84: unsigned int addr;
85: struct syment *sym;
86: unsigned char *from, *to, *foo, *saveto;
87: realrp = (struct reloc *) (buf + sp->s_relptr);
88: rp = ©area;
89: memcpy(rp, realrp, RELSZ);
90: for(i = 0; i < sp->s_nreloc; i++) {
91: switch(rp->r_type) {
92: default:
93: fprintf(stderr, "reloc type 0%o unknown\n", rp->r_type);
94: exit(1);
95: case R_DIR32:
96: DEBUG(" R_DIR32 (%d)",rp->r_type);
97: to = (unsigned char *) (buf + sp->s_scnptr + rp->r_vaddr - sp->s_vaddr);
98: #ifdef old
99: /* swap bytes on the way in... */
100: addr = to[0];
101: for(j = 1; j<=3; j++)
102: addr = (addr << 8) | to[j];
103: addr += textorg;
104: /* swap bytes on the way out... */
105: from = (unsigned char *)&addr;
106: for(j = 0; j < 4; j++)
107: *to++ = from[3-j];
108: break;
109: #endif
110: DEBUG(" to=%x, ",*to);
111: #ifdef vax
112: from = (unsigned char *) &space;
113: saveto = to;
114: for(j = 3; j >= 0 ; j--)
115: *from++ = to[j];
116: space += textorg;
117: from = (unsigned char *) &space;
118: to = saveto;
119: for(j = 3; j >= 0 ; j--)
120: to[j] = *from++;
121: #else
122: from = (char *) &space;
123: saveto = to;
124: for(j = 0; j < 4; j++)
125: *from++ = to[j];
126: space += textorg;
127: from = (char *) &space;
128: to = saveto;
129: for(j = 0; j < 4; j++)
130: to[j] = *from++;
131: #endif vax
132: DEBUG("space=%x\n",space);
133: break;
134:
135: case R_DIR32S:
136: DEBUG(" R_DIR32S (%d)",rp->r_type);
137: to = (unsigned char *) (buf + sp->s_scnptr + rp->r_vaddr - sp->s_vaddr);
138: #ifdef wannadoitfastonavax
139: /* alignment and byte order? */ /* vax byte order */
140: addr = *(int *)to;
141: /* addr += textorg; */
142: addr = swapb4( swapb4(addr,1) + textorg, 1);
143: *(int *)to = addr;
144: #endif
145: DEBUG(" to=%x, ",*to);
146: #ifdef vax
147: from = (unsigned char *) &space;
148: saveto = to;
149: for(j = 0; j < 4; j++)
150: *from++ = to[j];
151: space += textorg;
152: from = (unsigned char *) &space;
153: to = saveto;
154: for(j = 0; j < 4; j++)
155: to[j] = *from++;
156: #else
157: from = (char *) &space;
158: saveto = to;
159: for(j = 3; j >= 0 ; j--)
160: *from++ = to[j];
161: space += textorg;
162: from = (char *) &space;
163: to = saveto;
164: for(j = 3; j >= 0 ; j--)
165: to[j] = *from++;
166: #endif
167: DEBUG("space=%x\n",space);
168: }
169: /* Alignment needed for (structure) pointers on some hosts */
170: realrp = (struct reloc *) ((char *)realrp + RELSZ);
171: memcpy(rp, realrp, RELSZ);
172: }
173: sp->s_vaddr += textorg;
174: sp->s_paddr += textorg;
175: sp->s_relptr = sp->s_lnnoptr = 0;
176: sp->s_nreloc = sp->s_nlnno = 0;
177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.