static int process_symbol_table (struct ar_hdr *hdr, FILE *fp) { long pos = ftell (fp); if (print_index) { char *buf, *po, *ps; int i; long nsym; printf ("Archive index:\n"); buf = (char *) malloc (hdr->ar_size); if (fread (buf, 1, hdr->ar_size, fp) != hdr->ar_size) { free (buf); return 0; } nsym = sgetl (buf); po = buf + 4; ps = po + nsym * 4; for (i = 0; i < nsym; ++i) { char *obj; offset = sgetl (po); po += 4; if (NULL == (obj = get_member_name_by_offset (fp, offset))) /* member name */ { free (buf); return 0; } printf ("%s in %s", ps, obj); if (verbose) printf (" at 0x%04x\n", offset); else putchar ('\n'); free (obj); ps += strlen(ps) + 1; } free (buf); fseek (fp, pos, SEEK_SET); putchar ('\n'); } /* skip the symbol table */ fseek (fp, pos + hdr->ar_size + (hdr->ar_size & 1), SEEK_SET); return 1; }
static int process_bsd_symbol_table (struct ar_hdr *hdr, FILE *fp) { long pos = ftell (fp); if (print_index) { char *buf, *po, *ps; int i; long tablesize; long nsym; printf ("Archive index:\n"); buf = (char *) malloc (hdr->ar_size); if (fread (buf, 1, hdr->ar_size, fp) != hdr->ar_size) { free (buf); return 0; } tablesize = sgetl (buf); nsym = tablesize / 8; po = buf + 4; ps = po + tablesize + 4; for (i = 0; i < nsym; ++i) { char *obj; long sym; sym = sgetl (po); po += 4; offset = sgetl (po); po += 4; printf ("%s in ", ps + sym); if (NULL == (obj = get_member_name_by_offset (fp, offset))) /* member name */ return 0; printf ("%s\n", obj); free (obj); } free (buf); putchar ('\n'); } /* skip the symbol table */ fseek (fp, pos + hdr->ar_size + (hdr->ar_size & 1), SEEK_SET); return 1; }