Annotation of 41BSD/cmd/symorder.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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