Annotation of researchv10no/cmd/adb/seq/syminit.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * init the symbol table
                      3:  */
                      4: 
                      5: #include "defs.h"
                      6: #include "sym.h"
                      7: #include <a.out.h>
                      8: #include <stab.h>
                      9: #include <sys/types.h>
                     10: 
                     11: #define        NSYMS   300
                     12: #define        BIGBUF  (4*4096)
                     13: 
                     14: extern struct sym *symtab;
                     15: 
                     16: syminit(h)
                     17: struct exec *h;
                     18: {
                     19:        register struct nlist *q;
                     20:        register n, m;
                     21:        int strsiz;
                     22:        struct nlist space[BIGBUF/sizeof(struct nlist)];
                     23:        struct sym *sbuf;
                     24:        register struct sym *cur;
                     25:        struct sym *curgbl;
                     26:        register char *names;
                     27:        register int type, ltype;
                     28:        char *malloc();
                     29: 
                     30:        symtab = NULL;
                     31:        if (h->a_syms == 0)
                     32:                return;         /* stripped */
                     33:        lseek(fsym, (off_t)N_STROFF(*h), 0);
                     34:        if (read(fsym, &strsiz, sizeof(strsiz)) != sizeof(strsiz)) {
                     35:                printf("can't get string table size\n");
                     36:                return;
                     37:        }
                     38:        if ((names = malloc(strsiz)) == NULL) {
                     39:                printf("no mem for strings\n");
                     40:                return;
                     41:        }
                     42:        lseek(fsym, (off_t)N_STROFF(*h), 0);
                     43:        if (read(fsym, names, strsiz) != strsiz) {
                     44:                printf("error reading strings\n");
                     45:                return;
                     46:        }
                     47:        lseek(fsym, (off_t)N_SYMOFF(*h), 0);
                     48:        curgbl = sbuf = cur = NULL;
                     49:        for (n = h->a_syms; n > 0 ;) {
                     50:                m = read(fsym, (char *)space, min(n, sizeof(space)));
                     51:                if (m <= 0)
                     52:                        break;
                     53:                n -= m;
                     54:                for (q = space; m > 0; q++, m-= sizeof(space[0])) {
                     55:                        if (q->n_un.n_strx == 0)
                     56:                                continue;
                     57:                        switch (q->n_type) {
                     58:                        case N_ABS:
                     59:                        case N_ABS|N_EXT:
                     60:                                type = S_ABS;
                     61:                                break;
                     62: 
                     63:                        case N_TEXT:
                     64:                                if (names[q->n_un.n_strx] != '_')
                     65:                                        continue;
                     66:                                /* fall in */
                     67: #if NOTDEF
                     68:                        case N_BFUN:
                     69: #endif
                     70:                        case N_TEXT|N_EXT:
                     71:                                type = S_TEXT;
                     72:                                break;
                     73: 
                     74:                        case N_DATA:
                     75:                        case N_DATA|N_EXT:
                     76:                        case N_BSS:
                     77:                        case N_BSS|N_EXT:
                     78:                                type = S_DATA;
                     79:                                break;
                     80: 
                     81: #if NOTDEF
                     82:                        case N_LSYM:
                     83:                                ltype = S_LSYM;
                     84:                                type = S_STAB;
                     85:                                break;
                     86: 
                     87:                        case N_RSYM:
                     88:                                ltype = S_RSYM;
                     89:                                type = S_STAB;
                     90:                                break;
                     91: 
                     92:                        case N_PSYM:
                     93:                                ltype = S_PSYM;
                     94:                                type = S_STAB;
                     95:                                break;
                     96: 
                     97:                        case N_STSYM:
                     98:                        case N_LCSYM:
                     99:                                ltype = S_STSYM;
                    100:                                type = S_STAB;
                    101:                                break;
                    102: #endif
                    103: 
                    104:                        default:
                    105:                                continue;
                    106:                        }
                    107:                        if (sbuf == NULL || ++cur >= sbuf + NSYMS) {
                    108:                                if ((sbuf = (struct sym *)malloc(sizeof(struct sym) * NSYMS)) == NULL) {
                    109:                                        printf("out of mem for syms\n");
                    110:                                        return;
                    111:                                }
                    112:                                cur = sbuf;
                    113:                        }
                    114:                        cur->y_type = type;
                    115:                        cur->y_ltype = ltype;
                    116:                        cur->y_value = q->n_value;
                    117:                        cur->y_name = &names[q->n_un.n_strx];
                    118:                        cur->y_locals = NULL;
                    119:                        if (q->n_type == N_FUN) {
                    120:                                cur->y_next = curgbl;
                    121:                                curgbl = cur;
                    122:                        }
                    123:                        else if (cur->y_type == S_STAB) {
                    124:                                if (curgbl == NULL)
                    125:                                        continue;
                    126:                                cur->y_next = curgbl->y_locals;
                    127:                                curgbl->y_locals = cur;
                    128:                        }
                    129:                        else {
                    130:                                cur->y_next = symtab;
                    131:                                symtab = cur;
                    132:                        }
                    133:                }
                    134:        }
                    135:        for (; curgbl; curgbl = curgbl->y_next) {
                    136:                if (curgbl->y_locals == NULL)
                    137:                        continue;
                    138:                for (cur = symtab; cur; cur = cur->y_next) {
                    139:                        if (cur->y_type != S_TEXT)
                    140:                                continue;
                    141:                        if (cur->y_value == curgbl->y_value) {
                    142:                                cur->y_locals = curgbl->y_locals;
                    143:                                break;
                    144:                        }
                    145:                }
                    146:        }
                    147: }
                    148: 
                    149: /*
                    150:  * is symbol table entry s == name n?
                    151:  * this may depend on awful symbol conventions
                    152:  * e.g. _
                    153:  */
                    154: int
                    155: eqsym(s, n)
                    156: register struct sym *s;
                    157: char *n;
                    158: {
                    159: 
                    160:        if (strcmp(s->y_name, n) == 0)
                    161:                return (1);
                    162:        if (s->y_name[0] == '_' && strcmp(&s->y_name[1], n) == 0)
                    163:                return (1);
                    164:        return (0);
                    165: }
                    166: 
                    167: static
                    168: min(a, b)
                    169: {
                    170:        if (a < b)
                    171:                return (a);
                    172:        else
                    173:                return (b);
                    174: }

unix.superglobalmegacorp.com

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