Annotation of researchv9/jerq/sgs/ld/ld00.c, revision 1.1.1.1

1.1       root        1: static char ID[] = "@(#) ld00.c: 1.17 8/18/83";
                      2: #include "system.h"
                      3: 
                      4: #include <stdio.h>
                      5: 
                      6: #if TS || RT
                      7: #include <ar.h>
                      8: #else
                      9: #include <archive.h>
                     10: #endif
                     11: 
                     12: #include "structs.h"
                     13: #include "extrns.h"
                     14: #include "list.h"
                     15: #include "ldfcn.h"
                     16: #include "sgs.h"
                     17: #include "sgsmacros.h"
                     18: #include "paths.h"
                     19: #include "y.tab.h"
                     20: 
                     21: extern FILE *yyin;     /* current lex input file */
                     22: extern char inline[];  /* current input line up to current token */
                     23: extern int yychar;     /* current yacc lookahead token number */
                     24: 
                     25: extern int in_y_exp;   /*
                     26:                         *      See explanation in ld.yac.
                     27:                         *      We must initialize this var. to zero
                     28:                         *      before parsing an ifile.
                     29:                         */
                     30: 
                     31: #if FLEXNAMES
                     32: #      define STRINCRE 2048
                     33: #else
                     34: #      define STRINCRE 1024
                     35: #endif
                     36: #define MAXINFLS 16
                     37: #define MAXDLEN 64     /* maximum lib search directory length*/
                     38: 
                     39: #ifndef LLIBDIR
                     40: #define LLIBDIR LIBDIR
                     41: #endif
                     42: #ifndef NDELDIRS
                     43: #define NDELDIRS       1
                     44: #endif
                     45: 
                     46: extern char *realloc();
                     47: 
                     48: static int nldirs = NDELDIRS;  /* number of -L options used    */
                     49: static char *libdirs[MAXLDIRS] = {     /* directories searched for libraries */
                     50:                        LLIBDIR
                     51: #ifdef LLIBDIR1
                     52:                        ,LLIBDIR1
                     53: #endif
                     54:                        };
                     55: 
                     56: 
                     57: /*
                     58:  * A stack is kept of input ifile discriptors so that
                     59:  * ifiles may include other ifiles.
                     60:  *
                     61:  * NOTE: currently, this only works if the ifile name
                     62:  *             is the last statement in an ifile, because YACC does
                     63:  *             not return from a recursive call properly.
                     64:  */
                     65: typedef struct instr INSTR;
                     66: struct instr {
                     67:        FILE *infildes;         /* file descriptor */
                     68:        char *infilnm;          /* ptr to file name */
                     69:        int lastlnno;           /* last line number read in the file */
                     70:        };
                     71: char whichin = 0;              /* index int instack */
                     72: INSTR instack[MAXINFLS+1];     /* stack of input ifiles */
                     73: /*eject*/
                     74: filespec(filename)
                     75: char *filename;
                     76: {
                     77: 
                     78: /*
                     79:  * This routine is called when there is an input directive to load a 
                     80:  * file. It checks the type of file, to distinguish between an ifile
                     81:  * and an object file
                     82:  */
                     83: 
                     84:        FILE *filedes;
                     85: #if PORTAR || PORT5AR
                     86:        unsigned short  firstword;
                     87:        char            atype[SARMAG];
                     88: #else
                     89:        unsigned short  firstword,
                     90:                        atype;
                     91: #endif
                     92: 
                     93: #if DEBUG
                     94:        if (dflag > 1)
                     95:                fprintf(stderr, "filespec : %s\n", filename);
                     96: #endif
                     97: 
                     98:        if ((filedes = fopen(filename,"r")) == NULL) {
                     99:                lderror(2,0,sname(curfilnm),"Can't open file %s for input", filename);
                    100:                return;
                    101:                }
                    102: 
                    103:        in_y_exp = 0;
                    104: 
                    105:        if (fread( (char *) &firstword, sizeof(firstword), 1, filedes) != 1)
                    106:                lderror(2,0,NULL,"Can't read 1st word of file %s",filename);
                    107: #if PORTAR || PORT5AR
                    108:        fseek(filedes,0L,0);
                    109:        if (fread(atype,SARMAG,1,filedes) != 1)
                    110:                atype[0] = '\0';
                    111: #else
                    112:        if ( sizeof(firstword) != sizeof(ARMAG) )
                    113:                if ( fread( (char *)&atype, sizeof(atype), 1, filedes) != 1)
                    114:                        atype = firstword;
                    115: #endif
                    116: 
                    117:        if (ISMAGIC(firstword)) {
                    118:                bldldfil( savefn(filename), 0 );
                    119:                fclose(filedes);
                    120:                }
                    121: #if PORTAR || PORT5AR
                    122:        else if (strncmp(atype,ARMAG,SARMAG) == 0) {
                    123: #else
                    124:        else if ( (firstword == (unsigned short) ARMAG) ||
                    125:                        ((sizeof(firstword) != sizeof(ARMAG)) &&
                    126:                         (atype == (unsigned short) ARMAG)) ) {
                    127: #endif
                    128:                bldldfil( savefn(filename), 1 );
                    129:                fclose(filedes);
                    130:                }
                    131:        else if (BADMAGIC(firstword)) {
                    132:                yyerror("file %s is of unknown type: magic number = %6.2x",
                    133:                        filename, firstword);
                    134:                fclose(filedes);
                    135:                }
                    136:        else {
                    137:                /*
                    138:                 * Assume that the file is an ifile
                    139:                 */
                    140:                instack[whichin].infilnm = curfilnm;
                    141:                instack[whichin].lastlnno = lineno;
                    142:                instack[whichin].infildes = filedes;
                    143:                curfilnm = savefn(filename);
                    144:                lineno = 1;
                    145:                if( ++whichin == MAXINFLS ) {
                    146:                        yyerror("ifile nesting limit exceeded with file %s", filename);
                    147:                        fclose(filedes);
                    148:                        curfilnm = instack[--whichin].infilnm;
                    149:                        lineno = instack[whichin].lastlnno++;
                    150:                        return;
                    151:                        }
                    152: 
                    153:                if (fseek(filedes, 0L, 0) != 0)
                    154:                        lderror(2,0,NULL,"Can't seek to the beginning of file %s",
                    155:                        filename);
                    156:                yyin = filedes;
                    157: 
                    158: #if DEBUG
                    159:                if( dflag )
                    160:                        fprintf(stderr, "reading cmds from file %s (%.2o)\n",
                    161:                              filename, filedes);
                    162: #endif
                    163: 
                    164:                yyparse();
                    165:                close(filedes);
                    166: 
                    167:                yyin = instack[--whichin].infildes;
                    168:                curfilnm = instack[whichin].infilnm;
                    169:                lineno = instack[whichin].lastlnno++;
                    170:                yychar = -1;
                    171: 
                    172: #if DEBUG
                    173:                if( dflag )
                    174:                        fprintf(stderr, "returning input to fildes %s (%.2o)\n",
                    175:                                curfilnm, yyin);
                    176: #endif
                    177: 
                    178:                }
                    179: }
                    180: /*eject*/
                    181: bldldfil(fname, typflag)
                    182: char *fname;
                    183: int typflag;
                    184: {
                    185: 
                    186: /*
                    187:  * Build a LDFILE action item
                    188:  */
                    189: 
                    190:        ACTITEM *p;
                    191: 
                    192:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
                    193: 
                    194:        p->ldlbry.aiinflnm = curfilnm;
                    195:        p->ldlbry.aiinlnno = lineno;
                    196:        p->ldlbry.aitype = typflag ? AILDLBRY : AILDFILE;
                    197:        p->ldlbry.aifilnam = fname;
                    198: 
                    199:        listadd(l_AI, &ldfilist, p);
                    200: }
                    201: 
                    202: 
                    203: 
                    204: 
                    205: bldadscn(scname, fname, sp)
                    206: char *scname;
                    207: char *fname;
                    208: ACTITEM *sp;           /* ptr to DFNSCN act_item */
                    209: {
                    210: 
                    211: /*
                    212:  * Build a ADDSCN action item
                    213:  */
                    214: 
                    215:        ACTITEM *p;
                    216: 
                    217:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
                    218: 
                    219:        p->addscn.aitype = AIADDSCN;
                    220:        p->addscn.aiinflnm = curfilnm;
                    221:        p->addscn.aiinlnno = lineno;
                    222:        copy(p->addscn.ainame, scname, sizeof(p->addscn.ainame));
                    223:        p->addscn.aiscfile = fname;
                    224: 
                    225:        listadd(l_AI, &(sp->dfnscn.sectspec), p);
                    226: }
                    227: 
                    228: 
                    229: 
                    230: 
                    231: ACTITEM *
                    232: bldadfil(fname, sp)
                    233: char *fname;
                    234: ACTITEM *sp;           /* ptr to DFNSCN act_item */
                    235: {
                    236: 
                    237: /*
                    238:  * Build a ADFILE action item
                    239:  */
                    240: 
                    241:        ACTITEM *p;
                    242: 
                    243:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
                    244: 
                    245:        p->adfile.aitype = AIADFILE;
                    246:        p->adfile.aiinflnm = curfilnm;
                    247:        p->adfile.aiinlnno = lineno;
                    248:        p->adfile.aifilnam = fname;
                    249: 
                    250:        listadd(l_AI, &(sp->dfnscn.sectspec), p);
                    251: 
                    252:        return (p);
                    253: }
                    254: 
                    255: 
                    256: 
                    257: 
                    258: bldexp(ep, lp)
                    259: ENODE *ep;
                    260: LISTOWN *lp;
                    261: {
                    262: 
                    263: /*
                    264:  * Build an EVEXPR action item
                    265:  */
                    266: 
                    267:        ACTITEM *p;
                    268: 
                    269:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
                    270: 
                    271:        p->evexpr.aitype = AIEVEXPR;
                    272:        p->evexpr.aiinlnno = lineno;
                    273:        p->evexpr.aiinflnm = curfilnm;
                    274:        p->evexpr.aiexptr = ep;
                    275: 
                    276:        listadd(l_AI, lp, p);
                    277: }
                    278: 
                    279: 
                    280: 
                    281: 
                    282: bldsym(sym, value, op)
                    283: char *sym;
                    284: long value;
                    285: int op;
                    286: {
                    287: 
                    288: /*
                    289:  * Build an DFNSYM action item
                    290:  */
                    291: 
                    292:        ACTITEM *p;
                    293: 
                    294:        p = (ACTITEM *) myalloc(sizeof(ACTITEM));
                    295: 
                    296:        p->dfnsym.aitype = AIDFNSYM;
                    297:        p->dfnsym.aiinlnno = lineno;
                    298:        p->dfnsym.aiinflnm = curfilnm;
                    299:        p->dfnsym.aisymbol = savefn(sym);
                    300:        p->dfnsym.aideflag = op;
                    301:        p->dfnsym.aidefval = value;
                    302: 
                    303:        listadd(l_AI, &symlist, p);
                    304: }
                    305: /*eject*/
                    306: pflags(flgname, ifile) 
                    307: char *flgname;         /* ptr to x, extracted from -x */
                    308: int ifile;             /* set TRUE iff the flag comes from an ifile */
                    309: {
                    310: 
                    311: /*
                    312:  * Process flag specifications
                    313:  *
                    314:  * Note that flags can come from two sources:
                    315:  *     command line : everything is character strings
                    316:  *            ifile : parser has already converted tokens to binary
                    317:  */
                    318: 
                    319:        register int type;
                    320: 
                    321: 
                    322: /*
                    323:  *     -a              : make the output file "executable":
                    324:  *                             1. complain about unresolved references
                    325:  *                             2. define several "_xxxx" symbols
                    326:  *
                    327:  *     -cn             : increment the partial execution flag.  'n'
                    328:  *                             defaults to 1:
                    329:  *                             0 : normal, complete ld execution
                    330:  *                             1 : execute parser of PASS 1 only
                    331:  *                             2 : execute PASS 1 only
                    332:  *                             3 : execute through allocation (up
                    333:  *                                     to output())
                    334:  *                             4 : complete ld execution, with
                    335:  *                                     /dev/null as the output
                    336:  *                                     file name
                    337:  *
                    338:  *     -dn (-b for u3b): increment the internal ld debug flag. 'n'
                    339:  *                             defaults to 1
                    340:  *
                    341:  *     -e name         : generate a UNIX a.out header in the optional
                    342:  *                             header field of the output file, and
                    343:  *                             set the "entry point" entry to the 
                    344:  *                             address of the symbol "name".  This
                    345:  *                             flag forces the flag -X
                    346:  *
                    347:  *     -f 0xaabb       : use the two-byte value aabb to:
                    348:  *                             1. fill "holes" between sections
                    349:  *                             2. fill uninitialized .bss sections
                    350:  *
                    351:  *     -h nnn          : make the optional header field nnn bytes in
                    352:  *                             size. Zero fill any unused bytes of this
                    353:  *                             header
                    354:  *
                    355:  *     -i              : ***** b16ld and x86ld only *****
                    356:  *                             use two regions, to give separate I and
                    357:  *                             D space (64 K each)
                    358:  *
                    359:  *     -lx             : search the library libx.a in directory
                    360:  *                             libdirs[n] for any symbols which can
                    361:  *                             satisfy outstanding unresolved references.
                    362:  *
                    363:  *     -m              : generate a memory map
                    364:  *
                    365:  *     -o name         : use "name" as the name of the output file.
                    366:  *                             The default value is given by the
                    367:  *                             constant A.OUT, defined in the include
                    368:  *                             file paths.h
                    369:  *
                    370:  *     -p[nnn]         : generate a patch list. The size of the
                    371:  *                             optional header is increased by the
                    372:  *                             size of the patch list
                    373:  *                       the output section size is set to nnn
                    374:  *                             after allocation and patch list
                    375:  *                             construction to save physical memory
                    376:  *
                    377:  *     -r              : keep relocation information in the output file
                    378:  *
                    379:  *     -s              : strip all relocation and symbol table 
                    380:  *                             information from the output file
                    381:  *
                    382:  *     -t              : ****** UNIX only ******
                    383:  *                             do type checking
                    384: 
                    385:  *     -tv             : ***** b16ld/x86ld/n3bld only *****
                    386:  *                             generate TV function linkage
                    387:  *
                    388:  *     -x (only u3b)   : do not preserve symbols in the output symbol
                    389:  *                             table except static or external symbols
                    390:  *
                    391:  *     -u name         : add "name" to ld's symbol table, as an
                    392:  *                             undefined symbol
                    393:  *
                    394:  *     -z              : ****** UNIX only ******
                    395:  *                             leave memory around zero unconfigured ro catch
                    396:  *                       null pointers
                    397:  *
                    398:  *     -B nn           : generate "padding" output sections of nn bytes
                    399:  *                             of zero following any output section
                    400:  *                             which is either:
                    401:  *                             1. of zero length
                    402:  *                             2. all of uninitialzed .bss 
                    403:  *
                    404:  *     -F              : ****** UNIX only ******
                    405:  *                             indicate in header file for paging, block
                    406:  *                             for paging, memory configure for paging, etc.
                    407:  *
                    408:  *     -H              : change the type of all global symbol table
                    409:  *                             entries to "static"
                    410:  *
                    411:  *     -L<path>        : provides alternate directories and orders
                    412:  *                       search path for libraries (equivalent to
                    413:  *                       -I flag for cpp includes). -L must precede
                    414:  *                       -l to be effective.
                    415:  *
                    416:  *     -M              : ****** UNIX only *****
                    417:  *                             output message if external variables are
                    418:  *                             multiply defined
                    419:  *
                    420:  *     -N              : squash text and data together
                    421:  *
                    422:  *     -S              : "silent" mode: only fatal errors will be 
                    423:  *                             listed - not warnings or diagnostics
                    424:  *
                    425:  *     -V              : output current ld environment definition. '-V'
                    426:  *                             flags are cumulative:
                    427:  *                             1 : describe the ld version
                    428:  *                             2 : describe the machine and os version
                    429:  *
                    430:  *     -VS nn          : put nn as version stamp in the optional header
                    431:  *
                    432:  *     -X              : generate, in the optional header field, a
                    433:  *                             standard UNIX a.out header
                    434:  *                             (except for u3b, where it means
                    435:  *                              elimate compiler generated labels)
                    436:  *
                    437:  *     -ild            : generate an "extra" output section for each
                    438:  *                             unallocated area of configured memory
                    439:  *
                    440:  */
                    441: 
                    442:        switch (flgname[0]) {
                    443: #if !UNIX || M32
                    444:                case 'a':
                    445:                        aflag++;
                    446:                        break;
                    447: #endif
                    448: #if !ONEPROC
                    449:                case 'c':
                    450:                        type = 1;
                    451:                        if( flgname[1] )
                    452:                                if( (type = stoi(&flgname[1])) == 0x8000 ) {
                    453:                                        yyerror("-c flag does not specify a number: %s", &flgname[1]);
                    454:                                        type = 1;
                    455:                                        }
                    456:                        cflag += type;
                    457:                        break;
                    458: #endif
                    459: #if DEBUG
                    460:                case 'd':
                    461: #if UNIX
                    462:                        lderror(0,0,NULL,"-d flag is not implemented");
                    463:                        break;
                    464:                case 'b':
                    465: #endif
                    466:                        type = 1;
                    467:                        if( flgname[1] )
                    468:                                if( (type = stoi(&flgname[1])) == 0x8000 ) {
                    469:                                        yyerror("-%c flag does not specify a number: %s", flgname[0],flgname[1]);
                    470:                                        type = 1;
                    471:                                        }
                    472:                        dflag += type;
                    473:                        break;
                    474: #endif
                    475:                case 'e':
                    476:                        if( ifile )
                    477:                                if (yylex() != NAME)
                    478:                                        yyerror("-e flag does not specify a legal symbol name: %s", inline);
                    479:                                else
                    480: #if FLEXNAMES
                    481:                                        strcpy(epsymbol, yylval.sptr);
                    482: #else
                    483:                                        copy(epsymbol, yylval.sptr, 8);
                    484: #endif
                    485:                        else {
                    486: #if FLEXNAMES
                    487:                                strcpy(epsymbol, *++argptr);
                    488: #else
                    489:                                copy(epsymbol, *++argptr, 8);
                    490: #endif
                    491:                                argcnt--;
                    492:                                }
                    493:                        Xflag++;
                    494: #if DEBUG
                    495:                        if (dflag)
                    496:                                fprintf(stderr, "a.out entry point symbol: %s\n",
                    497:                                        epsymbol);
                    498: #endif
                    499:                        break;
                    500:                case 'f':
                    501:                        if( ifile )
                    502:                                if (yylex() != LONGINT)
                    503:                                        yyerror("-f flag does not specify a two-byte number: %s", inline);
                    504:                                else
                    505:                                        globfill = (short) *yylval.lptr;
                    506:                        else {
                    507:                                if( (globfill = (short) stoi(*++argptr)) == (short) 0x8000 ) {
                    508:                                        yyerror("-f flag does not specify a two-byte number: %s", *argptr);
                    509:                                        globfill = 0;
                    510:                                        }
                    511:                                argcnt--;
                    512:                                }
                    513: #if DEBUG
                    514:                        if (dflag)
                    515:                                fprintf(stderr, "global fill: %.2x\n",
                    516:                                        globfill);
                    517: #endif
                    518:                        break;
                    519: #if !UNIX
                    520:                case 'h':
                    521:                        if( ifile )
                    522:                                if (yylex() != LONGINT)
                    523:                                        yyerror("-h flag does not specify a numeric value: %s", inline);
                    524:                                else 
                    525:                                        hflag = *yylval.lptr;
                    526:                        else {
                    527:                                if( (hflag = stoi(*++argptr)) == 0x8000 ) {
                    528:                                        yyerror("-h flag does not specify a numeric value: %s", *argptr);
                    529:                                        hflag = 0;
                    530:                                        }
                    531:                                argcnt--;
                    532:                                }
                    533:                        if( hflag < 0 ) {
                    534:                                yyerror("invalid value on -h flag: %.2x", hflag);
                    535:                                hflag = 0;
                    536:                                }
                    537: #if DEBUG
                    538:                        if(dflag)
                    539:                                fprintf(stderr, "optional header size: %d\n",
                    540:                                        hflag);
                    541: #endif
                    542:                        break;
                    543: #endif
                    544:                case 'i':
                    545: #if IANDD
                    546:                        if (flgname [1] == '\0')
                    547:                                {
                    548:                                iflag++;
                    549:                                break;
                    550:                                }
                    551: #endif
                    552: #if ILDOPT
                    553:                        if (flgname [1] == 'l' && flgname [2] == 'd')
                    554:                                {
                    555:                                ildflag++;
                    556:                                break;
                    557:                                }
                    558: 
                    559:                        yyerror("%s is an invalid flag",flgname);
                    560: #endif
                    561:                        break;
                    562:                case 'l':
                    563:                        if( flgname[1] != '\0' ) {
                    564:                                library(flgname);
                    565:                                }
                    566:                        else  {
                    567:                                specflags(flgname, argptr);
                    568:                                }
                    569:                        break;
                    570:                case 'm':
                    571:                        mflag++;
                    572:                        break;
                    573: #if !UNIX
                    574:                case 'p':
                    575:                        pflag = -1;     /* use default patch size */
                    576:                        if( flgname[1] ) {
                    577:                                if( (pflag = stoi(&flgname[1])) == 0x8000 ) {
                    578:                                        yyerror("-p flag does not specify a number: %s", &flgname[1]);
                    579:                                        pflag = -1;
                    580:                                } else {
                    581:                                        if (pflag <= 0) {
                    582:                                                yyerror("-p flag size out of range: %s", &flgname[1]);
                    583:                                                pflag = -1;
                    584:                                                }
                    585:                                        } /* else */
                    586:                                } /* if flgname */
                    587:                        break;
                    588: #endif
                    589:                case 'o':       
                    590:                        if( ifile ) {
                    591:                                type = yylex();
                    592:                                if( (type == FILENAME)  ||  (type == NAME) )
                    593:                                        copy(outfilnm, yylval.sptr, 128);
                    594:                                else
                    595:                                        yyerror("-o flag does not specify a valid file name: %s", inline);
                    596:                                }
                    597:                        else {
                    598:                                copy(outfilnm, *++argptr, 128);
                    599:                                argcnt--;
                    600:                                }
                    601:                        if( outfilnm[127] != '\0' ) {
                    602:                                outfilnm[127] = '\0';
                    603:                                yyerror("-o file name too large (> 128 char); truncated to (%s)", outfilnm);
                    604:                                }
                    605: #if DEBUG
                    606:                        if(dflag)
                    607:                                fprintf(stderr, "output file name: %s\n",
                    608:                                        outfilnm);
                    609: #endif
                    610:                        break;
                    611:                case 'r':
                    612:                        rflag++;
                    613:                        break;
                    614:                case 's':
                    615:                        sflag++;
                    616:                        break;
                    617:                case 't':
                    618: #if TRVEC
                    619:                        if (flgname[1] == 'v') {
                    620:                                tvflag = 1;
                    621:                                magic = (unsigned short) TVMAGIC;
                    622:                                break;
                    623:                                }
                    624: #endif
                    625: #if COMMON
                    626:                        tflag++;
                    627: #endif
                    628:                        break;
                    629:                case 'u':       
                    630:                        if( ifile )
                    631:                                if( yylex() != NAME )
                    632:                                        yyerror("-u flag does not specify a legal symbol name: %s", inline);
                    633:                                else
                    634:                                        bldsym(yylval.sptr, 0L, 0);
                    635:                        else {
                    636:                                bldsym(*++argptr, 0L, 0);
                    637:                                argcnt--;
                    638:                                }
                    639:                        break;
                    640: #if PAGING
                    641:                case 'z':
                    642:                        zflag++;
                    643:                        break;
                    644: #endif
                    645: #if !UNIX
                    646:                case 'B':
                    647:                        if( ifile )
                    648:                                if (yylex() != LONGINT)
                    649:                                        yyerror("-B flag does not specify a number: %s", inline);
                    650:                                else
                    651:                                        Bflag = *yylval.lptr;
                    652:                        else {
                    653:                                if( (Bflag = stoi(*++argptr)) == 0x8000 ) {
                    654:                                        yyerror("-B flag does not specify a number: %s", *argptr);
                    655:                                        Bflag = 0;
                    656:                                        }
                    657:                                argcnt--;
                    658:                                }
                    659: #if DEBUG
                    660:                        if (dflag)
                    661:                                fprintf(stderr, "pad-section size: %.2x\n",
                    662:                                        Bflag);
                    663: #endif
                    664:                        break;
                    665:                case 'H':
                    666:                        Hflag++;
                    667:                        break;
                    668: #endif
                    669: #if PAGING
                    670:                case 'F':
                    671:                        Fflag++;
                    672:                        break;
                    673: #endif
                    674: #if COMMON
                    675:                case 'M':
                    676:                        Mflag++;
                    677:                        break;
                    678: #endif
                    679:                case 'N':
                    680:                        Nflag++;
                    681:                        break;
                    682:                case 'L':
                    683:                        if ( nldirs >= MAXLDIRS )
                    684:                                yyerror("too many -L options, %d allowed", MAXLDIRS-1);
                    685:                        else if ( flgname[1] == NULL )
                    686:                                yyerror("no directory given with -L");
                    687:                        else if ( strlen(&flgname[1]) > MAXDLEN )
                    688:                                yyerror("-L path too long(%s)", &flgname[1]);
                    689:                        else {
                    690:                                libdirs[nldirs] = myalloc(size(&flgname[1]));
                    691:                                strcpy(libdirs[nldirs++], &flgname[1]);
                    692:                                }
                    693:                                break;
                    694:                case 'S':
                    695:                        Sflag++;
                    696:                        break;
                    697:                case 'V':
                    698:                        if (flgname[1] == 'S')  {
                    699:                                if( ifile )
                    700:                                        if (yylex() != LONGINT)
                    701:                                                yyerror("-VS flag does not specify a numeric value: %s", inline);
                    702:                                        else 
                    703:                                                VSflag = *yylval.lptr;
                    704:                                else {
                    705:                                        if( (VSflag = stoi(*++argptr)) == 0x8000 ) {
                    706:                                                yyerror("-VS flag does not specify a numeric value: %s", *argptr);
                    707:                                                VSflag = 0;
                    708:                                                }
                    709:                                        argcnt--;
                    710:                                        }
                    711:                                }
                    712:                        else  {
                    713:                                Vflag++;
                    714:                                }
                    715:                        break;
                    716: #if !UNIX
                    717:                case 'X':
                    718:                        Xflag++;
                    719:                        break;
                    720: #endif
                    721:                default:
                    722:                        specflags(flgname, argptr);
                    723:                }
                    724: }
                    725: /*eject*/
                    726: library(fname)
                    727: char *fname;
                    728: {
                    729: 
                    730: /*
                    731:  * For a library flag of the form "-lx", build a file name of the form
                    732:  *
                    733:  *             "libdirs[n]/libx.a"
                    734:  *
                    735:  * where libdirs[0] is LIBDIR (defined in paths.h) and libdirs[n>0]
                    736:  * are defined using the -L option. Then build a LDFILE action item.
                    737:  */
                    738: 
                    739:        static char libname[MAXDLEN+16];        /* -lx file name */
                    740:        int dndx;
                    741:        char *p;
                    742:        FILE *lfd;
                    743: 
                    744:        if ( *(++fname) == '\0' ) {
                    745:                yyerror("the -l flag (specifying a default library) is not supported");
                    746:                return;
                    747:                }
                    748:        else
                    749:                p = fname;
                    750: 
                    751:        /*
                    752:         *  Loop thru libdir[NDELDIRS] thru libdir[nldirs-1]
                    753:         */
                    754:        for ( dndx = NDELDIRS; dndx < nldirs; dndx++)  {
                    755:                sprintf(libname, "%s%s%.8s%s", libdirs[dndx], "/lib", p, ".a");
                    756:                if ( (lfd = fopen(libname,"r")) != NULL)
                    757:                        goto liblab;
                    758:                }
                    759: 
                    760:        /*
                    761:         *  loop thru libdirs[0] thru libdirs[NDELDIRS-1]
                    762:         */
                    763:        for ( dndx = 0; dndx < NDELDIRS; dndx++)  {
                    764:                sprintf(libname, "%s%s%.8s%s", libdirs[dndx], "/lib", p, ".a");
                    765:                if ( (lfd = fopen(libname,"r")) != NULL)
                    766:                        goto liblab;
                    767:                }
                    768: 
                    769:        yyerror("can't find library lib%s.a", p);
                    770:        return;
                    771: 
                    772:        liblab:
                    773:                fclose(lfd);
                    774:                bldldfil(savefn(libname), 1);
                    775: }
                    776: /*eject*/
                    777: char *
                    778: savefn(name)
                    779: char *name;
                    780: {
                    781: 
                    782: /*
                    783:  * Save the name of an ifile or input *.o or archive file
                    784:  */
                    785: 
                    786:        char *strbeg;
                    787:        int length;
                    788: 
                    789:        length = strlen(name) + 1;
                    790:        if (strnext + length > strlimit)
                    791:        {
                    792: #if ONEPROC
                    793:                strbase = myalloc( STRINCRE );
                    794:                strnext = strbase;
                    795:                strlimit = strbase + STRINCRE;
                    796: #else
                    797:                lderror( 0, 0, NULL, "too many strings, out of space" );
                    798:                lderror( 2, 0, NULL, "%sld run is too large and complex", SGS );
                    799: #endif
                    800:        }
                    801:        strbeg = strnext;
                    802:        strncpy( strbeg, name, length );
                    803:        strnext += length;
                    804: 
                    805:        return( strbeg );
                    806: }

unix.superglobalmegacorp.com

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