Changeset 546


Ignore:
Timestamp:
Aug 8, 2003, 12:26:44 AM (22 years ago)
Author:
bird
Message:

#483: Completed workaround for ilink crash.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/src/emxomf/weakld.c

    • Property cvs2svn:cvs-rev changed from 1.19 to 1.20
    r545 r546  
    237237        WLDSF_EXPORT    = 0x1000,
    238238
    239         /** Internal flag to say that we've already aliased this weak 
     239        /** Internal flag to say that we've already aliased this weak
    240240         * in the definition file.
    241241         */
     
    948948                pWld->ppObjsAdd = &pMod->pNext;
    949949
    950                 rc = pass1ReadOMFMod(pWld, pMod, 0);
     950                rc = pass1ReadOMFMod(pWld, pMod, 1);
    951951                if (rc)
    952952                {
     
    13971397    {
    13981398        /* @todo: this isn't 100% correct when we're talking case in sensitivity. */
    1399         unsigned uHash = symHash(psz, cch); 
     1399        unsigned uHash = symHash(psz, cch);
    14001400        for (pSym = pWld->Global.ap[uHash]; pSym; pSym = pSym->pHashNext)
    14011401        {
     
    29552955        "DGROUP",                       /* 9 */
    29562956    };
    2957 #endif 
     2957#endif
    29582958
    29592959    /* THEADR */
     
    29812981    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    29822982    {
    2983         wldErr(pWld, "Error occured while writing weak aliases. (4.1)");
     2983        wldErr(pWld, "Error occured while writing weak aliases. (5)");
    29842984        return -1;
    29852985    }
     
    29962996    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    29972997    {
    2998         wldErr(pWld, "Error occured while writing weak aliases. (4.1)");
     2998        wldErr(pWld, "Error occured while writing weak aliases. (6)");
    29992999        return -1;
    30003000    }
     
    30133013    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30143014    {
    3015         wldErr(pWld, "Error occured while writing weak aliases. (5)");
     3015        wldErr(pWld, "Error occured while writing weak aliases. (7)");
    30163016        return -1;
    30173017    }
     
    30283028    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30293029    {
    3030         wldErr(pWld, "Error occured while writing weak aliases. (6)");
     3030        wldErr(pWld, "Error occured while writing weak aliases. (8)");
    30313031        return -1;
    30323032    }
     
    30433043    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30443044    {
    3045         wldErr(pWld, "Error occured while writing weak aliases. (6)");
     3045        wldErr(pWld, "Error occured while writing weak aliases. (9)");
    30463046        return -1;
    30473047    }
     
    30583058    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30593059    {
    3060         wldErr(pWld, "Error occured while writing weak aliases. (6)");
     3060        wldErr(pWld, "Error occured while writing weak aliases. (10)");
    30613061        return -1;
    30623062    }
     
    30693069    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30703070    {
    3071         wldErr(pWld, "Error occured while writing weak aliases. (6)");
     3071        wldErr(pWld, "Error occured while writing weak aliases. (11)");
    30723072        return -1;
    30733073    }
     
    30773077    omf.hdr.cb = 6;
    30783078    omf.ach[0] = 9;                     /* "DGROUP" LNAME index */
    3079     omf.ach[1] = 0xff; 
     3079    omf.ach[1] = 0xff;
    30803080    omf.ach[2] = 3;                     /* "BSS32" SEGDEF index */
    3081     omf.ach[3] = 0xff; 
     3081    omf.ach[3] = 0xff;
    30823082    omf.ach[4] = 2;                     /* "DATA32" SEGDEF index */
    30833083    omf.ach[5] = 0;                     /* crc */
    30843084    if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
    30853085    {
    3086         wldErr(pWld, "Error occured while writing weak aliases. (6)");
     3086        wldErr(pWld, "Error occured while writing weak aliases. (12)");
    30873087        return -1;
    30883088    }
    3089 #endif 
     3089#endif
    30903090
    30913091    return 0;
     
    31263126        return -1;
    31273127    }
    3128 #endif 
     3128#endif
    31293129
    31303130    /* MODEND */
     
    31823182        {
    31833183            OMFREC  hdr;
    3184             union 
     3184            union
    31853185            {
    31863186                char        ach[640];
     
    32073207
    32083208        /* end the current object? */
    3209         if ((pWld->fFlags & WLDC_LINKER_LINK386) && pParam->cAliases >= 1)//32)
     3209        if ((pWld->fFlags & WLDC_LINKER_LINK386) && pParam->cAliases >= 32)
    32103210        {
    32113211            int rc = wldObjEnd(pWld, pParam->phFile, 32);
     
    32143214            pParam->cAliases = 0;
    32153215        }
    3216        
     3216
    32173217        /* make new object ? */
    32183218        if (!pParam->cAliases)
     
    33433343            if (fputs(szTmp, pParam->phNewFile) < 0)
    33443344                return wldErr(pParam->pWld, "Write error.");
    3345            
     3345
    33463346            /* skip line */
    33473347            pParam->iLine++;
     
    35203520                {
    35213521                    OMFREC  hdr;
    3522                     union 
     3522                    union
    35233523                    {
    35243524                        char        ach[256];
     
    35323532                if (pWld->fFlags & WLDC_LINKER_LINK386)
    35333533                {
    3534                     /* Write library file header. */
     3534                    /* Write library file header.
     3535                     * Link386 have trouble with too many aliases in one object. So we
     3536                     * generate a library of objects.
     3537                     */
    35353538                    memset(&omf, 0, sizeof(omf));
    35363539                    omf.hdr.chType = LIBHDR;
     
    35493552                if (!rc)
    35503553                {
    3551                     /* 
    3552                      * Make aliases 
     3554                    /*
     3555                     * Make aliases
    35533556                     */
    35543557                    offAlias = ftell(phFile);       /* save this to see if anything is added. */
     
    35613564                    if (!rc)
    35623565                    {
    3563                         /* Check if we need to fake a lot's of externals for working around an ILINK bug. */
     3566                        /* Check if we need to fake a lot's of externals for working around an ILINK bug.
     3567                         * See defect #483 for details. Short summary: an array calculation in ilink is
     3568                         * assuming that library objects have less EXTDEFs than the object ones. So, for
     3569                         * pass2 an EXTDEF array may become too short.
     3570                         */
    35643571                        if (pWld->cMaxObjExts < pWld->cMaxLibExts && !(pWld->fFlags & WLDC_LINKER_LINK386))
    35653572                        {
     
    35713578                            }
    35723579
    3573                             /* issue a shitload of extdefs. */
     3580                            /* issue a lot's of extdefs. */
    35743581                            omf.hdr.chType = EXTDEF;
    3575                             omf.ach[0] = strlen("WEAK$ZERO");
    3576                             memcmp(&omf.ach[1], "WEAK$ZERO", omf.ach[0]);
    3577                             omf.ach[omf.ach[0] + 2] = 0;
    3578                             omf.hdr.cb = omf.ach[0] + 3;
    3579                             for (i = 0; i < pWld->cMaxLibExts; i++)
     3582                            omf.hdr.cb = 0;
     3583                            for (i = 0; i < 10; i++)
    35803584                            {
     3585                                omf.ach[omf.hdr.cb] = 9;                            /* string length  */
     3586                                memcpy(&omf.ach[omf.hdr.cb + 1], "WEAK$ZERO", 9);   /* external */
     3587                                omf.ach[omf.hdr.cb + 9 + 1] = 0;                    /* typeidx */
     3588                                omf.hdr.cb += 9 + 2;
    35813589                            }
     3590                            omf.ach[omf.hdr.cb++] = 0;                              /* crc */
     3591                            for (i = pWld->cMaxLibExts + 3; i > 0; i -= 10)
     3592                                if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
     3593                                {
     3594                                    wldErr(pWld, "Failed to write to '%s'.", pszObjName);
     3595                                    rc = -1;
     3596                                    break;
     3597                                }
    35823598                        }
    35833599
     3600                        /* Did we actually write anything to the file? */
    35843601                        if (ftell(phFile) != offAlias)
    35853602                        {
    3586                             /* end the last object? */
     3603                            /* Complete last object file? */
    35873604                            if (pWld->fFlags & WLDC_LINKER_LINK386)
    35883605                            {
Note: See TracChangeset for help on using the changeset viewer.