Changeset 3753
- Timestamp:
- Mar 4, 2012, 10:23:36 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/libc-0.6/src/emx/src/emxomf/weakld.c
r3462 r3753 223 223 */ 224 224 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, 225 229 /** @} */ 226 230 … … 249 253 WLDSF_ALIAS = 0x0800, 250 254 251 /** Exported symbol.252 * This symbol is to be exported. */253 WLDSF_EXPORT = 0x1000,254 255 255 /** Internal flags which indicates that the symbol was exported in 256 256 * the definition file. This to select symbols which only appears in … … 260 260 261 261 /** Internal flag to say that we've already aliased this weak 262 * in the definition file. 263 */ 262 * in the definition file. */ 264 263 WLDSF_WEAKALIASDONE = 0x8000 265 264 } fFlags; … … 309 308 310 309 /** Symbol this is an alias for. 311 * Valid when WLDSF_ALIAS isset. */310 * Valid when WLDSF_ALIAS or WLDSF_EXP_NM are set. */ 312 311 struct wldsym * pAliasFor; 313 312 314 313 /** @group Export Attributes 315 * Valid when WLDSF_EXP ORTis set.314 * Valid when WLDSF_EXP_NM is set. 316 315 * @{ */ 317 316 /** Export flags. */ … … 369 368 /** Global symbols. */ 370 369 WLDSYMTAB Global; 370 /** Exported symbols. */ 371 WLDSYMTAB Exported; 371 372 372 373 /** Module definition file. */ … … 469 470 static void symDumpReferers(PWLDSYM pSym); 470 471 static void symDbg(PWLDSYM pSym, const char *pszMsg); 471 static PWLDSYM symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYM ACTION peAction);472 static PWLDSYM symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMTAB pSymTab, PWLDSYMACTION peAction); 472 473 static PWLDSYM symAddImport(PWLD pWld, PWLDMOD pMod, int fLibSearch, 473 474 const char *pachName, int cchName, … … 1251 1252 * @param pWld Linker Instance. 1252 1253 * @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 */ 1256 static PWLDSYM symLookupCommon(PWLD pWld, const char *pszName, PWLDSYMTAB pSymTab) 1255 1257 { 1256 1258 PWLDSYM pSym; … … 1285 1287 1286 1288 /* look it up */ 1287 for (pSym = p Wld->Global.ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)1289 for (pSym = pSymTab->ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext) 1288 1290 if (SYM_EQUAL(pWld, pSym, pszName, fFlags, uHash, cchName)) 1289 1291 return pSym; … … 1293 1295 1294 1296 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 */ 1305 static 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 */ 1319 static PWLDSYM symLookupExport(PWLD pWld, const char *pszName) 1320 { 1321 return symLookupCommon(pWld, pszName, &pWld->Exported); 1322 } 1295 1323 1296 1324 … … 1487 1515 case WLDSF_UNDEF: psz += sprintf(psz, "UNDEF"); break; 1488 1516 case WLDSF_WKEXT: psz += sprintf(psz, "WKEXT"); break; 1517 case WLDSF_EXP_NM: psz += sprintf(psz, "EXPORT"); break; 1489 1518 default: psz += sprintf(psz, "!!!internal error!!! "); asm("int $3"); break; 1490 1519 } … … 1493 1522 if (pSym->fFlags & WLDSF_ALIAS) 1494 1523 psz += sprintf(psz, " ALIAS"); 1495 if (pSym->fFlags & WLDSF_EXPORT)1496 psz += sprintf(psz, " EXPORT");1497 1524 if (pSym->fFlags & WLDSF_UNCERTAIN) 1498 1525 psz += sprintf(psz, " UNCERTAIN"); … … 1556 1583 * @param fFlags Symbol flags. 1557 1584 * All the flags in WLDSF_TYPEMASK, WLDSF_WEAK and WLDSF_LIBSEARCH. 1558 * WLDSF_EXPORT isn't handled and should not be defined.1559 1585 * WLDSF_ALIAS and WLDSF_UNCERTAIN is ignored as they have no 1560 1586 * sideeffects when resolving symbols. 1561 1587 * @param pachName Pointer to symbol name. 1562 1588 * @param cchName Length to add, use -1 if zeroterminated. 1589 * @param pSymTab The symbol table to add it to. 1563 1590 * @param pflAction What we actually did. 1564 1591 * WLDSA_NEW, WLDSA_UP, WLDSA_OLD, WLDSA_ERR. … … 1595 1622 * 1596 1623 */ 1597 static PWLDSYM symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, PWLDSYMACTION peAction) 1624 static PWLDSYM symAdd(PWLD pWld, PWLDMOD pMod, unsigned fFlags, const char *pachName, int cchName, 1625 PWLDSYMTAB pSymTab, PWLDSYMACTION peAction) 1598 1626 { 1599 1627 PWLDSYM pSym; /* The symbol. */ … … 1632 1660 1633 1661 /* search for existing symbol */ 1634 for (pSym = p Wld->Global.ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext)1662 for (pSym = pSymTab->ap[uHash % WLDSYM_HASH_SIZE]; pSym; pSym = pSym->pHashNext) 1635 1663 if (SYM_EQUAL(pWld, pSym, pszName, fFlags, uHash, cchName)) 1636 1664 break; … … 1652 1680 WLDINFO(pWld, ("Weak symbol '%s'.", pSym->pszWeakName)); 1653 1681 } 1654 pSym->pHashNext = p Wld->Global.ap[uHash % WLDSYM_HASH_SIZE];1655 p Wld->Global.ap[uHash % WLDSYM_HASH_SIZE] = pSym;1682 pSym->pHashNext = pSymTab->ap[uHash % WLDSYM_HASH_SIZE]; 1683 pSymTab->ap[uHash % WLDSYM_HASH_SIZE] = pSym; 1656 1684 if (peAction) *peAction = WLDSA_NEW; 1657 1685 WLDDBG2(("symAdd: New symbol '%s'", pSym->pszName)); … … 1668 1696 * 5. adding a WEAK PUBLIC or WEAK COMM where a PUBLIC or COMM exists. 1669 1697 * 6. adding a WEAK UNDEF where WEAK UNDEF exists. 1698 * 7. adding a EXP_NM that already exists. 1670 1699 */ 1671 1700 if ( ( /* 1 */ … … 1688 1717 ((fFlags & (WLDSF_TYPEMASK | WLDSF_WEAK)) == (WLDSF_UNDEF | WLDSF_WEAK)) 1689 1718 && ((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) 1690 1722 )) 1691 1723 { … … 1838 1870 1839 1871 pSym = symAdd(pWld, pMod, WLDSF_IMPORT | (fLibSearch ? WLDSF_LIBSEARCH : 0), 1840 pachName, cchName, & eAction);1872 pachName, cchName, &pWld->Global, &eAction); 1841 1873 if (!pSym) 1842 1874 return NULL; … … 1867 1899 case WLDSA_NEW: 1868 1900 case WLDSA_UP: 1869 pSym->u.import.pszImpMod = pszImpMod;1901 pSym->u.import.pszImpMod = pszImpMod; 1870 1902 pSym->u.import.pszImpName = pszImpName; 1871 pSym->u.import.uImpOrd = uOrdinal;1903 pSym->u.import.uImpOrd = uOrdinal; 1872 1904 break; 1873 1905 … … 1946 1978 unsigned uOrdinal) 1947 1979 { 1948 PWLDSYM pSym; 1980 PWLDSYM pSymExp; 1981 PWLDSYM pSymInt; 1949 1982 1950 1983 /* set default name */ … … 1954 1987 cchIntName = cchExpName; 1955 1988 } 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; 1956 1997 1957 1998 /* 1958 1999 * Add external name. 1959 2000 */ 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) 1963 2004 return NULL; 1964 2005 … … 1966 2007 * Is the exported symbol already exported? 1967 2008 */ 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) 1971 2019 && (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; 2010 2030 } 2011 2031 … … 2031 2051 2032 2052 pSym = symAdd(pWld, pMod, WLDSF_PUBLIC | (fLibSearch ? WLDSF_LIBSEARCH : 0), 2033 pachName, cchName, NULL);2053 pachName, cchName, &pWld->Global, NULL); 2034 2054 if (!pSym) 2035 2055 return NULL; … … 2055 2075 2056 2076 pSym = symAdd(pWld, pMod, WLDSF_UNDEF | WLDSF_UNCERTAIN | (fLibSearch ? WLDSF_LIBSEARCH : 0), 2057 pachName, cchName, NULL);2077 pachName, cchName, &pWld->Global, NULL); 2058 2078 if (!pSym) 2059 2079 return NULL; … … 2084 2104 */ 2085 2105 pSym = symAdd(pWld, pMod, WLDSF_PUBLIC | WLDSF_ALIAS | (fLibSearch ? WLDSF_LIBSEARCH : 0), 2086 pachAliasName, cchAliasName, & eAction);2106 pachAliasName, cchAliasName, &pWld->Global, &eAction); 2087 2107 if (!pSym) 2088 2108 return NULL; … … 2095 2115 { 2096 2116 PWLDSYM pSym2 = symAdd(pWld, pMod, WLDSF_UNDEF | (fLibSearch ? WLDSF_LIBSEARCH : 0), 2097 pachName, cchName, NULL);2117 pachName, cchName, &pWld->Global, NULL); 2098 2118 if (!pSym2) 2099 2119 return NULL; … … 2146 2166 */ 2147 2167 pSym = symAdd(pWld, pMod, WLDSF_COMM | (fLibSearch ? WLDSF_LIBSEARCH : 0), 2148 pachName, cchName, & eAction);2168 pachName, cchName, &pWld->Global, &eAction); 2149 2169 if (!pSym) 2150 2170 return NULL; … … 2175 2195 2176 2196 return pSym; 2197 } 2198 2199 2200 /** 2201 * Destroys a symbol table, freeing all symbols 2202 * 2203 * @param pSymTab The symbol table to destroy. 2204 */ 2205 static 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 } 2177 2221 } 2178 2222 … … 2632 2676 PWLDMOD pObj; 2633 2677 PWLDLIB pLib; 2634 unsigned uHash;2635 2678 2636 2679 if (!pWld) … … 2665 2708 2666 2709 /* 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); 2679 2712 2680 2713 /* members and finally the instance structure. */ … … 2809 2842 uOrdinal = pStmt->import.ordinal; 2810 2843 pSym = symAddImport(pParam->pWld, pParam->pMod, 0, 2844 pStmt->import.internalname[0] ? pStmt->import.internalname : pStmt->import.entryname, -1, 2811 2845 pStmt->import.entryname[0] ? pStmt->import.entryname : pStmt->import.internalname, -1, 2812 pStmt->import.internalname, -1,2813 2846 pStmt->import.modulename, -1, 2814 2847 uOrdinal); … … 3460 3493 PWLDSYM pSymExp; 3461 3494 3462 pSymExp = symLookup (pParam->pWld, pStmt->export.entryname);3495 pSymExp = symLookupExport(pParam->pWld, pStmt->export.entryname); 3463 3496 if (pStmt->export.internalname[0]) 3464 3497 pSymInt = symLookup(pParam->pWld, pStmt->export.internalname); … … 3703 3736 { 3704 3737 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, 3707 3740 wldGenerateDefExportEnum, ¶m); 3708 3741 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, 3711 3744 wldGenerateDefExportEnum, ¶m); 3712 3745 }
Note:
See TracChangeset
for help on using the changeset viewer.