Annotation of coherent/b/bin/db_400/trace1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     trace1.c
                      3:  *
                      4:  *     The information contained herein is a trade secret of Mark Williams
                      5:  *     Company, and  is confidential information.  It is provided  under a
                      6:  *     license agreement,  and may be  copied or disclosed  only under the
                      7:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      8:  *     material without the express written authorization of Mark Williams
                      9:  *     Company or persuant to the license agreement is unlawful.
                     10:  *
                     11:  *     COHERENT Version 2.3.35
                     12:  *     Copyright (c) 1982, 1983, 1984.
                     13:  *     An unpublished work by Mark Williams Company, Chicago.
                     14:  *     All rights reserved.
                     15:  *
                     16:  *     Initialization, command line parsing.
                     17:  */
                     18: #include <stdio.h>
                     19: #include <ctype.h>
                     20: #include <canon.h>
                     21: #include <l.out.h>
                     22: #include <sys/timeout.h>
                     23: #include <sys/proc.h>
                     24: #include <sys/ptrace.h>
                     25: #include <signal.h>
                     26: #include <sys/uproc.h>
                     27: #include "trace.h"
                     28: 
                     29: static char *symName();
                     30: 
                     31: main(argc, argv)
                     32: char **argv;
                     33: {
                     34:        initialise();
                     35:        setup(argc, argv);
                     36:        signal(SIGINT, &armsint);
                     37:        signal(SIGQUIT, SIG_IGN);
                     38:        process();
                     39: }
                     40: 
                     41: /*
                     42:  * Leave.
                     43:  */
                     44: leave()
                     45: {
                     46:        nfree(ssymp);
                     47:        nfree(gblsymMap);
                     48:        killc();
                     49:        exit(0);
                     50: }
                     51: 
                     52: /*
                     53:  * Initialize segment formats and clear the breakpoint table.
                     54:  */
                     55: initialise()
                     56: {
                     57:        strcpy(segform[DSEG], "w");
                     58:        strcpy(segform[ISEG], "i");
                     59:        strcpy(segform[USEG], "w");
                     60:        bptinit();
                     61: }
                     62: 
                     63: /*
                     64:  * Setup arguments.
                     65:  */
                     66: setup(argc, argv)
                     67: char **argv;
                     68: {
                     69:        register char *cp;
                     70:        register int c;
                     71:        register int t;
                     72:        register int u;
                     73:        register int tflag;
                     74: 
                     75:        t = '\0';
                     76:        tflag = 0;
                     77: 
                     78:        /* process command line switches -[cdefkorst] */
                     79:        for (; argc>1; argc--, argv++) {
                     80:                cp = argv[1];
                     81:                if (*cp++ != '-')
                     82:                        break;
                     83:                while ((c=*cp++) != '\0') {
                     84:                        switch (c) {
                     85:                        case 'c':
                     86:                        case 'd':
                     87:                        case 'e':
                     88:                        case 'f':
                     89:                        case 'k':
                     90:                        case 'o':
                     91:                                /* only one of [cdefko] is allowed */
                     92:                                if (t != '\0')
                     93:                                        usage();
                     94:                                t = c;
                     95:                                continue;
                     96:                        case 'r':
                     97:                                rflag = 1;
                     98:                                continue;
                     99:                        case 's':
                    100:                                sflag = 1;
                    101:                                continue;
                    102:                        case 't':
                    103:                                tflag = 1;
                    104:                                continue;
                    105:                        default:
                    106:                                usage();
                    107:                        }
                    108:                }
                    109:        }
                    110:        switch (t) {
                    111:        case '\0':
                    112:                switch (argc) {
                    113:                case 1:
                    114:                        setfh(DEFLT_OBJ, 3);
                    115:                        setcore(DEFLT_AUX);
                    116:                        break;
                    117:                case 2:
                    118:                        setfh(argv[1], 3);
                    119:                        break;
                    120:                case 3:
                    121:                        setfh(argv[1], 3);
                    122:                        setcore(argv[2]);
                    123:                        break;
                    124:                default:
                    125:                        usage();
                    126:                }
                    127:                break;
                    128:        case 'c':
                    129:                switch (argc) {
                    130:                case 1:
                    131:                        setfh(DEFLT_OBJ, 3);
                    132:                        setcore(DEFLT_AUX);
                    133:                        break;
                    134:                case 2:
                    135:                        setcore(argv[1]);
                    136:                        break;
                    137:                case 3:
                    138:                        setfh(argv[1], 3);
                    139:                        setcore(argv[2]);
                    140:                        break;
                    141:                default:
                    142:                        usage();
                    143:                }
                    144:                break;
                    145:        case 'd':
                    146:                switch (argc) {
                    147:                case 1:
                    148:                        setfh("/coherent", 3);
                    149:                        setdump("/dev/dump");
                    150:                        break;
                    151:                case 3:
                    152:                        setfh(argv[1], 3);
                    153:                        setdump(argv[2]);
                    154:                        break;
                    155:                default:
                    156:                        usage();
                    157:                }
                    158:                break;
                    159:        case 'e':
                    160:                if (argc < 2)
                    161:                        usage();
                    162:                setfh(argv[1], 3);
                    163:                if (startup(&argv[1], NULL, NULL, 0)==0 || shiftup()==0)
                    164:                        leave();
                    165:                break;
                    166:        case 'f':
                    167:                switch (argc) {
                    168:                case 2:
                    169:                        setfile(argv[1]);
                    170:                        break;
                    171:                case 3:
                    172:                        setfh(argv[1], 1);
                    173:                        setfile(argv[2]);
                    174:                        break;
                    175:                default:
                    176:                        usage();
                    177:                }
                    178:                break;
                    179:        case 'k':
                    180:                switch (argc) {
                    181:                case 1:
                    182:                        setfh("/coherent", 1);
                    183:                        setkmem("/dev/mem");
                    184:                        break;
                    185:                case 2:
                    186:                        setkmem(argv[1]);
                    187:                        break;
                    188:                case 3:
                    189:                        setfh(argv[1], 1);
                    190:                        setkmem(argv[2]);
                    191:                        break;
                    192:                default:
                    193:                        usage();
                    194:                }
                    195:                break;
                    196:        case 'o':
                    197:                switch (argc) {
                    198:                case 1:
                    199:                        setfh(DEFLT_OBJ, 3);
                    200:                        break;
                    201:                case 2:
                    202:                        setfh(argv[1], 3);
                    203:                        break;
                    204:                case 3:
                    205:                        setfh(argv[1], 1);
                    206:                        setfh(argv[2], 2);
                    207:                        break;
                    208:                default:
                    209:                        usage();
                    210:                }
                    211:        }
                    212:        if (tflag) {
                    213:                if ((u=open("/dev/tty", 2)) < 0)
                    214:                        panic("Cannot open /dev/tty");
                    215:                dup2(u, 0);
                    216:                dup2(u, 1);
                    217:                dup2(u, 2);
                    218:        }
                    219: }
                    220: 
                    221: /*
                    222:  * Generate a usage message.
                    223:  */
                    224: usage()
                    225: {
                    226:        panic("Usage: db [-cdefort] [object file] [auxiliary file]");
                    227: }
                    228: 
                    229: /*
                    230:  * Catch and flag interrupts.
                    231:  */
                    232: armsint()
                    233: {
                    234:        signal(SIGINT, &armsint);
                    235:        intflag++;
                    236: }
                    237: 
                    238: /*
                    239:  * Check for interrupts and clear flag.
                    240:  */
                    241: testint()
                    242: {
                    243:        register int n;
                    244: 
                    245:        if ((n=intflag) != 0)
                    246:                printe("Interrupt");
                    247:        intflag = 0;
                    248:        return (n);
                    249: }
                    250: 
                    251: /*
                    252:  * Assume the file, `np', is the name of an l.out.  If the bottom bit
                    253:  * of the flag is set, set up the symbol table.  If the next bit is set,
                    254:  * set up segmentation for the l.out.
                    255:  */
                    256: setlout(np, f)
                    257: char *np;
                    258: {
                    259:        struct ldheader ldh;
                    260: 
                    261:        fseek(lfp, 0L, 0L);
                    262:        if (fread(&ldh, sizeof(ldh), 1, lfp) != 1)
                    263:                panic("Cannot read object file");
                    264:        canlout(&ldh);
                    265:        if (ldh.l_magic != L_MAGIC)
                    266:                panic("Bad object file");
                    267:        hdrinfo.magic = ldh.l_magic;
                    268:        hdrinfo.defsegatt = DSA16;
                    269:        objflag = 1;
                    270:        if ((f&1) != 0) {
                    271:                sbase = sizeof(ldh);
                    272:                sbase += ldh.l_ssize[L_SHRI] + ldh.l_ssize[L_PRVI];
                    273:                sbase += ldh.l_ssize[L_SHRD] + ldh.l_ssize[L_PRVD];
                    274:                snsym = ldh.l_ssize[L_SYM] / sizeof(struct ldsym);
                    275:                if (snsym != 0) {
                    276:                        sfp = lfp;
                    277:                        if (sflag == 0)
                    278:                                readsym(sfp);
                    279:                }
                    280:        }
                    281:        if ((f&2) != 0) {
                    282:                lfn = np;
                    283:                setaseg(&ldh);
                    284:        }
                    285: }
                    286: 
                    287: /*
                    288:  * Canonicalize an l.out header.
                    289:  */
                    290: canlout(ldp)
                    291: struct ldheader *ldp;
                    292: {
                    293:        register int i;
                    294: 
                    295:        canint(ldp->l_magic);
                    296:        canint(ldp->l_flag);
                    297:        canint(ldp->l_machine);
                    298:        canvaddr(ldp->l_entry);
                    299:        for (i=0; i<NLSEG; i++)
                    300:                cansize(ldp->l_ssize[i]);
                    301: }
                    302: 
                    303: /*
                    304:  * Read all global symbols into memory.
                    305:  */
                    306: readsym(fp)
                    307: FILE *fp;
                    308: {
                    309:        register int n, i;
                    310:        register SYM *sp;
                    311:        struct ldsym lds;
                    312:        struct LDSYM LDS;
                    313: 
                    314:        if ((ssymp=nalloc((int)snsym * sizeof(SYM))) == NULL)
                    315:                return;
                    316:        fseek(fp, (long)sbase, 0);
                    317:        for (n=snsym, sp=ssymp; n--; sp++) {
                    318:                if (fread(&lds, sizeof(struct ldsym), 1, fp) != 1) {
                    319:                        nfree(ssymp);
                    320:                        ssymp = NULL;
                    321:                        return;
                    322:                }
                    323:                canint(lds.ls_type);
                    324:                canvaddr(lds.ls_addr);
                    325:                for (i=0; i<NCPLN; i++) 
                    326:                        LDS.ls_id[i] = lds.ls_id[i];
                    327:                LDS.ls_type = lds.ls_type;
                    328:                LDS.ls_addr = (long)lds.ls_addr;
                    329: 
                    330:                sp->s_hash = hash(&LDS);
                    331:                sp->s_type = LDS.ls_type;
                    332:                sp->s_sval = LDS.ls_addr;
                    333:        }
                    334: }
                    335: 
                    336: /*
                    337:  * Hash a symbol name.
                    338:  */
                    339: hash(ldp)
                    340: struct LDSYM *ldp;
                    341: {
                    342:        register int h, n;
                    343:        register char *cp;
                    344: 
                    345:        h = 0;
                    346:        n = CCSSIZE;
                    347:        cp = ldp->ls_id;
                    348:        do {
                    349:                if (*cp != '_')
                    350:                        h += *cp;
                    351:                if (*cp++ == '\0')
                    352:                        break;
                    353:        } while (--n);
                    354:        return (h&0377);
                    355: }
                    356: 
                    357: /*
                    358:  * Set up segmentation for a core dump.  The registers are also read.
                    359:  */
                    360: setcore(np)
                    361: char *np;
                    362: {
                    363:        register unsigned i;
                    364:        register MAP *mp;
                    365:        register char *cp;
                    366:        register char *lcp;
                    367:        register fsize_t size;
                    368:        register fsize_t offt;
                    369:        char ucomm[10];
                    370:        SR usegs[NUSEG];
                    371: 
                    372:        cfp = openfil(np, rflag);
                    373:        fseek(cfp, (long)offset(uproc, u_comm[0]), 0);
                    374:        if ((cp=lfn)!=NULL && fread(ucomm, sizeof(ucomm), 1, cfp)==1) {
                    375:                lcp = cp;
                    376:                while (*cp) {
                    377:                        if (*cp++ == '/')
                    378:                                lcp = cp;
                    379:                }
                    380:                if (strncmp(lcp, ucomm, sizeof(ucomm)) != 0)
                    381:                        printr("Core different from object");
                    382:        }
                    383:        fseek(cfp, (long)offset(uproc, u_segl[0]), 0);
                    384:        if (fread(usegs, sizeof(usegs), 1, cfp) != 1)
                    385:                panic("Bad core file");
                    386:        USPACE = setsmap(NULL, (fsize_t)0, (fsize_t)UPASIZE, (fsize_t)0,
                    387:                        getf, putf, 1);
                    388:        mp = clrsmap(DSPACE, endpure);
                    389:        offt = usegs[0].sr_size;
                    390: #ifdef _I386
                    391:        usegs[SISTACK].sr_base -= usegs[SISTACK].sr_size;
                    392: #endif
                    393:        for (i=1; i<NUSEG; i++) {
                    394:                if (usegs[i].sr_segp == NULL)
                    395:                        continue;
                    396:                if ((~usegs[i].sr_flag) & (SRFDUMP|SRFPMAP))
                    397:                        continue;
                    398:                size = usegs[i].sr_size;
                    399:                mp = setsmap(mp, (fsize_t)usegs[i].sr_base, size, offt,
                    400:                                getf, putf, 1);
                    401:                offt += size;
                    402:        }
                    403:        if (ISPACE == DSPACE)
                    404:                ISPACE = mp;
                    405:        DSPACE = mp;
                    406:        settrap();
                    407:        setregs();
                    408: }
                    409: 
                    410: /*
                    411:  * Find out signal sent to traced process.
                    412:  */
                    413: settrap()
                    414: {
                    415:        int f;
                    416: 
                    417:        trapstr = "???";
                    418:        add = PTRACE_SIG;
                    419:        if (getb(USEG, (char *)&f, sizeof(f)) == 0) {
                    420:                printr("Cannot read signal in traced process");
                    421:                return 0;
                    422:        }
                    423:        if (f<=0 || f>NSIG) {
                    424:                printr("Bad signal in traced process");
                    425:                return 0;
                    426:        }
                    427:        trapstr = signame[f-1];
                    428:        return f;
                    429: }
                    430: 
                    431: /*
                    432:  * Set up segmentation for an ordinary file.
                    433:  * This is really easy.
                    434:  */
                    435: setfile(np)
                    436: char *np;
                    437: {
                    438:        lfp = openfil(np, rflag);
                    439:        DSPACE = setsmap(NULL, (fsize_t)0, (fsize_t)LI, (fsize_t)0,
                    440:                getf, putf, 0);
                    441:        ISPACE = DSPACE;
                    442: }
                    443: 
                    444: /*
                    445:  * Open the given file.  If `rflag' is set, the file is opened for
                    446:  * read only.
                    447:  */
                    448: FILE *
                    449: openfil(np, rflag)
                    450: char *np;
                    451: {
                    452:        register FILE *fp;
                    453: 
                    454:        if (rflag) {
                    455:                if ((fp=fopen(np, "r")) != NULL)
                    456:                        return (fp);
                    457:        } else {
                    458:                if ((fp=fopen(np, "r+w")) != NULL)
                    459:                        return (fp);
                    460:                if ((fp=fopen(np, "r")) != NULL) {
                    461:                        printr("%s: opened read only", np);
                    462:                        return (fp);
                    463:                }
                    464:        }
                    465:        panic("Cannot open %s", np);
                    466: }
                    467: 
                    468: /*
                    469:  * Initialise an element of a segment map.
                    470:  */
                    471: MAP * setsmap(next, base, size, offt, getf, putf, segi)
                    472: MAP *next;
                    473: fsize_t base;
                    474: fsize_t size;
                    475: fsize_t offt;
                    476: int (*getf)();
                    477: int (*putf)();
                    478: {
                    479:        register MAP *mp;
                    480: 
                    481:        mp = (MAP *)nalloc(sizeof(MAP));
                    482:        mp->m_next = next;
                    483:        mp->m_base = base;
                    484:        mp->m_bend = base+size;
                    485:        mp->m_offt = offt;
                    486:        mp->m_getf = getf;
                    487:        mp->m_putf = putf;
                    488:        mp->m_segi = segi;
                    489:        return (mp);
                    490: }
                    491: 
                    492: /*
                    493:  * Clear a section of a segment map.
                    494:  */
                    495: MAP * clrsmap(mp, np)
                    496: register MAP *mp;
                    497: register MAP *np;
                    498: {
                    499:        while (mp != np) {
                    500:                nfree(mp);
                    501:                mp = mp->m_next;
                    502:        }
                    503:        return (mp);
                    504: }
                    505: 
                    506: /*
                    507:  * Clear all maps.
                    508:  */
                    509: clramap()
                    510: {
                    511:        register int n;
                    512: 
                    513:        n = 0;
                    514:        if (segmapl[0] == segmapl[1])
                    515:                segmapl[n++] = NULL;
                    516:        while (n < NSEGM) {
                    517:                segmapl[n] = clrsmap(segmapl[n], NULL);
                    518:                n++;
                    519:        }
                    520: }
                    521: 
                    522: 
                    523: /******************************************************************************
                    524:  *
                    525:  * Note some #defines in these include files interferes with
                    526:  * items in preceeding include files. Hence the strange
                    527:  * program order.
                    528:  *
                    529:  ******************************************************************************/
                    530: 
                    531: #include <coff.h>
                    532: 
                    533: char   *read_str_tab();
                    534: SCNHDR *read_scns();
                    535: 
                    536: /*
                    537:  * Setup object file.
                    538:  *
                    539:  * Arguments:
                    540:  *     np = file name
                    541:  *     f is bit mapped
                    542:  *             set 1's bit if reading symbol table info from file "np"
                    543:  *             set 2's bit if reading segment info from file "np"
                    544:  */
                    545: setfh (np,f)
                    546: char   *np;
                    547: {
                    548:        FILEHDR coffh;
                    549:        
                    550:        lfp = openfil(np, (f&2) ? rflag : 1);
                    551:        if (fread(&coffh, sizeof(coffh), 1, lfp) != 1)
                    552:                panic("Cannot read object file");
                    553:        if (coffh.f_magic == C_386_MAGIC)
                    554:                setcoff(lfp, &coffh, np, f);
                    555:        else    setlout(np, f);
                    556: }
                    557: 
                    558: setcoff(fp, coffhp, np, f)
                    559: FILE   *fp;
                    560: FILEHDR        *coffhp;
                    561: char   *np;
                    562: int    f;
                    563: {
                    564:        hdrinfo.magic = coffhp->f_magic;
                    565:        hdrinfo.defsegatt = DSA32;
                    566:        objflag = 1;
                    567:        if (f&1) {
                    568:                if (coffhp->f_nsyms) {
                    569:                        sbase = (fsize_t)coffhp->f_symptr;
                    570:                        snsym = (fsize_t)coffhp->f_nsyms; 
                    571:                        if (snsym != 0L) {
                    572:                                sfp = fp;
                    573:                                if (sflag == 0) {
                    574:                                        readCoffSym(fp, coffhp);
                    575:                                }
                    576:                        }
                    577:                }
                    578:        }
                    579:        if (f&2) {
                    580:                lfn = np;
                    581:                setcoffseg(fp, coffhp);
                    582:        }
                    583: }
                    584: 
                    585: readCoffSym(fp, coffhp)
                    586: FILE   *fp;
                    587: FILEHDR        *coffhp;
                    588: {
                    589:        SYMENT          coffsym;
                    590:        struct  LDSYM   lds;
                    591:        SYM             *sp;
                    592:        long            n;
                    593:        char            *str_tabp;
                    594:        SCNHDR          *scnhp;
                    595: 
                    596: 
                    597:        str_tabp = read_str_tab(fp, coffhp->f_nsyms, coffhp->f_symptr);
                    598: 
                    599:        scnhp = read_scns(fp, coffhp->f_nscns
                    600:                                , sizeof(FILEHDR)+coffhp->f_opthdr);
                    601: 
                    602:        /* could get entry point here FIX 386 */
                    603: 
                    604:        if (scnhp == NULL)
                    605:                return;
                    606: 
                    607:        if ((gblsymMap=nalloc((int)coffhp->f_nsyms * sizeof(off_t))) == NULL) {
                    608:                printf("Not enough memory for the global symbol map.\n");
                    609:                return;
                    610:        }
                    611:        if ((ssymp=nalloc((int)coffhp->f_nsyms * sizeof(SYM))) == NULL) {
                    612:                printf("Not enough memory for the coff symbol header section.\n");
                    613:                return;
                    614:        }
                    615: 
                    616:        fseek(fp, coffhp->f_symptr, 0);
                    617: 
                    618:        for (n=coffhp->f_nsyms, sp=ssymp; n--; ) {
                    619:                if (fread(&coffsym, sizeof(SYMENT), 1, fp) != 1) {
                    620:                        printf("Cannot read coff.h symbols\n");
                    621:                        nfree(ssymp);
                    622:                        ssymp = NULL;
                    623:                        return;
                    624:                }
                    625: 
                    626:                switch (coffsym.n_sclass) {
                    627:                case C_EXT:
                    628:                case C_EXTDEF:
                    629:                        break;
                    630:                default:
                    631:                        continue;
                    632:                }
                    633: 
                    634:                coff_to_lout(&coffsym, &lds, str_tabp, scnhp);
                    635: 
                    636:                sp->s_hash = hash(&lds);
                    637:                sp->s_type = lds.ls_type;
                    638:                sp->s_sval = lds.ls_addr;
                    639: 
                    640:                gblsymMap[sp-ssymp] = snsym - n - 1;
                    641:                sp++;
                    642:        }
                    643:        gblsymMap=(off_t *)realloc( gblsymMap, (sp-ssymp)*sizeof(off_t) );      
                    644:        ssymp=(SYM *)realloc( ssymp, (sp-ssymp)*sizeof(SYM) );  
                    645:        sngblsym = sp - ssymp;
                    646:        if (str_tabp) nfree(str_tabp);
                    647:        nfree(scnhp);
                    648: }
                    649: 
                    650: char   *
                    651: read_str_tab(fp, nsyms, symptr)
                    652: FILE   *fp;
                    653: long   nsyms;
                    654: long   symptr;
                    655: {
                    656:        long            strtab_len, symtab_len;
                    657:        unsigned        len;
                    658:        char    *       strTabp;
                    659: 
                    660:        strtab_len = 0;
                    661:        strTabp = NULL;
                    662:        len = symtab_len = sizeof(SYMENT) * nsyms;      
                    663:        if (!len)
                    664:                return(NULL);
                    665: 
                    666:        if (symtab_len != len) {
                    667:                panic("Cannot process small model");
                    668:        }
                    669:        fseek(fp, symptr+len, 0);
                    670:        if (1 != fread(&strtab_len, sizeof(strtab_len), 1, fp)) {
                    671:                strtab_len = 0;
                    672:        }
                    673:        if (!strtab_len)
                    674:                return(NULL);
                    675: 
                    676:        len = strtab_len -= 4;
                    677:        if (len != strtab_len)
                    678:                panic("Cannot process small model");
                    679:        if ( (strTabp = nalloc((int)len)) == NULL ) {
                    680:                printf("Not enough memory for the symbol string table.\n");
                    681:                return(NULL);
                    682:        }
                    683:        if ( fread(strTabp, len, 1, fp) != 1) {
                    684:                printf("Unable to read symbol string table.\n");
                    685:                return(NULL);
                    686:        }
                    687: 
                    688:        return(strTabp);
                    689: }
                    690: 
                    691: SCNHDR *
                    692: read_scns(fp, nscns, scnh_off)
                    693: FILE   *fp;
                    694: unsigned short nscns, scnh_off;
                    695: {
                    696:        int     len;
                    697:        SCNHDR  *scnhp;
                    698: 
                    699:        len = (int)(nscns*sizeof(SCNHDR));
                    700:        if ( (scnhp = nalloc(len)) == NULL ) {
                    701:                printf("Not enough memory for the symbol string table.\n");
                    702:                return(NULL);
                    703:        }
                    704:        fseek(fp, scnh_off, 0);
                    705:        if ( fread(scnhp, len, 1, fp) != 1) {
                    706:                printf("Unable to read section headers.\n");
                    707:                return(NULL);
                    708:        }
                    709:        return(scnhp);
                    710: }
                    711: 
                    712: coff_to_lout(coffsymp, ldsp, str_tabp, scnhp)
                    713: SYMENT         *coffsymp;
                    714: struct LDSYM   *ldsp;
                    715: char           *str_tabp;
                    716: SCNHDR         *scnhp;
                    717: {
                    718:        char    *cp;
                    719:        char    w1[SYMNMLEN+1];
                    720:        
                    721:        cp = symName(coffsymp, w1, str_tabp);
                    722:        memcpy(ldsp->ls_id, cp, NCPLN-1);
                    723:        ldsp->ls_id[NCPLN-1] = '\0';
                    724: 
                    725:        switch((int)scnhp[coffsymp->n_scnum-1].s_flags) {
                    726:        case STYP_TEXT:
                    727:                ldsp->ls_type = L_GLOBAL + L_SHRI;
                    728:                break;
                    729:        case STYP_DATA:
                    730:                ldsp->ls_type = L_GLOBAL + L_PRVD;
                    731:                break;
                    732:        case STYP_BSS:
                    733:                ldsp->ls_type = L_GLOBAL + L_BSSD;
                    734:                break;
                    735:        default:
                    736:                ldsp->ls_type = -1;
                    737:                panic("Unallowed section flag in coff header");
                    738:        }
                    739: 
                    740:        ldsp->ls_addr = (long)coffsymp->n_value;
                    741: }
                    742: 
                    743: /*
                    744:  * Symbol name.
                    745:  */
                    746: static char *
                    747: symName(sym, work, str_tabp)
                    748: SYMENT *sym;
                    749: char   *work;
                    750: char   *str_tabp;
                    751: {
                    752:        if (!sym->n_zeroes) {
                    753:                return (str_tabp + sym->n_offset - 4);
                    754:        }
                    755: 
                    756:        /* make sure it's zero terminated */
                    757:        memcpy(work, sym->n_name, SYMNMLEN);
                    758:        work[SYMNMLEN] = '\0';
                    759:        return (work);
                    760: }
                    761: 
                    762: /* end of trace1.c */

unix.superglobalmegacorp.com

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