2 * Pre-resolve references inside an object file.
3 * Mark such functions static so that linking with
4 * other object files can't get at them.
10 #include "/sys/src/cmd/8c/8.out.h"
12 typedef struct Sym Sym;
22 typedef struct Obj Obj;
49 Sym *lookup(char*, int);
51 void walkobj(Obj*, void (*fn)(int, Sym*, uchar*, int));
52 void walkobjs(void (*fn)(int, Sym*, uchar*, int));
53 void dump(int, Sym*, uchar*, int);
54 void nop(int, Sym*, uchar*, int);
55 void owrite(int, Sym*, uchar*, int);
56 int zaddr(uchar*, Sym**);
57 void renamesyms(int, Sym*, uchar*, int);
62 fprint(2, "usage: 8prefix [-mv] prefix file.8...\n");
67 main(int argc, char **argv)
91 obj = emalloc(nobj*sizeof obj[0]);
93 obj[i] = openobj(argv[i]);
95 walkobjs(nop); /* initialize symbol table */
100 for(i=0; i<nobj; i++){
103 Binit(&bout, o->fd, OWRITE);
111 renamesyms(int op, Sym *sym, uchar*, int)
113 if(sym && sym->version==0 && !sym->newname)
119 if(!renamemain && strcmp(sym->name, "main") == 0)
121 sym->newname = smprint("%s%s", prefix, sym->name);
127 dump(int op, Sym *sym, uchar*, int)
129 if(sym && sym->version==0)
135 print("%s\n", sym->name);
141 nop(int, Sym*, uchar*, int)
146 owrite(int op, Sym *sym, uchar *p, int l)
156 Bwrite(&bout, sym->newname, strlen(sym->newname)+1);
166 zaddr(uchar *p, Sym **symp)
183 else if(t & T_SCONST)
197 sysfatal("out of memory");
202 lookup(char *symb, int v)
210 for(p=symb; c = *p; p++)
216 for(s = hash[h]; s != nil; s = s->link)
218 if(memcmp(s->name, symb, l) == 0)
221 s = emalloc(sizeof *s);
222 s->name = emalloc(l + 1);
223 memmove(s->name, symb, l);
239 obj = emalloc(sizeof *obj);
241 obj->version = version++;
242 if((obj->fd = open(name, ORDWR)) < 0)
243 sysfatal("open %s: %r", name);
244 if((d = dirfstat(obj->fd)) == nil)
245 sysfatal("dirfstat: %r");
246 obj->bp = emalloc(d->length);
247 if(readn(obj->fd, obj->bp, d->length) != d->length)
248 sysfatal("read %s: %r", name);
249 obj->ep = obj->bp+d->length;
254 walkobjs(void (*fn)(int, Sym*, uchar*, int))
258 for(i=0; i<nobj; i++)
263 walkobj(Obj *obj, void (*fn)(int, Sym*, uchar*, int))
269 for(p=obj->bp; p+4<=obj->ep; ){
270 op = p[0] | (p[1]<<8);
271 if(op <= AXXX || op >= ALAST)
272 sysfatal("%s: opcode out of range - probably not a .8 file", obj->name);
279 sym = lookup((char*)p+4, type==D_STATIC ? obj->version : 0);
281 p += 4+strlen(sym->name)+1;
282 fn(op, sym, p0, p-p0);
289 fn(op, sym, p0, p-p0);