Annotation of 43BSDReno/pgrm/symorder/symorder.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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