Annotation of researchv10no/cmd/adb/seq/syminit.c, revision 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.