Changeset 2869
- Timestamp:
- Nov 12, 2006, 3:47:25 AM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.c
r2855 r2869 106 106 if (!rc) 107 107 { 108 g_fInitialized = 1; 109 return 0; 108 rc = kldrDyldInit(); 109 if (!rc) 110 { 111 g_fInitialized = 1; 112 return 0; 113 } 114 kldrHlpSemTerm(); 110 115 } 111 116 kldrHlpHeapTerm(); -
trunk/kLdr/kLdrDyld.c
r2868 r2869 75 75 * successfully initialized. */ 76 76 PKLDRDYLDMOD g_pkLdrDyldInitHead; 77 /** Pointer to the tail module of the initalization list. 77 /** Pointer to the tail module of the initalization list.*/ 78 78 PKLDRDYLDMOD g_pkLdrDyldInitTail; 79 /** Pointer to the head module of the termination order list. */ 79 /** Pointer to the head module of the termination order list. 80 * This is a LIFO just like the the init list. */ 80 81 PKLDRDYLDMOD g_pkLdrDyldTermHead; 81 82 /** Pointer to the tail module of the termination order list. */ … … 185 186 * Initialize the dynamic loader. 186 187 */ 187 int kldrDy Init(void)188 int kldrDyldInit(void) 188 189 { 189 190 kLdrDyldHead = kLdrDyldTail = NULL; … … 198 199 g_cbkLdrDyldMainStack = 0; 199 200 200 return 0;201 return kldrDyldFindInit(); 201 202 } 202 203 … … 205 206 * Terminate the dynamic loader. 206 207 */ 207 void kldrDy Term(void)208 void kldrDyldTerm(void) 208 209 { 209 210 … … 321 322 g_cTotalLoadCalls++; 322 323 g_cActiveLoadCalls++; 323 rc = kldrDyldDoLoad(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, phMod, pszErr, cchErr);324 rc = kldrDyldDoLoad(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, &pMod, pszErr, cchErr); 324 325 g_cActiveLoadCalls--; 325 326 kldrDyldDoModuleTerminationAndGarabageCollection(); … … 845 846 if (cEntries < sizeof(s_aEntries) / sizeof(s_aEntries[0])) 846 847 { 847 s_aEntries[cEntries++].pMod = pMod->papPrereqs[pMod->cPrereqs - s_aEntries[i].cLeft]; 848 s_aEntries[cEntries].cLeft = ~(uint32_t)0; 849 s_aEntries[cEntries].pMod = pMod->papPrereqs[pMod->cPrereqs - s_aEntries[i].cLeft]; 848 850 s_aEntries[i].cLeft--; 851 cEntries++; 849 852 } 850 853 else … … 962 965 * We'll have to load it from file. 963 966 */ 964 rc = kldrDyldFindNewModule(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, ppMod);967 rc = kldrDyldFindNewModule(pszDll, pszPrefix, pszSuffix, enmSearch, fFlags, &pMod); 965 968 if (!rc) 966 969 rc = kldrDyldModMap(pMod); … … 1162 1165 static void kldrDyldStackDropFrame(uint32_t iLoad1st, uint32_t iLoadEnd, int rc) 1163 1166 { 1164 uint32_t i Stack;1165 KLDRDYLD_ASSERT(iLoad End<= g_cStackMods);1166 KLDRDYLD_ASSERT(iLoad 1st== g_cStackMods);1167 uint32_t i; 1168 KLDRDYLD_ASSERT(iLoad1st <= g_cStackMods); 1169 KLDRDYLD_ASSERT(iLoadEnd == g_cStackMods); 1167 1170 1168 1171 /* 1169 1172 * First pass: Do all the cleanups we can, but don't destroy anything just yet. 1170 1173 */ 1171 for (iStack = iLoadEnd; iStack < iLoad1st; iStack++) 1172 { 1173 PKLDRDYLDMOD pMod = g_papStackMods[--iLoad1st]; 1174 i = iLoadEnd; 1175 while (i-- > iLoad1st) 1176 { 1177 PKLDRDYLDMOD pMod = g_papStackMods[i]; 1174 1178 kldrDyldStackCleanupOne(pMod, rc); 1175 1179 } … … 1179 1183 * can be completely removed. 1180 1184 */ 1181 while (iLoad1st > iLoadEnd) 1182 { 1183 /* 1184 * Pop a module. 1185 */ 1186 PKLDRDYLDMOD pMod = g_papStackMods[--iLoad1st]; 1187 g_cStackMods = iLoad1st; 1185 for (i = iLoad1st; i < iLoadEnd ; i++) 1186 { 1187 PKLDRDYLDMOD pMod = g_papStackMods[i]; 1188 1188 1189 1189 /* … … 1210 1210 kldrDyldModDeref(pMod); 1211 1211 } 1212 1213 /* 1214 * Drop the stack frame. 1215 */ 1216 g_cStackMods = iLoad1st; 1212 1217 } 1213 1218 … … 1245 1250 case KLDRSTATE_GOOD: 1246 1251 case KLDRSTATE_PENDING_GC: 1252 case KLDRSTATE_PENDING_TERMINATION: 1247 1253 break; 1248 1254 1249 1255 case KLDRSTATE_INITIALIZATION_FAILED: /* just in case */ 1250 1256 case KLDRSTATE_PENDING_INITIALIZATION: 1251 case KLDRSTATE_PENDING_TERMINATION:1252 1257 kldrDyldModUnloadPrerequisites(pMod); 1253 1258 break; … … 1309 1314 case KLDRSTATE_INITIALIZATION_FAILED: 1310 1315 case KLDRSTATE_PENDING_GC: 1311 KLDRDYLD_ASSERT(pMod->cRefs == 0); /* ??? */ 1316 KLDRDYLD_ASSERT(!pMod->cDepRefs); 1317 KLDRDYLD_ASSERT(!pMod->cDynRefs); 1312 1318 pMod->enmState = KLDRSTATE_GC; 1313 1319 kldrDyldModUnmap(pMod); … … 1428 1434 int kldrDyldFailure(int rc, const char *pszFilename, ...) 1429 1435 { 1430 kldrHlpExit(1); 1436 /** @todo print it. */ 1437 if (g_fBootstrapping); 1438 kldrHlpExit(1); 1431 1439 return rc; 1432 1440 } -
trunk/kLdr/kLdrDyldFind.c
r2868 r2869 218 218 */ 219 219 rc = kldrHlpGetEnv("KLDR_LIBRARY_PATH", kLdrDyldPath, sizeof(kLdrDyldPath)); 220 if (rc)221 kLdrDyldPath[0] = '\0';222 223 220 rc = kldrHlpGetEnv("KLDR_DEF_PREFIX", szTmp, sizeof(szTmp)); 224 221 if (!rc) 225 222 kLdrHlpMemCopy(kLdrDyldDefPrefix, szTmp, sizeof(szTmp)); 226 227 223 rc = kldrHlpGetEnv("KLDR_DEF_SUFFIX", szTmp, sizeof(szTmp)); 228 224 if (!rc) … … 249 245 kldrHlpGetEnv("KLDR_OS2_LIBPATH", kLdrDyldOS2Libpath, sizeof(kLdrDyldOS2Libpath)); 250 246 kldrHlpGetEnv("KLDR_OS2_LIBPATHSTRICT", kLdrDyldOS2LibpathStrict, sizeof(kLdrDyldOS2LibpathStrict)); 247 if ( kLdrDyldOS2LibpathStrict[0] == 'T' 248 || kLdrDyldOS2LibpathStrict[0] == 't') 249 kLdrDyldOS2LibpathStrict[0] = 'T'; 250 else 251 kLdrDyldOS2LibpathStrict[0] = '\0'; 252 kLdrDyldOS2LibpathStrict[1] = '\0'; 251 253 kldrHlpGetEnv("KLDR_OS2_BEGINLIBPATH", kLdrDyldOS2BeginLibpath, sizeof(kLdrDyldOS2BeginLibpath)); 252 254 kldrHlpGetEnv("KLDR_OS2_ENDLIBPATH", kLdrDyldOS2EndLibpath, sizeof(kLdrDyldOS2EndLibpath)); … … 267 269 kldrHlpGetEnv("KLDR_WINDOWS_SYSTEM_DIR", kLdrDyldWindowsSystemDir, sizeof(kLdrDyldWindowsSystemDir)); 268 270 kldrHlpGetEnv("KLDR_WINDOWS_DIR", kLdrDyldWindowsDir, sizeof(kLdrDyldWindowsDir)); 269 kldrHlpGetEnv("KLDR_WINDOWS_PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath)); 271 rc = kldrHlpGetEnv("KLDR_WINDOWS_PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath)); 272 if (rc) 273 kldrHlpGetEnv("PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath)); 270 274 #endif 271 275 … … 279 283 (void)cch; 280 284 return 0; 285 } 286 287 288 /** 289 * Lazily initialize the two application directory paths. 290 */ 291 static void kldrDyldFindLazyInitAppDir(void) 292 { 293 if (!kLdrDyldAppDir[0]) 294 { 295 #if defined(__OS2__) 296 PPIB pPib; 297 PTIB pTib; 298 APIRET rc; 299 300 DosGetInfoBlocks(&pTib, &pPib); 301 rc = DosQueryModuleName(pPib->pib_hmte, sizeof(kLdrDyldAppDir), kLdrDyldAppDir); 302 if (!rc) 303 { 304 *kldrHlpGetFilename(kLdrDyldAppDir) = '\0'; 305 kLdrHlpMemCopy(kLdrDyldWindowsAppDir, kLdrDyldAppDir, sizeof(kLdrDyldAppDir)); 306 } 307 else 308 { 309 kLdrDyldWindowsAppDir[0] = kLdrDyldAppDir[0] = '.'; 310 kLdrDyldWindowsAppDir[1] = kLdrDyldAppDir[1] = '\0'; 311 } 312 313 314 #elif defined(__WIN__) 315 DWORD dwSize = GetModuleFileName(NULL /* the executable */, kLdrDyldAppDir, sizeof(kLdrDyldAppDir)); 316 if (dwSize > 0) 317 { 318 *kldrHlpGetFilename(kLdrDyldAppDir) = '\0'; 319 kLdrHlpMemCopy(kLdrDyldWindowsAppDir, kLdrDyldAppDir, sizeof(kLdrDyldAppDir)); 320 } 321 else 322 { 323 kLdrDyldWindowsAppDir[0] = kLdrDyldAppDir[0] = '.'; 324 kLdrDyldWindowsAppDir[1] = kLdrDyldAppDir[1] = '\0'; 325 } 326 327 #else 328 # error "Port me" 329 #endif 330 } 281 331 } 282 332 … … 390 440 Args.pszName = pszName; 391 441 Args.cchName = kLdrHlpStrLen(pszName); 392 Args.cchPrefix = Args.pszPrefix ? kLdrHlpStrLen( pszPrefix) : 0;393 Args.cchSuffix = Args.pszSuffix ? kLdrHlpStrLen( pszSuffix) : 0;442 Args.cchPrefix = Args.pszPrefix ? kLdrHlpStrLen(Args.pszPrefix) : 0; 443 Args.cchSuffix = Args.pszSuffix ? kLdrHlpStrLen(Args.pszSuffix) : 0; 394 444 Args.cchMaxLength = Args.cchName + Args.cchSuffix + Args.cchPrefix; 395 445 Args.fFlags = fFlags; … … 400 450 */ 401 451 /** @todo get rid of the strlen() on the various paths here! */ 402 switch ( enmSearch)452 switch (Args.enmSearch) 403 453 { 404 454 case KLDRDYLD_SEARCH_KLDR: 405 455 { 456 kldrDyldFindLazyInitAppDir(); 406 457 if (kLdrDyldAppDir[0] != '\0') 407 458 { … … 432 483 case KLDRDYLD_SEARCH_WINDOWS_ALTERED: 433 484 { 485 kldrDyldFindLazyInitAppDir(); 434 486 rc = kldrDyldFindTryOpenPath(kLdrDyldWindowsAppDir, kLdrHlpStrLen(kLdrDyldWindowsAppDir), &Args); 435 487 if (rc != KLDR_ERR_MODULE_NOT_FOUND) 436 488 break; 437 if ( enmSearch == KLDRDYLD_SEARCH_WINDOWS_ALTERED)489 if (Args.enmSearch == KLDRDYLD_SEARCH_WINDOWS_ALTERED) 438 490 { 439 491 rc = kldrDyldFindTryOpenPath(".", 1, &Args); … … 447 499 if (rc != KLDR_ERR_MODULE_NOT_FOUND) 448 500 break; 449 if ( enmSearch == KLDRDYLD_SEARCH_WINDOWS)501 if (Args.enmSearch == KLDRDYLD_SEARCH_WINDOWS) 450 502 { 451 503 rc = kldrDyldFindTryOpenPath(".", 1, &Args); … … 513 565 static char s_szFilename[1024]; 514 566 char *psz; 567 568 /* 569 * Ignore any attempts at opening empty paths. 570 * This can happen when a *Dir globals is empty. 571 */ 572 if (!cchPath) 573 return KLDR_ERR_MODULE_NOT_FOUND; /* ignore */ 515 574 516 575 /* … … 692 751 if ( cchName > cchSuffix 693 752 && ( fCaseSensitive 694 ? kLdrHlpMemComp(pszName + cchName - cchSuffix, *ppszSuffix, cchSuffix)695 : kLdrHlpMemIComp(pszName + cchName - cchSuffix, *ppszSuffix, cchSuffix))753 ? !kLdrHlpMemComp(pszName + cchName - cchSuffix, *ppszSuffix, cchSuffix) 754 : !kLdrHlpMemIComp(pszName + cchName - cchSuffix, *ppszSuffix, cchSuffix)) 696 755 ) 697 756 *ppszSuffix = NULL; -
trunk/kLdr/kLdrDyldMod.c
r2868 r2869 567 567 uint32_t i; 568 568 569 KLDRDYLDMOD_ASSERT(pMod->papPrereqs );569 KLDRDYLDMOD_ASSERT(pMod->papPrereqs || !pMod->cPrereqs); 570 570 571 571 /* … … 584 584 pMod2->cDepRefs--; 585 585 pMod2->cRefs--; 586 cToUnload += !pMod2->c Refs;586 cToUnload += !pMod2->cDepRefs && !pMod2->cDynRefs; 587 587 } 588 588 } … … 661 661 for (pMod = kLdrDyldHead; pMod; pMod = pMod->Load.pNext) 662 662 { 663 if ( pMod->cRefs 663 if ( pMod->cDepRefs 664 || pMod->cDynRefs 664 665 || pMod->enmState >= KLDRSTATE_PENDING_TERMINATION 665 666 || pMod->enmState < KLDRSTATE_LOADED_PREREQUISITES) … … 760 761 761 762 /* sanity */ 762 KLDRDYLDMOD_ASSERT(pMod->cRefs > 0);763 763 KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_OPEN); 764 764 KLDRDYLDMOD_ASSERT(!pMod->fMapped); … … 1003 1003 int rc; 1004 1004 1005 KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_INITIALIZING); 1006 1005 KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_INITIALIZATION); 1006 1007 pMod->enmState = KLDRSTATE_INITIALIZING; 1007 1008 rc = kLdrModCallInit(pMod->pMod, (uintptr_t)pMod->hMod); 1008 1009 if (!rc) 1010 { 1009 1011 pMod->enmState = KLDRSTATE_GOOD; 1012 /* push it onto the termination list.*/ 1013 pMod->InitTerm.pPrev = NULL; 1014 pMod->InitTerm.pNext = g_pkLdrDyldTermHead; 1015 if (g_pkLdrDyldTermHead) 1016 g_pkLdrDyldTermHead->InitTerm.pPrev = pMod; 1017 else 1018 g_pkLdrDyldTermTail = pMod; 1019 g_pkLdrDyldTermHead = pMod; 1020 } 1010 1021 else 1011 1022 pMod->enmState = KLDRSTATE_INITIALIZATION_FAILED; … … 1024 1035 void kldrDyldModCallTerm(PKLDRDYLDMOD pMod) 1025 1036 { 1026 KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_TERMINATING); 1027 1037 KLDRDYLDMOD_ASSERT(pMod->enmState == KLDRSTATE_PENDING_TERMINATION); 1038 1039 pMod->enmState = KLDRSTATE_TERMINATING; 1028 1040 kLdrModCallTerm(pMod->pMod, (uintptr_t)pMod->hMod); 1029 1041 pMod->enmState = KLDRSTATE_PENDING_GC; 1042 /* unlinking on destruction. */ 1030 1043 } 1031 1044 -
trunk/kLdr/kLdrHlp.c
r2867 r2869 386 386 * 387 387 * @returns 0 on success. 388 * @returns KLDR_ERR_BUFFER_OVERFLOW on if the buffer is too small (it'll be partially filled).388 * @returns KLDR_ERR_BUFFER_OVERFLOW on if the buffer is too small. 389 389 * @returns KLDR_ERR_SYMBOL_NOT_FOUND if not found. (Yeah, abusing the status code, but it's only internally...) 390 390 * @returns OS specfic status code on other error. … … 407 407 kLdrHlpMemCopy(pszVal, pszValue, cch + 1); 408 408 else 409 {410 409 rc = KLDR_ERR_BUFFER_OVERFLOW; 411 if (cchVal > 1)412 {413 kLdrHlpMemCopy(pszVal, pszValue, *pcchVal);414 pszVal[*pcchVal - 1] = '\0';415 }416 }417 410 } 418 411 else … … 425 418 SetLastError(0); 426 419 cch = GetEnvironmentVariable(pszVar, pszVal, cchVal); 427 if (cch < cchVal)420 if (cch > 0 && cch < cchVal) 428 421 return 0; 429 422 … … 796 789 const uint8_t *pb = (const uint8_t *)pv; 797 790 const uint8_t b = (uint8_t)ch; 798 while (cb )791 while (cb-- > 0) 799 792 { 800 793 if (*pb == b) … … 811 804 const uint8_t *pb1 = (const uint8_t *)pv1; 812 805 const uint8_t *pb2 = (const uint8_t *)pv2; 813 while (cb )806 while (cb-- > 0) 814 807 { 815 808 if (*pb1 != *pb2) -
trunk/kLdr/kLdrInternal.h
r2868 r2869 353 353 int kldrDyldModQuerySymbol(PKLDRDYLDMOD pMod, uint32_t uSymbolOrdinal, const char *pszSymbolName, uintptr_t *puValue, uint32_t *pfKind); 354 354 355 int kldrDyldInit(void); 356 void kldrDyldTerm(void); 357 int kldrDyldFindInit(void); 358 355 359 int kldrDyldFailure(int rc, const char *pszFormat, ...); 356 360 int kldrInit(void); -
trunk/kLdr/kLdrModPE.c
r2861 r2869 241 241 pMod->enmFmt = KLDRFMT_PE; 242 242 if (s.FileHdr.Characteristics & IMAGE_FILE_DLL) 243 pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED243 pMod->enmType = !(s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) 244 244 ? KLDRTYPE_SHARED_LIBRARY_RELOCATABLE 245 245 : KLDRTYPE_SHARED_LIBRARY_FIXED; 246 246 else 247 pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED247 pMod->enmType = !(s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) 248 248 ? KLDRTYPE_EXECUTABLE_RELOCATABLE 249 249 : KLDRTYPE_EXECUTABLE_FIXED; … … 1580 1580 rc = pfnGetImport(pMod, iImp, IMAGE_ORDINAL32(pThunk->u1.Ordinal), NULL, &Value, &fKind, pvUser); 1581 1581 else if (KLDRMODPE_VALID_RVA(pModPE, pThunk->u1.Ordinal)) 1582 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, 1583 KLDRMODPE_RVA2TYPE(pvMapping, pThunk->u1.Ordinal, const char *), 1584 &Value, &fKind, pvUser); 1582 { 1583 const IMAGE_IMPORT_BY_NAME *pName = KLDRMODPE_RVA2TYPE(pvMapping, pThunk->u1.Ordinal, const IMAGE_IMPORT_BY_NAME *); 1584 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, pName->Name, &Value, &fKind, pvUser); 1585 } 1585 1586 else 1586 1587 { -
trunk/kLdr/kLdrRdrFile.c
r2861 r2869 1112 1112 SecAttr.lpSecurityDescriptor = NULL; 1113 1113 SecAttr.nLength = 0; 1114 File = CreateFile(pszFilename, GENERIC_READ | GENERIC_EXECUTE, FILE_SHARE_READ, &SecAttr, OPEN_ ALWAYS, 0, NULL);1114 File = CreateFile(pszFilename, GENERIC_READ | GENERIC_EXECUTE, FILE_SHARE_READ, &SecAttr, OPEN_EXISTING, 0, NULL); 1115 1115 if (File == INVALID_HANDLE_VALUE) 1116 1116 return GetLastError(); -
trunk/kLdr/testcase/tst-0-driver.c
r2864 r2869 72 72 hMod = (HKLDRMOD)0xffffeeee; 73 73 strcpy(szErr, pszErrInit); 74 rc = kLdrDyldLoad("tst-0 ", NULL, NULL, KLDRDYLD_SEARCH_KLDR,74 rc = kLdrDyldLoad("tst-0-a", NULL, NULL, KLDRDYLD_SEARCH_HOST, 75 75 KLDRDYLD_LOAD_FLAGS_RECURSIVE_INIT, &hMod, szErr, sizeof(szErr)); 76 76 if (rc) 77 77 Failure("kLdrDyldLoad(\"tst-0\",...) failed, rc=%d (%#x). szErr='%s'.\n", rc, rc, szErr); 78 if ( strcmp(szErr, pszErrInit))78 if (!strcmp(szErr, pszErrInit)) 79 79 Failure("szErr wasn't set.\n"); 80 80 if (hMod == (HKLDRMOD)0xffffeeee)
Note:
See TracChangeset
for help on using the changeset viewer.