Annotation of cci/usr/src/bin/cdb/symfix.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)symfix.c   2.4";
        !             2: 
        !             3: #include <stdio.h>
        !             4: #include <fcntl.h>
        !             5: #include <a.out.h>
        !             6: #include "basic.h"
        !             7: 
        !             8: long   lseek();
        !             9: 
        !            10: typedef struct exec EXECR, *pEXECR;
        !            11: #define cbEXECR sizeof(EXECR)
        !            12: 
        !            13: /* stuff directly related to the symbol table */
        !            14: typedef struct SYMS {  /* same record as `nlist, but with my names */
        !            15:        char    name[8];        /* symbol name */
        !            16:        int     type;           /* type flag */
        !            17:        uint    value;          /* something appropriate to the type */
        !            18: } 
        !            19: SYMR, *pSYMR;
        !            20: #define cbSYMR sizeof(SYMR)
        !            21: 
        !            22: 
        !            23: FLAGT  vfDirty;        /* indicates current cache has been mofified */
        !            24: short  vfnSym;
        !            25: short  visymMax;       /* number of symbols */
        !            26: long   vcbSymFirst;    /* byte offset to first symbol */
        !            27: #define iCacheMax  1024                        /* number of symbols in cache */
        !            28: SYMR   vsymCache[iCacheMax];   /* symbol cache */
        !            29: short  viCacheMac;             /* max index into cache */
        !            30: #define cbSymCache sizeof(vsymCache)
        !            31: short  viSMin, viSMax; /* min/max values for what is in cache */
        !            32: 
        !            33: char   sbHdrLn[] = "~_l";
        !            34: short  cbHdrLn = 3;
        !            35: 
        !            36: 
        !            37: /* I N I T   S Y M F I L E */
        !            38: 
        !            39: void InitSymfile(sbSymName)
        !            40: char   *sbSymName;
        !            41: {
        !            42:        short   magic, relflg;
        !            43:        long    cbData, cbText;
        !            44:        EXECR   execSym;
        !            45: 
        !            46: /* printf("Opening file %s\n", sbSymName); */
        !            47:        vfnSym = open(sbSymName, O_RDWR);
        !            48:        if (vfnSym < 0) {
        !            49:                perror(sbSymName);
        !            50:                exit(1);
        !            51:        }
        !            52: 
        !            53:        if (read(vfnSym, &execSym, cbEXECR) == cbEXECR) {
        !            54:                visymMax = execSym.a_syms / cbSYMR;
        !            55:                cbData = execSym.a_data;
        !            56:                cbText = execSym.a_text;
        !            57:                vcbSymFirst = cbText + cbData;  /* will be adjusted at end */
        !            58:                if (execSym.a_flag != 1)
        !            59:                        vcbSymFirst <<= 1;
        !            60:                vcbSymFirst += cbEXECR;
        !            61:        } 
        !            62:        else {
        !            63:                perror("Bad read of file header");
        !            64:                exit(1);
        !            65:        }
        !            66:        vfDirty = false;
        !            67: } /* InitSymfile */
        !            68: 
        !            69: 
        !            70: /* W R I T E   C A C H E */
        !            71: 
        !            72: void WriteCache()
        !            73: {
        !            74:        long    ret, l1, l2, offset;
        !            75:        short   cbWrite, x;
        !            76: 
        !            77:        l1 = viSMin;
        !            78:        l2 = cbSYMR;
        !            79:        offset = vcbSymFirst + (l1 * l2);
        !            80:        /* we write out this buffer before reading in the next */
        !            81:        if ((ret=lseek(vfnSym, offset, 0)) < 0l) {
        !            82:                perror("Bad seek in WriteCache");
        !            83:                exit(1);
        !            84:        }
        !            85:        l1 = viSMax - viSMin;
        !            86:        cbWrite = l2 * l1;
        !            87:        x = write(vfnSym, vsymCache, cbWrite);
        !            88:        if (x < 0) {
        !            89:                perror("Bad write in WriteCache");
        !            90:                exit(1);
        !            91:        }
        !            92:        vfDirty = false;
        !            93: } /* WriteCache */
        !            94: 
        !            95: 
        !            96: /* S E T   C A C H E */
        !            97: 
        !            98: void SetCache(isym)
        !            99: short  isym;
        !           100: {
        !           101:        short   cRead;
        !           102:        long    l1, l2, ret, offset;
        !           103: 
        !           104:        if (isym >= viSMin AND isym < viSMax)
        !           105:                return; /* it is already in there, somewhere */
        !           106:        if (vfDirty) {
        !           107:                WriteCache();
        !           108:        }
        !           109:        l1 = isym;
        !           110:        l2 = cbSYMR;
        !           111:        offset = vcbSymFirst + (l1 * l2);
        !           112:        if ((ret=lseek(vfnSym, offset, 0)) < 0l) {
        !           113:                printf("ret = %ld l1 %ld  l2 %ld  offset %ld\n", ret, l1, l2, offset);
        !           114:                perror("Bad seek in SetCache");
        !           115:                exit(1);
        !           116:        }
        !           117:        cRead = read(vfnSym, vsymCache, cbSymCache);
        !           118:        if (cRead < 0) {
        !           119:                perror("Bad read in SetCache");
        !           120:                exit(1);
        !           121:        }
        !           122:        viSMin = isym;
        !           123:        viCacheMac = cRead / cbSYMR;
        !           124:        viSMax = isym + viCacheMac;
        !           125: } /* SetCache */
        !           126: 
        !           127: 
        !           128: /* M U N C H   S Y M S */
        !           129: 
        !           130: void MunchSyms()
        !           131: {
        !           132:        short   isym, i;
        !           133:        pSYMR   sym;
        !           134: 
        !           135:        viSMin = 0;
        !           136:        viSMax = -1;
        !           137:        isym = 0;
        !           138: 
        !           139:        while (isym < visymMax) {
        !           140:                SetCache(isym);
        !           141:                for (i=(isym-viSMin); i<viCacheMac; i++, isym++) {
        !           142:                        sym = vsymCache + i;
        !           143:                        if (sym->type ==  N_TEXT) {
        !           144:                                if ( (strncmp(sym->name, sbHdrLn, cbHdrLn) == 0)
        !           145:                                    AND ((sym->name[cbHdrLn] == 'N')
        !           146:                                    OR (sym->name[cbHdrLn] == 'E')) ) {
        !           147:                                        /* this is either line number or proc end number */
        !           148:                                        sym->type = N_ABS;
        !           149:                                        vfDirty = true;
        !           150:                                }
        !           151:                        }
        !           152:                }
        !           153:        }
        !           154:        if (vfDirty)
        !           155:                WriteCache();
        !           156:        close(vfnSym);
        !           157: } /* MunchSyms */
        !           158: 
        !           159: 
        !           160: /* M A I N */
        !           161: 
        !           162: void main(argc, argv)
        !           163: int    argc;
        !           164: char   *argv[];
        !           165: {
        !           166:        FLAGT   fDidOne;
        !           167:        short   i;
        !           168:        char    *cp;
        !           169: 
        !           170:        fDidOne = false;
        !           171: 
        !           172:        for (i=1; i<argc; ++i) {
        !           173:                if (*(cp=argv[i]) != '-') {
        !           174:                        fDidOne = true;
        !           175:                        InitSymfile(cp);
        !           176:                        MunchSyms();
        !           177:                }
        !           178:        } /* for */
        !           179: 
        !           180:        if (!fDidOne) {
        !           181:                /* then let's assume they want a.out done */
        !           182:                InitSymfile("a.out");
        !           183:                MunchSyms();
        !           184:        }
        !           185:        exit(0);
        !           186: } /* main */

unix.superglobalmegacorp.com

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