/* * get the symbol table from an executable file, if it has one */ void execsyms(int fd) { Fhdr f; Sym *s; long n; seek(fd, 0, 0); if (crackhdr(fd, &f) == 0) { error("Can't read header for %s", filename); return; } if (syminit(fd, &f) < 0) return; s = symbase(&n); nsym = 0; while(n--) psym(s++, 0); printsyms(symptr, nsym); }
/* * read an archive file, * processing the symbols for each intermediate file in it. */ void doar(Biobuf *bp) { int offset, size, obj; char name[SARNAME]; multifile = 1; for (offset = Boffset(bp);;offset += size) { size = nextar(bp, offset, name); if (size < 0) { error("phase error on ar header %d", offset); return; } if (size == 0) return; if (strcmp(name, symname) == 0) continue; obj = objtype(bp, 0); if (obj < 0) { // perhaps foreign object if(strlen(name) > 2 && strcmp(name+strlen(name)-2, ".o") == 0) return; error("inconsistent file %s in %s", name, filename); return; } if (!readar(bp, obj, offset+size, 1)) { error("invalid symbol reference in file %s", name); return; } filename = name; nsym=0; objtraverse(psym, 0); printsyms(symptr, nsym); } }