/* * read an archive file, * processing the symbols for each intermediate file in it. */ void doar(Biobuf *bp) { int offset, size, obj; char membername[SARNAME]; multifile = 1; for (offset = Boffset(bp);;offset += size) { size = nextar(bp, offset, membername); if (size < 0) { error("phase error on ar header %ld", offset); return; } if (size == 0) return; if (strcmp(membername, symname) == 0) continue; obj = objtype(bp, 0); if (obj < 0) { error("inconsistent file %s in %s", membername, filename); return; } if (!readar(bp, obj, offset+size, 1)) { error("invalid symbol reference in file %s", membername); return; } filename = membername; nsym=0; objtraverse(psym, 0); printsyms(symptr, nsym); } }
static void doar(Biobuf *bp, char *file) { int offset, size, obj; char membername[SARNAME]; char symname[]="__.SYMDEF"; /* table of contents file name */ for (offset = Boffset(bp);;offset += size) { size = nextar(bp, offset, membername); if (size < 0) { fprint(2, "%s: phase error on ar header %ld", file, offset); return; } if (size == 0) return; if (strcmp(membername, symname) == 0) continue; obj = objtype(bp, 0); if (obj < 0) { fprint(2, "%s: %s inconsistent file", file, membername); return; } if (!readar(bp, obj, offset+size, 1)) { fprint(2, "%s: %s invalid symbol reference in file", file, membername); return; } objtraverse(addfunc, 0); } }
/* * process symbols in a file */ void dofile(Biobuf *bp) { int obj; obj = objtype(bp, 0); if (obj < 0) execsyms(Bfildes(bp)); else if (readobj(bp, obj)) { nsym = 0; objtraverse(psym, 0); printsyms(symptr, nsym); } }
/* * extract the symbol references from an object file */ void scanobj(Biobuf *b, Arfile *ap, int size) { int obj; long offset; Dir *d; static int lastobj = -1; if (!allobj) /* non-object file encountered */ return; offset = Boffset(b); obj = objtype(b, 0); if (obj < 0) { /* not an object file */ allobj = 0; d = dirfstat(Bfildes(b)); if (d != nil && d->length == 0) fprint(2, "ar: zero length file %s\n", file); free(d); Bseek(b, offset, 0); return; } if (lastobj >= 0 && obj != lastobj) { fprint(2, "ar: inconsistent object file %s\n", file); allobj = 0; Bseek(b, offset, 0); return; } lastobj = obj; if (!readar(b, obj, offset+size, 0)) { fprint(2, "ar: invalid symbol reference in file %s\n", file); allobj = 0; Bseek(b, offset, 0); return; } Bseek(b, offset, 0); objtraverse(objsym, ap); }