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

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)symorder.c  4.4 (Berkeley) 7/2/83";
                      3: #endif
                      4: /*
                      5:  * symorder - reorder symbol table
                      6:  */
                      7: #include <stdio.h>
                      8: #include <sys/types.h>
                      9: #include <sys/stat.h>
                     10: #include <a.out.h>
                     11: 
                     12: #define SPACE 100
                     13: 
                     14: struct nlist order[SPACE];
                     15: 
                     16: char   *savestr();
                     17: struct nlist nl1, nl2;
                     18: struct exec exec;
                     19: FILE   *strf;
                     20: off_t  sa, ss;
                     21: struct stat stb;
                     22: int    nsym = 0;
                     23: int    symfound = 0;
                     24: char   asym[BUFSIZ];
                     25: 
                     26: main(argc, argv)
                     27:        char **argv;
                     28: {
                     29:        register struct nlist *p, *q;
                     30:        register FILE *f;
                     31:        register int na, i, j;
                     32:        int maxlen;
                     33:        int n, o;
                     34: 
                     35:        if(argc != 3) {
                     36:                fprintf(stderr, "Usage: symorder orderlist file\n");
                     37:                exit(1);
                     38:        }
                     39:        if((f = fopen(argv[1], "r")) == NULL) {
                     40:                perror(argv[1]);
                     41:                exit(1);
                     42:        }
                     43:        maxlen = 0;
                     44:        for(p = order; fgets(asym, sizeof asym, f) != NULL; p++, nsym++) {
                     45:                for(i = 0; asym[i] && asym[i] != '\n'; i++)
                     46:                        continue;
                     47:                if (asym[i] == '\n')
                     48:                        asym[i] = 0;
                     49:                p->n_un.n_name = savestr(asym);
                     50:                if (maxlen < strlen(p->n_un.n_name))
                     51:                        maxlen = strlen(p->n_un.n_name);
                     52:        }
                     53:        fclose(f);
                     54:        if((f = fopen(argv[2], "r")) == NULL)
                     55:                perror(argv[2]), exit(1);
                     56:        if((strf = fopen(argv[2], "r")) == NULL)
                     57:                perror(argv[2]), exit(1);
                     58:        if((o = open(argv[2], 1)) < 0)
                     59:                perror(argv[2]), exit(1);
                     60:        if((fread(&exec, sizeof exec, 1, f)) != 1 || N_BADMAG(exec)) {
                     61:                fprintf(stderr, "symorder: %s: bad format\n", argv[2]);
                     62:                exit(1);
                     63:        }
                     64:        if (exec.a_syms == 0) {
                     65:                fprintf(stderr, "symorder: %s is stripped\n", argv[2]);
                     66:                exit(1);
                     67:        }
                     68:        fstat(fileno(f), &stb);
                     69:        if (stb.st_size < N_STROFF(exec)+sizeof(off_t)) {
                     70:                fprintf(stderr, "symorder: %s is in old format or truncated\n", argv[2]);
                     71:                exit(1);
                     72:        }
                     73:        sa = N_SYMOFF(exec);
                     74:        na = sa;
                     75:        ss = sa + exec.a_syms;
                     76:        fseek(f, sa, 0);
                     77:        n = exec.a_syms;
                     78:        while(n && symfound < nsym) {
                     79:                if(fread(&nl1, sizeof nl1, 1, f) != 1) {
                     80:                        fprintf(stderr, "Short file "); perror(argv[2]);
                     81:                        exit(1);
                     82:                }
                     83:                na += sizeof nl1;
                     84:                n -= sizeof nl1;
                     85:                if (nl1.n_un.n_strx == 0 || nl1.n_type & N_STAB)
                     86:                        continue;
                     87:                fseek(strf, ss+nl1.n_un.n_strx, 0);
                     88:                fread(asym, maxlen+1, 1, strf);
                     89:                for(j = 0; j < nsym; j++) {
                     90:                        for(i = 0; asym[i]; i++)
                     91:                                if(asym[i] != order[j].n_un.n_name[i])
                     92:                                        goto cont;
                     93:                        if (order[j].n_un.n_name[i])
                     94:                                goto cont;
                     95:                        if (order[j].n_value)
                     96:                                goto cont;
                     97:                        order[j].n_value = 1;
                     98:                        fseek(f, (i = (sa+(j * sizeof nl1))), 0);
                     99:                        if(fread(&nl2, sizeof nl2, 1, f) != 1)
                    100:                                printf("Read err on 2nd asym\n");
                    101:                        lseek(o, i, 0);
                    102:                        if(write(o, &nl1, sizeof nl1) == -1)
                    103:                                perror("write1");
                    104:                        lseek(o, na-sizeof nl1, 0);
                    105:                        if(write(o, &nl2, sizeof nl2) == -1)
                    106:                                perror("write2");
                    107:                        fseek(f, 0, 0);
                    108:                        fseek(f, na, 0);
                    109:                        symfound++;
                    110:                        break;
                    111:        cont:           ;
                    112: 
                    113:                }
                    114:        }
                    115:        if(symfound < nsym) {
                    116:                fprintf(stderr, "%d symbol(s) not found:\n", nsym - symfound);
                    117:                for (i = 0; i < nsym; i++) {
                    118:                        if (order[i].n_value == 0)
                    119:                                printf("%s\n", order[i].n_un.n_name);
                    120:                }
                    121:        }
                    122: }
                    123: 
                    124: #define        NSAVETAB        4096
                    125: char   *savetab;
                    126: int    saveleft;
                    127: 
                    128: char *
                    129: savestr(cp)
                    130:        register char *cp;
                    131: {
                    132:        register int len;
                    133: 
                    134:        len = strlen(cp) + 1;
                    135:        if (len > saveleft) {
                    136:                saveleft = NSAVETAB;
                    137:                if (len > saveleft)
                    138:                        saveleft = len;
                    139:                savetab = (char *)malloc(saveleft);
                    140:                if (savetab == 0) {
                    141:                        fprintf(stderr,
                    142:                            "symorder: ran out of memory (savestr)\n");
                    143:                        exit(1);
                    144:                }
                    145:        }
                    146:        strncpy(savetab, cp, len);
                    147:        cp = savetab;
                    148:        savetab += len;
                    149:        saveleft -= len;
                    150:        return (cp);
                    151: }

unix.superglobalmegacorp.com

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