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

1.1     ! root        1: static char sccsid[] = "@(#)nmnew.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  fUndefsOnly, fGlobalsOnly, fSort;
        !            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: char   stArgs[20];     /* arguments for the sort */
        !            33: char   stSortType[10]; /* alpha or numeric sort */
        !            34: char   stOrder[3];     /* normal or reverse */
        !            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_RDONLY);
        !            48:        if (vfnSym < 0) {
        !            49:                perror(sbSymName);
        !            50:                exit(1);
        !            51:        } /* if */
        !            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:        } /* if */
        !            66: } /* InitSymfile */
        !            67: 
        !            68: 
        !            69: /* S E T   C A C H E */
        !            70: 
        !            71: void SetCache(iSym)
        !            72: short  iSym;
        !            73: {
        !            74:        short   cRead;
        !            75:        long    l1, l2, ret, offset;
        !            76: 
        !            77:        if (iSym >= viSMin AND iSym < viSMax)
        !            78:                return; /* it is already in there, somewhere */
        !            79:        l1 = iSym;
        !            80:        l2 = cbSYMR;
        !            81:        offset = vcbSymFirst + (l1 * l2);
        !            82:        if ((ret=lseek(vfnSym, offset, 0)) < 0l) {
        !            83:                printf("ret = %ld l1 %ld  l2 %ld  offset %ld\n", ret, l1, l2, offset);
        !            84:                perror("Bad seek in SetCache");
        !            85:                exit(1);
        !            86:        } /* if */
        !            87:        cRead = read(vfnSym, vsymCache, cbSymCache);
        !            88:        if (cRead < 0) {
        !            89:                perror("Bad read in SetCache");
        !            90:                exit(1);
        !            91:        } /* if */
        !            92:        viSMin = iSym;
        !            93:        viCacheMac = cRead / cbSYMR;
        !            94:        viSMax = iSym + viCacheMac;
        !            95: } /* SetCache */
        !            96: 
        !            97: 
        !            98: /* P R I N T   S Y M S */
        !            99: 
        !           100: void PrintSyms()
        !           101: {
        !           102:        short   iSym, i, type;
        !           103:        FLAGT   fExt;
        !           104:        char    chType;
        !           105:        int             waitReturn, status, pidUnix;
        !           106:        char    *stSort;
        !           107:        char    stTemp[30];
        !           108:        pSYMR   sym;
        !           109:        FILE    *fp;
        !           110: 
        !           111:        stSort = "/bin/sort";
        !           112: 
        !           113:        viSMin = 0;
        !           114:        viSMax = -1;
        !           115: 
        !           116:        if (fSort) {
        !           117:                sprintf(stTemp, "/tmp/nm%d", getpid());
        !           118:                sprintf(stArgs, "-%s%s", stSortType, stOrder);
        !           119:                fp = fopen(stTemp, "w+");
        !           120:        } /* if */
        !           121: 
        !           122:        iSym = 0;
        !           123:        while (iSym < viSymMax) {
        !           124:                SetCache(iSym);
        !           125:                for (i=(iSym-viSMin); i<viCacheMac; i++, iSym++) {
        !           126:                        sym = vsymCache + i;
        !           127:                        type = sym->type & N_TYPE;
        !           128:                        fExt = sym->type & N_EXT;
        !           129: 
        !           130:                        if (!(fExt) AND (fGlobalsOnly))
        !           131:                                continue;
        !           132:                        if ((fUndefsOnly) AND (type != N_UNDF))
        !           133:                                continue;
        !           134: 
        !           135:                        switch (type) {
        !           136:                        case N_UNDF:    /* undefined */
        !           137:                                chType = 'U';
        !           138:                                break;
        !           139:                        case N_ABS:     /* absolute */
        !           140:                                chType = 'A';
        !           141:                                break;
        !           142:                        case N_TEXT:    /* text symbol */
        !           143:                                chType = 'T';
        !           144:                                break;
        !           145:                        case N_DATA:    /* data symbol */
        !           146:                                chType = 'D';
        !           147:                                break;
        !           148:                        case N_BSS:     /* bss symbol */
        !           149:                                chType = 'B';
        !           150:                                break;
        !           151:                        case N_REG:     /* register name */
        !           152:                                chType = 'r';
        !           153:                                break;
        !           154:                        case N_FN:      /* file name symbol */
        !           155:                                chType = 'f';
        !           156:                                break;
        !           157:                        } /* switch */
        !           158:                        if (!fExt)
        !           159:                                chType |= 040;  /* force to lower case */
        !           160:                        if (fSort)
        !           161:                                fprintf(fp, "%.6o %c %s\n", sym->value, chType, sym->name);
        !           162:                        else
        !           163:                                printf("%.6o %c %s\n", sym->value, chType, sym->name);
        !           164:                } /* for */
        !           165:        } /* while */
        !           166: 
        !           167:        if (fSort) {
        !           168:                fclose(fp);
        !           169:                if ((pidUnix=fork()) == 0) {
        !           170:                        execl(stSort, stSort, stArgs, stTemp, 0);
        !           171:                        perror("Exec failed (!?)");
        !           172:                        exit(1);
        !           173:                } 
        !           174:                else if (pidUnix == -1) {
        !           175:                        perror("Could not fork shell (!?)");
        !           176:                        exit(1);
        !           177:                } 
        !           178:                else {
        !           179:                        while ( ((waitReturn = wait(&status)) != pidUnix)
        !           180:                            AND (waitReturn != -1) )
        !           181:                                ;
        !           182:                } /* if */
        !           183:        } /* if */
        !           184: } /* PrintSyms */
        !           185: 
        !           186: 
        !           187: /* M A I N */
        !           188: 
        !           189: void main(argc, argv)
        !           190: int    argc;
        !           191: char   *argv[];
        !           192: {
        !           193:        FLAGT   fDidOne;
        !           194:        short   i;
        !           195:        char    *cp;
        !           196: 
        !           197:        fDidOne = false;
        !           198:        fSort = true;
        !           199:        fUndefsOnly = fGlobalsOnly = false;
        !           200:        strcpy(stSortType, "-d +2");
        !           201: 
        !           202:        for (i=1; i<argc; ++i) {
        !           203:                if (*(cp=argv[i]) != '-') {
        !           204:                        fDidOne = true;
        !           205:                        InitSymfile(cp);
        !           206:                        PrintSyms();
        !           207:                } 
        !           208:                else {
        !           209:                        while (*++cp) {
        !           210:                                switch (*cp) {
        !           211:                                case 'g':
        !           212:                                        fGlobalsOnly = !fGlobalsOnly;
        !           213:                                        break;
        !           214:                                case 'n':
        !           215:                                        strcpy(stSortType, "-n");
        !           216:                                        break;
        !           217:                                case 'p':
        !           218:                                        fSort = !fSort;
        !           219:                                        break;
        !           220:                                case 'r':
        !           221:                                        if (stOrder[0] != 0)    /* toggle meaning */
        !           222:                                                strcpy(stOrder, "-r");
        !           223:                                        else
        !           224:                                                stOrder[0] = 0;
        !           225:                                        break;
        !           226:                                case 'u':
        !           227:                                        fUndefsOnly = !fUndefsOnly;
        !           228:                                        break;
        !           229:                                } /* switch */
        !           230:                        } /* while */
        !           231:                } /* if */
        !           232:        } /* for */
        !           233: 
        !           234:        if (!fDidOne) {
        !           235:                /* then let's assume they want a.out done */
        !           236:                InitSymfile("a.out");
        !           237:                PrintSyms();
        !           238:        } /* if */
        !           239: } /* main */

unix.superglobalmegacorp.com

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