Changeset 3753


Ignore:
Timestamp:
Mar 4, 2012, 10:23:36 PM (13 years ago)
Author:
bird
Message:

Backported r3751: weakld.c: Put exported names in a different symbol table since they need to be considered seperately. Fixed bugs reading IMPORTS from .def files. Fixes #254.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/libc-0.6/src/emx/src/emxomf/weakld.c

    r3462 r3753  
    223223         */
    224224        WLDSF_WKEXT     = 0x0005,
     225        /** Exported name.
     226         * This is used when the exported name differs from the internal one.
     227         * This name is not considered in the linking, only the internal one. */
     228        WLDSF_EXP_NM    = 0x0006,
    225229        /** @} */
    226230
     
    249253        WLDSF_ALIAS     = 0x0800,
    250254
    251         /** Exported symbol.
    252          * This symbol is to be exported. */
    253         WLDSF_EXPORT    = 0x1000,
    254 
    255255        /** Internal flags which indicates that the symbol was exported in
    256256         * the definition file. This to select symbols which only appears in
     
    260260
    261261        /** Internal flag to say that we've already aliased this weak
    262          * in the definition file.
    263          */
     262         * in the definition file. */
    264263        WLDSF_WEAKALIASDONE = 0x8000
    265264    }                   fFlags;
     
    309308
    310309    /** Symbol this is an alias for.
    311      * Valid when WLDSF_ALIAS is set. */
     310     * Valid when WLDSF_ALIAS or WLDSF_EXP_NM are set. */
    312311    struct wldsym *     pAliasFor;
    313312
    314313    /** @group Export Attributes
    315      * Valid when WLDSF_EXPORT is set.
     314     * Valid when WLDSF_EXP_NM is set.
    316315     * @{ */
    317316    /** Export flags. */
     
    369368    /** Global symbols. */
    370369    WLDSYMTAB           Global;
     370    /** Exported symbols. */
     371    WLDSYMTAB           Exported;
    371372
    372373    /** Module definition file. */
     
    469470static void         symDumpReferers(PWLDSYM pSym);
    470471static void         symDbg(PWLDSYM pSym, const char *pszMsg);
    471 static PWLDSYM      symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMACTION peAction);
     472static PWLDSYM      symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMTAB pSymTab, PWLDSYMACTION peAction);
    472473static PWLDSYM      symAddImport(PWLD pWld, PWLDMOD pMod, int fLibSearch,
    473474                                 const char *pachName, int cchName,
     
    12511252 * @param   pWld    Linker Instance.
    12521253 * @param   pszName Name of the symbol to find.
    1253  */
    1254 static PWLDSYM      symLookup(PWLD pWld, const char *pszName)
     1254 * @param   pSymTab The symbol table to look it up in.
     1255 */
     1256static PWLDSYM      symLookupCommon(PWLD pWld, const char *pszName, PWLDSYMTAB pSymTab)
    12551257{
    12561258    PWLDSYM     pSym;
     
    12851287
    12861288    /* look it up */
    1287     for (pSym = pWld->Global.ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)
     1289    for (pSym = pSymTab->ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)
    12881290       if (SYM_EQUAL(pWld, pSym, pszName, fFlags, uHash, cchName))
    12891291           return pSym;
     
    12931295
    12941296
     1297/**
     1298 * Find the symbol by the name pszName.
     1299 *
     1300 * @returns Pointer to matching symbol.
     1301 * @returns NULL if not found.
     1302 * @param   pWld    Linker Instance.
     1303 * @param   pszName Name of the symbol to find.
     1304 */
     1305static PWLDSYM      symLookup(PWLD pWld, const char *pszName)
     1306{
     1307    return symLookupCommon(pWld, pszName, &pWld->Global);
     1308}
     1309
     1310
     1311/**
     1312 * Find the export symbol by the name pszName.
     1313 *
     1314 * @returns Pointer to matching symbol.
     1315 * @returns NULL if not found.
     1316 * @param   pWld    Linker Instance.
     1317 * @param   pszName Name of the symbol to find.
     1318 */
     1319static PWLDSYM      symLookupExport(PWLD pWld, const char *pszName)
     1320{
     1321    return symLookupCommon(pWld, pszName, &pWld->Exported);
     1322}
    12951323
    12961324
     
    14871515        case WLDSF_UNDEF:   psz += sprintf(psz, "UNDEF"); break;
    14881516        case WLDSF_WKEXT:   psz += sprintf(psz, "WKEXT"); break;
     1517        case WLDSF_EXP_NM:  psz += sprintf(psz, "EXPORT"); break;
    14891518        default:            psz += sprintf(psz, "!!!internal error!!! "); asm("int $3"); break;
    14901519    }
     
    14931522    if (pSym->fFlags & WLDSF_ALIAS)
    14941523        psz += sprintf(psz, " ALIAS");
    1495     if (pSym->fFlags & WLDSF_EXPORT)
    1496         psz += sprintf(psz, " EXPORT");
    14971524    if (pSym->fFlags & WLDSF_UNCERTAIN)
    14981525        psz += sprintf(psz, " UNCERTAIN");
     
    15561583 * @param   fFlags      Symbol flags.
    15571584 *                      All the flags in WLDSF_TYPEMASK, WLDSF_WEAK and WLDSF_LIBSEARCH.
    1558  *                      WLDSF_EXPORT isn't handled and should not be defined.
    15591585 *                      WLDSF_ALIAS and WLDSF_UNCERTAIN is ignored as they have no
    15601586 *                      sideeffects when resolving symbols.
    15611587 * @param   pachName    Pointer to symbol name.
    15621588 * @param   cchName     Length to add, use -1 if zeroterminated.
     1589 * @param   pSymTab     The symbol table to add it to.
    15631590 * @param   pflAction   What we actually did.
    15641591 *                      WLDSA_NEW, WLDSA_UP, WLDSA_OLD, WLDSA_ERR.
     
    15951622 *
    15961623 */
    1597 static PWLDSYM      symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMACTION peAction)
     1624static PWLDSYM      symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName,
     1625                           PWLDSYMTAB pSymTab, PWLDSYMACTION peAction)
    15981626{
    15991627    PWLDSYM     pSym;                   /* The symbol. */
     
    16321660
    16331661    /* search for existing symbol  */
    1634     for (pSym = pWld->Global.ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)
     1662    for (pSym = pSymTab->ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)
    16351663        if (SYM_EQUAL(pWld, pSym, pszName, fFlags, uHash, cchName))
    16361664            break;
     
    16521680            WLDINFO(pWld, ("Weak symbol '%s'.", pSym->pszWeakName));
    16531681        }
    1654         pSym->pHashNext = pWld->Global.ap[uHash % WLDSYM_HASH_SIZE];
    1655         pWld->Global.ap[uHash % WLDSYM_HASH_SIZE] = pSym;
     1682        pSym->pHashNext = pSymTab->ap[uHash % WLDSYM_HASH_SIZE];
     1683        pSymTab->ap[uHash % WLDSYM_HASH_SIZE] = pSym;
    16561684        if (peAction) *peAction = WLDSA_NEW;
    16571685        WLDDBG2(("symAdd: New symbol '%s'", pSym->pszName));
     
    16681696         *      5. adding a WEAK PUBLIC or WEAK COMM where a PUBLIC or COMM exists.
    16691697         *      6. adding a WEAK UNDEF where WEAK UNDEF exists.
     1698         *      7. adding a EXP_NM that already exists.
    16701699         */
    16711700        if ( (     /* 1 */
     
    16881717                ((fFlags & (WLDSF_TYPEMASK | WLDSF_WEAK)) == (WLDSF_UNDEF | WLDSF_WEAK))
    16891718             && ((pSym->fFlags & (WLDSF_TYPEMASK | WLDSF_WEAK)) == (WLDSF_UNDEF | WLDSF_WEAK))
     1719            ) || ( /* 7 */
     1720                ((fFlags & WLDSF_TYPEMASK) == WLDSF_EXP_NM)
     1721             && ((pSym->fFlags & WLDSF_TYPEMASK) == WLDSF_EXP_NM)
    16901722            ))
    16911723        {
     
    18381870
    18391871    pSym = symAdd(pWld, pMod, WLDSF_IMPORT | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    1840                   pachName, cchName, &eAction);
     1872                  pachName, cchName, &pWld->Global, &eAction);
    18411873    if (!pSym)
    18421874        return NULL;
     
    18671899        case WLDSA_NEW:
    18681900        case WLDSA_UP:
    1869             pSym->u.import.pszImpMod = pszImpMod;
     1901            pSym->u.import.pszImpMod  = pszImpMod;
    18701902            pSym->u.import.pszImpName = pszImpName;
    1871             pSym->u.import.uImpOrd   = uOrdinal;
     1903            pSym->u.import.uImpOrd    = uOrdinal;
    18721904            break;
    18731905
     
    19461978                            unsigned uOrdinal)
    19471979{
    1948     PWLDSYM         pSym;
     1980    PWLDSYM         pSymExp;
     1981    PWLDSYM         pSymInt;
    19491982
    19501983    /* set default name */
     
    19541987        cchIntName = cchExpName;
    19551988    }
     1989
     1990    /*
     1991     * Add the internal name.
     1992     */
     1993    pSymInt = symAdd(pWld, pMod, WLDSF_UNDEF | (fLibSearch ? WLDSF_LIBSEARCH : 0),
     1994                     pachIntName, cchIntName, &pWld->Global, NULL);
     1995    if (!pSymInt)
     1996        return NULL;
    19561997
    19571998    /*
    19581999     * Add external name.
    19592000     */
    1960     pSym = symAdd(pWld, pMod, WLDSF_UNDEF | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    1961                   pachExpName, cchExpName, NULL);
    1962     if (!pSym)
     2001    pSymExp = symAdd(pWld, pMod, WLDSF_EXP_NM | (fLibSearch ? WLDSF_LIBSEARCH : 0),
     2002                     pachExpName, cchExpName, &pWld->Exported, NULL);
     2003    if (!pSymExp)
    19632004        return NULL;
    19642005
     
    19662007     * Is the exported symbol already exported?
    19672008     */
    1968     if (pSym->fFlags & WLDSF_EXPORT)
    1969     {
    1970         if (    (pSym->fExport & WLDSEF_DEF_FILE)
     2009    if (pSymExp->pAliasFor)
     2010    {
     2011        if (pSymExp->pAliasFor != pSymInt)
     2012            modWarn(pMod, "Export '%s' (int '%s') is already defined with a different resolution '%s'.",
     2013                    pSymExp->pszName, pSymInt->pszName, pSymExp->pAliasFor->pszName);
     2014        else if (    (pSymExp->fExport & WLDSEF_DEF_FILE)
     2015                 &&  (fExport & WLDSEF_DEF_FILE))
     2016            modWarn(pMod, "Export '%s' (int '%s') is already defined.", pSymExp->pszName, pSymInt->pszName);
     2017       
     2018        if (    !(pSymExp->fExport & WLDSEF_DEF_FILE)
    19712019            &&  (fExport & WLDSEF_DEF_FILE))
    1972             modWarn(pMod, "Export '%s' is already defined.", pSym->pszName);
    1973         if (    !(pSym->fExport & WLDSEF_DEF_FILE)
    1974             &&  (fExport & WLDSEF_DEF_FILE))
    1975             pSym->fExport = fExport;
    1976     }
    1977     else
    1978     {
    1979         PWLDSYM     pSymAlias;
    1980 
    1981         pSym->fFlags |= WLDSF_EXPORT;
    1982 
    1983         /*
    1984          * Add internal name.
    1985          */
    1986         pSymAlias = symAdd(pWld, pMod, WLDSF_UNDEF | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    1987                            pachIntName, cchIntName, NULL);
    1988         if (!pSymAlias)
    1989             return NULL;
    1990         if (pSymAlias != pSym && (pSym->fFlags & WLDSF_ALIAS) && pSym->pAliasFor != pSymAlias)
    1991         {
    1992             modErr(pMod, "Can't export an alias!.");
    1993             pSym = NULL;
    1994         }
    1995         else
    1996         {
    1997             if (pSym != pSymAlias)
    1998             {
    1999                 pSym->fFlags |= WLDSF_ALIAS;
    2000                 pSym->fFlags &= ~WLDSF_UNDEF;
    2001                 pSym->pAliasFor = pSymAlias;
    2002             }
    2003             pSym->fExport   = fExport;
    2004             pSym->cExpWords = cExpWords;
    2005             pSym->uExpOrd   = uOrdinal;
    2006         }
    2007     }
    2008 
    2009     return pSym;
     2020            pSymExp->fExport = fExport;
     2021        return pSymExp;
     2022    }
     2023   
     2024    pSymExp->pAliasFor = pSymInt;
     2025    pSymExp->fExport   = fExport;
     2026    pSymExp->cExpWords = cExpWords;
     2027    pSymExp->uExpOrd   = uOrdinal;
     2028
     2029    return pSymExp;
    20102030}
    20112031
     
    20312051
    20322052    pSym = symAdd(pWld, pMod, WLDSF_PUBLIC | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    2033                   pachName, cchName, NULL);
     2053                  pachName, cchName, &pWld->Global, NULL);
    20342054    if (!pSym)
    20352055        return NULL;
     
    20552075
    20562076    pSym = symAdd(pWld, pMod, WLDSF_UNDEF | WLDSF_UNCERTAIN | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    2057                   pachName, cchName, NULL);
     2077                  pachName, cchName, &pWld->Global, NULL);
    20582078    if (!pSym)
    20592079        return NULL;
     
    20842104     */
    20852105    pSym = symAdd(pWld, pMod, WLDSF_PUBLIC | WLDSF_ALIAS | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    2086                   pachAliasName, cchAliasName, &eAction);
     2106                  pachAliasName, cchAliasName, &pWld->Global, &eAction);
    20872107    if (!pSym)
    20882108        return NULL;
     
    20952115            {
    20962116                PWLDSYM pSym2 = symAdd(pWld, pMod, WLDSF_UNDEF | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    2097                                        pachName, cchName, NULL);
     2117                                       pachName, cchName, &pWld->Global, NULL);
    20982118                if (!pSym2)
    20992119                    return NULL;
     
    21462166     */
    21472167    pSym = symAdd(pWld, pMod, WLDSF_COMM | (fLibSearch ? WLDSF_LIBSEARCH : 0),
    2148                   pachName, cchName, &eAction);
     2168                  pachName, cchName, &pWld->Global, &eAction);
    21492169    if (!pSym)
    21502170        return NULL;
     
    21752195
    21762196    return pSym;
     2197}
     2198
     2199
     2200/**
     2201 * Destroys a symbol table, freeing all symbols
     2202 *
     2203 * @param   pSymTab     The symbol table to destroy.
     2204 */
     2205static void symDestroyTab(PWLDSYMTAB pSymTab)
     2206{
     2207    unsigned        uHash;
     2208    for (uHash = 0; uHash < sizeof(pSymTab->ap) / sizeof(pSymTab->ap[0]); uHash++)
     2209    {
     2210        PWLDSYM     pSym = pSymTab->ap[uHash];
     2211        while (pSym)
     2212        {
     2213            PWLDSYM pNext = pSym->pHashNext;
     2214            if (pSym->paReferers)
     2215                free(pSym->paReferers);
     2216            free(pSym);
     2217            pSym = pNext;
     2218        }
     2219        pSymTab->ap[uHash] = NULL;
     2220    }
    21772221}
    21782222
     
    26322676    PWLDMOD     pObj;
    26332677    PWLDLIB     pLib;
    2634     unsigned    uHash;
    26352678
    26362679    if (!pWld)
     
    26652708
    26662709    /* free symbols */
    2667     for (uHash = 0; uHash < sizeof(pWld->Global.ap) / sizeof(pWld->Global.ap[0]); uHash++)
    2668     {
    2669         PWLDSYM     pSym = pWld->Global.ap[uHash];
    2670         while (pSym)
    2671         {
    2672             PWLDSYM pNext = pSym->pHashNext;
    2673             if (pSym->paReferers)
    2674                 free(pSym->paReferers);
    2675             free(pSym);
    2676             pSym = pNext;
    2677         }
    2678     }
     2710    symDestroyTab(&pWld->Global);
     2711    symDestroyTab(&pWld->Exported);
    26792712
    26802713    /* members and finally the instance structure. */
     
    28092842                uOrdinal = pStmt->import.ordinal;
    28102843            pSym = symAddImport(pParam->pWld, pParam->pMod, 0,
     2844                                pStmt->import.internalname[0] ? pStmt->import.internalname : pStmt->import.entryname, -1,
    28112845                                pStmt->import.entryname[0] ? pStmt->import.entryname : pStmt->import.internalname, -1,
    2812                                 pStmt->import.internalname, -1,
    28132846                                pStmt->import.modulename, -1,
    28142847                                uOrdinal);
     
    34603493            PWLDSYM     pSymExp;
    34613494
    3462             pSymExp = symLookup(pParam->pWld, pStmt->export.entryname);
     3495            pSymExp = symLookupExport(pParam->pWld, pStmt->export.entryname);
    34633496            if (pStmt->export.internalname[0])
    34643497                pSymInt = symLookup(pParam->pWld, pStmt->export.internalname);
     
    37033736                        {
    37043737                            if (0)//pWld->fFlags & WLDC_LINKER_WLINK)
    3705                                 rc = symEnum(pWld, &pWld->Global,
    3706                                              WLDSF_EXPORT | WLDSF_EXPORT_DEF | WLDSF_WEAK, WLDSF_EXPORT | WLDSF_EXPORT_DEF | WLDSF_WEAK | WLDSF_WEAKALIASDONE,
     3738                                rc = symEnum(pWld, &pWld->Exported,
     3739                                             WLDSF_EXPORT_DEF | WLDSF_WEAK, WLDSF_EXPORT_DEF | WLDSF_WEAK | WLDSF_WEAKALIASDONE,
    37073740                                             wldGenerateDefExportEnum, &param);
    37083741                            else
    3709                                 rc = symEnum(pWld, &pWld->Global,
    3710                                              WLDSF_EXPORT | WLDSF_WEAK, WLDSF_EXPORT | WLDSF_WEAK | WLDSF_EXPORT_DEF | WLDSF_WEAKALIASDONE,
     3742                                rc = symEnum(pWld, &pWld->Exported,
     3743                                             WLDSF_WEAK, WLDSF_WEAK | WLDSF_EXPORT_DEF | WLDSF_WEAKALIASDONE,
    37113744                                             wldGenerateDefExportEnum, &param);
    37123745                        }
Note: See TracChangeset for help on using the changeset viewer.