Annotation of 43BSD/ucb/symorder.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)symorder.c 5.2 (Berkeley) 7/2/85";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * symorder - reorder symbol table
                     19:  */
                     20: 
                     21: #include <stdio.h>
                     22: #include <sys/types.h>
                     23: #include <sys/stat.h>
                     24: #include <a.out.h>
                     25: 
                     26: #define SPACE 100
                     27: 
                     28: struct nlist order[SPACE];
                     29: 
                     30: char   *savestr(), *index(), *malloc();
                     31: struct exec exec;
                     32: off_t  sa;
                     33: struct stat stb;
                     34: int    nsym = 0;
                     35: int    symfound = 0;
                     36: char   *strings;
                     37: char   *newstrings;
                     38: struct nlist *symtab;
                     39: struct nlist *newtab;
                     40: int    symsize;
                     41: char   asym[BUFSIZ];
                     42: 
                     43: main(argc, argv)
                     44:        char **argv;
                     45: {
                     46:        register char *ns;
                     47:        register struct nlist *symp;
                     48:        register struct nlist *p;
                     49:        register FILE *f;
                     50:        register int i;
                     51:        int n, o;
                     52: 
                     53:        if (argc != 3) {
                     54:                fprintf(stderr, "Usage: symorder orderlist file\n");
                     55:                exit(1);
                     56:        }
                     57:        if ((f = fopen(argv[1], "r")) == NULL) {
                     58:                perror(argv[1]);
                     59:                exit(1);
                     60:        }
                     61:        for (p = order; fgets(asym, sizeof asym, f) != NULL; p++, nsym++) {
                     62:                for (i = 0; asym[i] && asym[i] != '\n'; i++)
                     63:                        continue;
                     64:                if (asym[i] == '\n')
                     65:                        asym[i] = 0;
                     66:                p->n_un.n_name = savestr(asym);
                     67:        }
                     68:        fclose(f);
                     69:        if ((f = fopen(argv[2], "r")) == NULL)
                     70:                perror(argv[2]), exit(1);
                     71:        if ((o = open(argv[2], 1)) < 0)
                     72:                perror(argv[2]), exit(1);
                     73:        if ((fread(&exec, sizeof exec, 1, f)) != 1 || N_BADMAG(exec)) {
                     74:                fprintf(stderr, "symorder: %s: bad format\n", argv[2]);
                     75:                exit(1);
                     76:        }
                     77:        if (exec.a_syms == 0) {
                     78:                fprintf(stderr, "symorder: %s is stripped\n", argv[2]);
                     79:                exit(1);
                     80:        }
                     81:        fstat(fileno(f), &stb);
                     82:        if (stb.st_size < N_STROFF(exec)+sizeof(off_t)) {
                     83:                fprintf(stderr, "symorder: %s is in old format or truncated\n",
                     84:                    argv[2]);
                     85:                exit(1);
                     86:        }
                     87:        sa = N_SYMOFF(exec);
                     88:        fseek(f, sa, 0);
                     89:        n = exec.a_syms;
                     90:        symtab = (struct nlist *)malloc(n);
                     91:        if (symtab == (struct nlist *)0) {
                     92:                fprintf(stderr, "symorder: Out of core, no space for symtab\n");
                     93:                exit(1);
                     94:        }
                     95:        if (fread((char *)symtab, 1, n, f) != n) {
                     96:                fprintf(stderr, "symorder: Short file "); perror(argv[2]);
                     97:                exit(1);
                     98:        }
                     99:        if (fread((char *)&symsize, sizeof (int), 1, f) != 1 ||
                    100:            symsize <= 0) {
                    101:                fprintf(stderr, "symorder: No strings "); perror(argv[2]);
                    102:                exit(1);
                    103:        }
                    104:        strings = malloc(symsize);
                    105:        if (strings == (char *)0) {
                    106:                fprintf(stderr,"symorder: Out of core, no space for strings\n");
                    107:                exit(1);
                    108:        }
                    109:        /*
                    110:         * Need to subtract four from symsize here since
                    111:         * symsize includes itself, and we've already read
                    112:         * it.  (6/30/85 chris@maryland)
                    113:         */
                    114:        if (fread(strings, 1, symsize - 4, f) != symsize - 4) {
                    115:                fprintf(stderr, "symorder: Truncated strings "); 
                    116:                perror(argv[2]);
                    117:                exit(1);
                    118:        }
                    119: 
                    120:        newtab = (struct nlist *)malloc(n);
                    121:        if (newtab == (struct nlist *)0) {
                    122:                fprintf(stderr,
                    123:                    "symorder: Out of core, no space for new symtab\n");
                    124:                exit(1);
                    125:        }
                    126:        i = n / sizeof (struct nlist);
                    127:        reorder(symtab, newtab, i);
                    128:        free((char *)symtab);
                    129:        symtab = newtab;
                    130: 
                    131:        newstrings = malloc(symsize);
                    132:        if (newstrings == (char *)0) {
                    133:                fprintf(stderr,
                    134:                    "symorder: Out of core, no space for newstrings\n");
                    135:                exit(1);
                    136:        }
                    137:        ns = newstrings;
                    138:        for (symp = symtab; --i >= 0; symp++) {
                    139:                if (symp->n_un.n_strx == 0)
                    140:                        continue;
                    141:                symp->n_un.n_strx -= sizeof (int);
                    142:                if ((unsigned)symp->n_un.n_strx >= symsize) {
                    143:                        fprintf(stderr,"symorder: Corrupted string pointers\n");
                    144:                        exit(1);
                    145:                }
                    146:                strcpy(ns, &strings[symp->n_un.n_strx]);
                    147:                symp->n_un.n_strx = (ns - newstrings) + sizeof (int);
                    148:                ns = index(ns, 0) + 1;
                    149:                if (ns > &newstrings[symsize]) {
                    150:                        fprintf(stderr, "symorder: Strings grew longer!\n");
                    151:                        exit(1);
                    152:                }
                    153:        }
                    154: 
                    155:        lseek(o, sa, 0);
                    156:        if (write(o, (char *)symtab, n) != n) {
                    157:                fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
                    158:                exit(1);
                    159:        }
                    160:        if (write(o, (char *)&symsize, sizeof (int)) != sizeof (int)) {
                    161:                fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
                    162:                exit(1);
                    163:        }
                    164:        if (write(o, newstrings, symsize - 4) != symsize - 4) {
                    165:                fprintf(stderr, "symorder: Write failed "); perror(argv[2]);
                    166:                exit(1);
                    167:        }
                    168:        if ((i = nsym - symfound) > 0) {
                    169:                fprintf(stderr, "symorder: %d symbol%s not found:\n",
                    170:                    i, i == 1 ? "" : "s");
                    171:                for (i = 0; i < nsym; i++) {
                    172:                        if (order[i].n_value == 0)
                    173:                                printf("%s\n", order[i].n_un.n_name);
                    174:                }
                    175:        }
                    176:        exit(0);
                    177: }
                    178: 
                    179: reorder(st1, st2, n)
                    180:        register struct nlist *st1, *st2;
                    181:        register n;
                    182: {
                    183:        register struct nlist *stp = st2 + nsym;
                    184:        register i;
                    185: 
                    186:        while (--n >= 0) {
                    187:                i = inlist(st1);
                    188:                if (i == -1)
                    189:                        *stp++ = *st1++;
                    190:                else
                    191:                        st2[i] = *st1++;
                    192:        }
                    193: }
                    194: 
                    195: inlist(p)
                    196:        register struct nlist *p;
                    197: {
                    198:        register char *nam;
                    199:        register struct nlist *op;
                    200: 
                    201:        if (p->n_type & N_STAB)
                    202:                return (-1);
                    203:        if (p->n_un.n_strx == 0)
                    204:                return (-1);
                    205: 
                    206:        nam = &strings[p->n_un.n_strx - sizeof(int)];
                    207:        if (nam >= &strings[symsize]) {
                    208:                fprintf(stderr, "symorder: corrupt symtab\n");
                    209:                exit(1);
                    210:        }
                    211: 
                    212:        for (op = &order[nsym]; --op >= order; ) {
                    213:                if (strcmp(op->n_un.n_name, nam) != 0)
                    214:                        continue;
                    215:                if (op->n_value == 0) {
                    216:                        op->n_value++;
                    217:                        symfound++;
                    218:                }
                    219:                return (op - order);
                    220:        }
                    221:        return (-1);
                    222: }
                    223: 
                    224: #define        NSAVETAB        4096
                    225: char   *savetab;
                    226: int    saveleft;
                    227: 
                    228: char *
                    229: savestr(cp)
                    230:        register char *cp;
                    231: {
                    232:        register int len;
                    233: 
                    234:        len = strlen(cp) + 1;
                    235:        if (len > saveleft) {
                    236:                saveleft = NSAVETAB;
                    237:                if (len > saveleft)
                    238:                        saveleft = len;
                    239:                savetab = (char *)malloc(saveleft);
                    240:                if (savetab == 0) {
                    241:                        fprintf(stderr,
                    242:                            "symorder: ran out of memory (savestr)\n");
                    243:                        exit(1);
                    244:                }
                    245:        }
                    246:        strncpy(savetab, cp, len);
                    247:        cp = savetab;
                    248:        savetab += len;
                    249:        saveleft -= len;
                    250:        return (cp);
                    251: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.