Changeset 1098


Ignore:
Timestamp:
Jan 28, 2004, 5:28:02 PM (22 years ago)
Author:
bird
Message:

#861: Fixed selfrefering alias issue. Improved the unresolved external reporting. Free symbols upon linker destruction.

File:
1 edited

Legend:

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

    • Property cvs2svn:cvs-rev changed from 1.23 to 1.24
    r1097 r1098  
    246246    PWLDMOD             pMod;
    247247
     248    /** Array of modules refering this symbol. */
     249    PWLDMOD *           paReferers;
     250
     251    /** Number of modules in the array. */
     252    unsigned            cReferers;
     253
    248254    /** Per type data union */
    249255    union type_data
     
    436442static int          symSearchLibEnum(PWLD pWld, PWLDSYM pSym, void *pvUser);
    437443static inline unsigned symHash(const char* pszSym, unsigned cch);
    438 #ifdef WLD_ENABLED_DBG
     444static const char * symGetDescr(PWLDSYM pSym);
    439445static void         symDbg(PWLDSYM pSym, const char *pszMsg);
    440 #endif
    441446static PWLDSYM      symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMACTION peAction);
    442447static PWLDSYM      symAddImport(PWLD pWld, PWLDMOD pMod, int fLibSearch,
     
    13481353
    13491354    if (pMod)
    1350         modErr(pMod, "Unresolved symbol '%s'.", pSym->pszName);
     1355        modErr(pMod, "Unresolved symbol (%s) '%s'.", symGetDescr(pSym), pSym->pszName);
    13511356    else
    1352         wldErr(pWld, "Unresolved symbol '%s'.", pSym->pszName);
     1357        wldErr(pWld, "Unresolved symbol (%s) '%s'.", symGetDescr(pSym), pSym->pszName);
     1358    if (pSym->cReferers)
     1359    {
     1360        int     i;
     1361        wldInfo("The symbol is referenced by:\n");
     1362        for (i = 0; i < pSym->cReferers; i++)
     1363        {
     1364            pMod = pSym->paReferers[i];
     1365            if (pMod->pLib)
     1366                fprintf(stderr, "    %s(%s)\n", pMod->pLib->pszLibName, pMod->pszModName);
     1367            else
     1368                fprintf(stderr, "    %s\n", pMod->pszModName);
     1369        }
     1370    }
    13531371    return 0;
    13541372}
     
    14111429
    14121430
    1413 
    1414 
    1415 
    1416 
    1417 
    1418 #ifdef WLD_ENABLED_DBG
     1431/**
     1432 * Makes a description of the symbol.
     1433 *
     1434 * @returns Pointer to static string buffer.
     1435 * @param   pSym    Symbol to describe.
     1436 */
     1437static const char *symGetDescr(PWLDSYM pSym)
     1438{
     1439    static char szDesc[256];
     1440    char *psz = &szDesc[0];
     1441
     1442    switch (pSym->fFlags & WLDSF_TYPEMASK)
     1443    {
     1444        case WLDSF_PUBLIC:  psz += sprintf(psz, "PUBLIC"); break;
     1445        case WLDSF_COMM:    psz += sprintf(psz, "COMM"); break;
     1446        case WLDSF_IMPORT:  psz += sprintf(psz, "IMPORT"); break;
     1447        case WLDSF_UNDEF:   psz += sprintf(psz, "UNDEF"); break;
     1448        case WLDSF_WKEXT:   psz += sprintf(psz, "WKEXT"); break;
     1449        default:            psz += sprintf(psz, "!!!internal error!!! "); asm("int $3"); break;
     1450    }
     1451    if (pSym->fFlags & WLDSF_WEAK)
     1452        psz += sprintf(psz, " WEAK");
     1453    if (pSym->fFlags & WLDSF_ALIAS)
     1454        psz += sprintf(psz, " ALIAS");
     1455    if (pSym->fFlags & WLDSF_EXPORT)
     1456        psz += sprintf(psz, " EXPORT");
     1457    if (pSym->fFlags & WLDSF_UNCERTAIN)
     1458        psz += sprintf(psz, " UNCERTAIN");
     1459
     1460    return &szDesc[0];
     1461}
     1462
     1463
     1464
     1465
    14191466/**
    14201467 * Symbol debug output.
     
    14291476        fprintf(stderr, "weakld: dbg:");
    14301477    if (pSym)
    1431     {
    1432         fprintf(stderr, " '%s'", pSym->pszName);
    1433         switch (pSym->fFlags & WLDSF_TYPEMASK)
    1434         {
    1435             case WLDSF_PUBLIC:  fprintf(stderr, " PUBLIC"); break;
    1436             case WLDSF_COMM:    fprintf(stderr, " COMM"); break;
    1437             case WLDSF_IMPORT:  fprintf(stderr, " IMPORT"); break;
    1438             case WLDSF_UNDEF:   fprintf(stderr, " UNDEF"); break;
    1439             case WLDSF_WKEXT:   fprintf(stderr, " WKEXT"); break;
    1440             default:            fprintf(stderr, " !!!internal error!!!"); asm("int $3"); break;
    1441         }
    1442         if (pSym->fFlags & WLDSF_WEAK)
    1443             fprintf(stderr, " WEAK");
    1444         if (pSym->fFlags & WLDSF_ALIAS)
    1445             fprintf(stderr, " ALIAS");
    1446         if (pSym->fFlags & WLDSF_EXPORT)
    1447             fprintf(stderr, " ALIAS");
    1448         if (pSym->fFlags & WLDSF_UNCERTAIN)
    1449             fprintf(stderr, " UNCERTAIN");
    1450     }
     1478        fprintf(stderr, " '%s' %s", pSym->pszName, symGetDescr(pSym));
    14511479    else
    14521480        fprintf(stderr, " <Symbol is NULL>");
    14531481    fprintf(stderr, "\n");
    14541482}
    1455 #endif
    1456 
    14571483
    14581484/**
     
    15531579        pSym->fFlags = fFlags;
    15541580        pSym->pszName = pszName;
    1555         if (SYM_IS_DEFINED(pSym->fFlags))
    1556             pSym->pMod = pMod;
    15571581        if (cchNameWeak)
    15581582        {
     
    16881712            wldInfo("fFlags new 0x%04x  fFlags old 0x%04x.", fFlags, pSym->fFlags);
    16891713            pSym = NULL;
     1714        }
     1715
     1716        /*
     1717         * Maintain the module pointer and referers.
     1718         */
     1719        if (pSym)
     1720        {
     1721            if (SYM_IS_DEFINED(pSym->fFlags))
     1722                pSym->pMod = pMod;
     1723            else
     1724            {
     1725                int i;
     1726                for (i = 0; i < pSym->cReferers; i++)
     1727                    if (pSym->paReferers[i] == pMod)
     1728                        break;
     1729                if (i >= pSym->cReferers)
     1730                {
     1731                    if (!(pSym->cReferers % 64))
     1732                        pSym->paReferers = xrealloc(pSym->paReferers, sizeof(pSym->paReferers[0]) * (pSym->cReferers + 64));
     1733                    pSym->paReferers[pSym->cReferers++] = pMod;
     1734                }
     1735            }
    16901736        }
    16911737    }
     
    18611907        PWLDSYM     pSymAlias;
    18621908
     1909        pSym->fFlags |= WLDSF_EXPORT;
     1910
    18631911        /*
    18641912         * Add internal name.
     
    18751923        else
    18761924        {
    1877             if (pSym->pAliasFor != pSymAlias)
     1925            if (pSym != pSymAlias)
    18781926            {
    18791927                pSym->fFlags |= WLDSF_ALIAS;
     
    19822030            {
    19832031                modErr(pMod, "Aliased symbol apparently existed already (upgraded - internal error?).");
     2032                symDbg(pSym, "Processing");
     2033                symDbg(pSym->pAliasFor, "Alias");
    19842034                pSym = NULL;
    19852035            }
     
    25002550    PWLDMOD     pObj;
    25012551    PWLDLIB     pLib;
     2552    unsigned    uHash;
    25022553
    25032554    if (!pWld)
     
    25292580        pLib = pLib->pNext;
    25302581        free(pv);
     2582    }
     2583
     2584    /* free symbols */
     2585    for (uHash = 0; uHash < sizeof(pWld->Global.ap) / sizeof(pWld->Global.ap[0]); uHash++)
     2586    {
     2587        PWLDSYM     pSym = pWld->Global.ap[uHash];
     2588        while (pSym)
     2589        {
     2590            PWLDSYM pNext = pSym->pHashNext;
     2591            if (pSym->paReferers)
     2592                free(pSym->paReferers);
     2593            free(pSym);
     2594            pSym = pNext;
     2595        }
    25312596    }
    25322597
     
    33073372                return 0;               /* .ignore it. good idea? */
    33083373            }
     3374
     3375            WLDDBG2(("wldGenerateDefCallback: '%s', '%s'", pSymExp->pszName, pSymInt ? pSymInt->pszName : "<the-same-name>"));
    33093376
    33103377            /* Skip it all if neither of the symbols are weak. */
Note: See TracChangeset for help on using the changeset viewer.