Changeset 2859
- Timestamp:
- Nov 6, 2006, 5:48:53 AM (18 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/kLdr/Makefile.kmk ¶
r2858 r2859 25 25 # 26 26 27 28 DEPTH = .. 29 include $(PATH_KBUILD)/header.kmk 30 31 DEFAULT_PASSES := $(filter-out PACKING, $(DEFAULT_PASSES)) # annoying on windows. 27 32 28 33 # … … 156 161 157 162 # generate rules. 158 DEPTH = .. 159 include $(PATH_KBUILD)/rules.kmk 163 include $(PATH_KBUILD)/footer.kmk 160 164 -
TabularUnified trunk/kLdr/kLdr.h ¶
r2858 r2859 64 64 #define NIL_KLDRADDR (~(uint64_t)0) 65 65 66 /** @def PRI_KLDRADDR 67 * printf format type. */ 68 #ifdef _MSC_VER 69 # define PRI_KLDRADDR "I64x" 70 #else 71 # define PRI_KLDRADDR "llx" 72 #endif 73 74 66 75 /** The kLdr size type. */ 67 76 typedef uint64_t KLDRSIZE; … … 70 79 /** Pointer to a const kLdr size. */ 71 80 typedef const KLDRSIZE *PCKLDRSIZE; 81 82 /** @def PRI_KLDRSIZE 83 * printf format type. */ 84 #ifdef _MSC_VER 85 # define PRI_KLDRSIZE "I64x" 86 #else 87 # define PRI_KLDRSIZE "llx" 88 #endif 72 89 73 90 … … 404 421 * Set to -1 if no file backing (like BSS). */ 405 422 off_t cbFile; 423 /** The relative virtual address when mapped. 424 * Set to NIL_KLDRADDR if the segment isn't supposed to be mapped. */ 425 KLDRADDR RVA; 426 /** The size of the segment including the alignment gap up to the next segment when mapped. */ 427 size_t cbMapped; 406 428 /** The address the segment was mapped at by kLdrModMap(). 407 429 * Set to 0 if not mapped. */ 408 430 uintptr_t MapAddress; 409 /** The size of the segment including the alignment gap up to the next segment when mapped. */410 size_t cbMapped;411 431 } KLDRSEG; 412 432 /** Pointer to a loader segment. */ … … 551 571 /** Special import module ordinal value used to indicate that there is no 552 572 * specific module associated with the requested symbol. */ 553 #define NIL_KLDRMOD_IMPORT (~(uint32_t)0)573 #define NIL_KLDRMOD_IMPORT (~(uint32_t)0) 554 574 555 575 /** Special symbol ordinal value used to indicate that the symbol 556 576 * only has a string name. */ 557 #define NIL_KLDRMOD_SYM_ORDINAL (~(uint32_t)0)577 #define NIL_KLDRMOD_SYM_ORDINAL (~(uint32_t)0) 558 578 559 579 … … 601 621 * @param pMod The module which fixups are begin applied. 602 622 * @param iImport The import module ordinal number or NIL_KLDRMOD_IMPORT. 603 * @param uSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.604 * @param pszSymbol The symbol name. Can be NULL if uSymbol isn't nil.623 * @param iSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 624 * @param pszSymbol The symbol name. Can be NULL if iSymbol isn't nil. 605 625 * @param puValue Where to store the symbol value. 606 626 * @param pfKind Where to store the symbol kind flags. 607 627 * @param pvUser The user parameter specified to the relocation function. 608 628 */ 609 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol,629 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pszSymbol, 610 630 PKLDRADDR puValue, uint32_t *pfKind, void *pvUser); 611 631 /** Pointer to a import callback. */ … … 619 639 * 620 640 * @param pMod The module which symbols are being enumerated.s 621 * @param uSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.641 * @param iSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 622 642 * @param pszSymbol The symbol name. This can be NULL if there is a symbol ordinal. 623 643 * This can also be an empty string if the symbol doesn't have a name … … 627 647 * @param pvUser The user parameter specified to kLdrModEnumSymbols(). 628 648 */ 629 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t uSymbol, const char *pszSymbol,649 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *pszSymbol, 630 650 KLDRADDR uValue, uint32_t fKind, void *pvUser); 631 651 /** Pointer to a symbol enumerator callback. */ … … 652 672 */ 653 673 typedef int FNKLDRENUMDBG(PKLDRMOD pMod, uint32_t iDbgInfo, KLDRDBGINFOTYPE enmType, int16_t iMajorVer, int16_t iMinorVer, 654 off_t offFile, KLDRADDR LinkAddress, off_tcb, const char *pszExtFile, void *pvUser);674 off_t offFile, KLDRADDR LinkAddress, KLDRSIZE cb, const char *pszExtFile, void *pvUser); 655 675 /** Pointer to a debug info enumberator callback. */ 656 676 typedef FNKLDRENUMDBG *PFNKLDRENUMDBG; … … 661 681 int kLdrModClose(PKLDRMOD pMod); 662 682 663 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,683 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 664 684 const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, 665 685 PKLDRADDR puValue, uint32_t *pfKind); … … 730 750 731 751 /** @copydoc kLdrModQuerySymbol */ 732 int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,752 int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 733 753 const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, 734 754 PKLDRADDR puValue, uint32_t *pfKind); -
TabularUnified trunk/kLdr/kLdrDyldMod.c ¶
r2856 r2859 881 881 * pvUser points to the KLDRDYLDMOD. 882 882 */ 883 static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol,883 static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pszSymbol, 884 884 PKLDRADDR puValue, uint32_t *pfKind, void *pvUser) 885 885 { … … 907 907 908 908 rc = kLdrModQuerySymbol(pPrereqMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, 909 uSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pPrereqMod, puValue, pfKind);909 iSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pPrereqMod, puValue, pfKind); 910 910 if (rc) 911 911 { … … 915 915 else 916 916 kldrDyldFailure(rc, "%s[%d]->%s.%d", pDyldMod->pMod->pszName, iImport, 917 pPrereqMod->pMod->pszName, uSymbol);917 pPrereqMod->pMod->pszName, iSymbol); 918 918 } 919 919 } … … 929 929 KLDRADDR uValue; 930 930 rc = kLdrModQuerySymbol(pBindMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, 931 uSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pBindMod, &uValue, &fKind);931 iSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pBindMod, &uValue, &fKind); 932 932 if ( !rc 933 933 && ( !fFound … … 952 952 kldrDyldFailure(rc, "%s->%s", pDyldMod->pMod->pszName, pszSymbol); 953 953 else 954 kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, uSymbol);954 kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, iSymbol); 955 955 } 956 956 } -
TabularUnified trunk/kLdr/kLdrMod.c ¶
r2858 r2859 260 260 * There are two special values that can be used: 261 261 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 262 * @param uSymbol The symbol ordinal. (optional)262 * @param iSymbol The symbol ordinal. (optional) 263 263 * @param pszSymbol The symbol name. (optional) 264 264 * @param pfnGetForwarder The callback to use when resolving a forwarder symbol. This is optional … … 268 268 * @param pfKind Where to store the symbol kind. (optional) 269 269 */ 270 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,270 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 271 271 const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, 272 272 PKLDRADDR puValue, uint32_t *pfKind) … … 279 279 if (pfKind) 280 280 *pfKind = 0; 281 return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, uSymbol, pszSymbol, pfnGetForwarder, pvUser, puValue, pfKind);281 return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, iSymbol, pszSymbol, pfnGetForwarder, pvUser, puValue, pfKind); 282 282 } 283 283 -
TabularUnified trunk/kLdr/kLdrModPE.c ¶
r2858 r2859 193 193 || ( s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER32) 194 194 && s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER64)) 195 || !(s.FileHdr.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) 195 196 ) 196 197 return KLDR_ERR_PE_BAD_FILE_HEADER; … … 241 242 } 242 243 pMod->enmFmt = KLDRFMT_PE; 244 if (s.FileHdr.Characteristics & IMAGE_FILE_DLL) 245 pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED 246 ? KLDRTYPE_SHARED_LIBRARY_RELOCATABLE 247 : KLDRTYPE_SHARED_LIBRARY_FIXED; 248 else 249 pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED 250 ? KLDRTYPE_EXECUTABLE_RELOCATABLE 251 : KLDRTYPE_EXECUTABLE_FIXED; 243 252 pMod->u32Magic = 0; /* set upon success. */ 244 253 … … 286 295 pMod->aSegments[0].pchName = "TheHeaders"; 287 296 pMod->aSegments[0].cchName = sizeof("TheHeaders") - 1; 297 pMod->aSegments[0].enmProt = KLDRPROT_READONLY; 288 298 pMod->aSegments[0].cb = pModPE->Hdrs.OptionalHeader.SizeOfHeaders; 299 pMod->aSegments[0].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment; 289 300 pMod->aSegments[0].LinkAddress = pModPE->Hdrs.OptionalHeader.ImageBase; 290 pMod->aSegments[0].MapAddress = NIL_KLDRADDR; 291 pMod->aSegments[0].enmProt = KLDRPROT_READONLY; 301 pMod->aSegments[0].offFile = 0; 302 pMod->aSegments[0].cbFile = pModPE->Hdrs.OptionalHeader.SizeOfHeaders; 303 pMod->aSegments[0].RVA = 0; 304 if (pMod->cSegments > 1) 305 pMod->aSegments[0].cbMapped = pModPE->aShdrs[0].VirtualAddress; 306 else 307 pMod->aSegments[0].cbMapped = pModPE->Hdrs.OptionalHeader.SizeOfHeaders; 308 pMod->aSegments[0].MapAddress = 0; 292 309 293 310 /* The section headers. */ … … 295 312 { 296 313 char *pch; 314 315 /* unused */ 297 316 pMod->aSegments[i + 1].pvUser = NULL; 317 pMod->aSegments[i + 1].MapAddress = 0; 318 319 /* name */ 298 320 pMod->aSegments[i + 1].pchName = pch = &pModPE->aShdrs[i].Name[0]; 299 321 cb = IMAGE_SIZEOF_SHORT_NAME; … … 302 324 cb--; 303 325 pMod->aSegments[i + 1].cchName = cb; 326 327 /* size and addresses */ 304 328 if (!(pModPE->aShdrs[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) 305 329 { 306 pMod->aSegments[i + 1].cb = pModPE->aShdrs[i].Misc.VirtualSize; 307 pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress; 330 pMod->aSegments[i + 1].cb = pModPE->aShdrs[i].Misc.VirtualSize; 331 pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress 332 + pModPE->Hdrs.OptionalHeader.ImageBase; 333 pMod->aSegments[i + 1].RVA = pModPE->aShdrs[i].VirtualAddress; 334 pMod->aSegments[i + 1].cbMapped = pModPE->aShdrs[i].Misc.VirtualSize; 335 if (i + 2 < pMod->cSegments) 336 pMod->aSegments[i + 1].cbMapped= pModPE->aShdrs[i + 1].VirtualAddress 337 - pModPE->aShdrs[i].VirtualAddress; 308 338 } 309 339 else 310 340 { 311 pMod->aSegments[i + 1].cb = 0; 341 pMod->aSegments[i + 1].cb = 0; 342 pMod->aSegments[i + 1].cbMapped = 0; 312 343 pMod->aSegments[i + 1].LinkAddress = NIL_KLDRADDR; 344 pMod->aSegments[i + 1].RVA = 0; 313 345 } 314 pMod->aSegments[i + 1].MapAddress = NIL_KLDRADDR; 346 347 /* file location */ 348 pMod->aSegments[i + 1].offFile = pModPE->aShdrs[i].PointerToRawData; 349 pMod->aSegments[i + 1].cbFile = pModPE->aShdrs[i].SizeOfRawData; 350 if ( pMod->aSegments[i + 1].cbMapped > 0 /* if mapped */ 351 && (KLDRSIZE)pMod->aSegments[i + 1].cbFile > pMod->aSegments[i + 1].cbMapped) 352 pMod->aSegments[i + 1].cbFile = pMod->aSegments[i + 1].cbMapped; 353 354 /* protection */ 315 355 switch ( pModPE->aShdrs[i].Characteristics 316 356 & (IMAGE_SCN_MEM_SHARED | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE)) … … 349 389 break; 350 390 } 391 392 /* alignment. */ 351 393 switch (pModPE->aShdrs[i].Characteristics & IMAGE_SCN_ALIGN_MASK) 352 394 { 353 default: kldrHlpAssert(0); 354 case 0: pMod->aSegments[i + 1].Alignment = 0; break; 395 case 0: /* hope this is right... */ 396 pMod->aSegments[i + 1].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment; 397 break; 355 398 case IMAGE_SCN_ALIGN_1BYTES: pMod->aSegments[i + 1].Alignment = 1; break; 356 399 case IMAGE_SCN_ALIGN_2BYTES: pMod->aSegments[i + 1].Alignment = 2; break; … … 367 410 case IMAGE_SCN_ALIGN_4096BYTES: pMod->aSegments[i + 1].Alignment = 4096; break; 368 411 case IMAGE_SCN_ALIGN_8192BYTES: pMod->aSegments[i + 1].Alignment = 8192; break; 412 default: kldrHlpAssert(0); pMod->aSegments[i + 1].Alignment = 0; break; 369 413 } 370 414 } … … 558 602 * Get bits. 559 603 */ 560 if ( !*ppvBits)604 if (ppvBits && !*ppvBits) 561 605 { 562 606 if (pModPE->pvMapping) … … 576 620 577 621 /** @copydoc kLdrModQuerySymbol */ 578 static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,622 static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 579 623 const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, 580 624 PKLDRADDR puValue, uint32_t *pfKind) … … 605 649 * Simple, calculate the unbased ordinal and bounds check it. 606 650 */ 607 iExpOrd = uSymbol - pExpDir->Base;651 iExpOrd = iSymbol - pExpDir->Base; 608 652 if (iExpOrd >= KLDR_MAX(pExpDir->NumberOfNames, pExpDir->NumberOfFunctions)) 609 653 return KLDR_ERR_SYMBOL_NOT_FOUND; … … 702 746 uint32_t cchImpModule; 703 747 const char *pszSymbol; 704 uint32_t uSymbol;748 uint32_t iSymbol; 705 749 int rc; 706 750 … … 738 782 739 783 /* ascii to integer */ 740 uSymbol = 0;784 iSymbol = 0; 741 785 for (;;) 742 786 { … … 757 801 758 802 /* insert the digit */ 759 uSymbol *= uBase;760 uSymbol += uDigit;803 iSymbol *= uBase; 804 iSymbol += uDigit; 761 805 } 762 806 … … 764 808 } 765 809 else 766 uSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */810 iSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */ 767 811 768 812 … … 798 842 * Now the rest is up to the callback (almost). 799 843 */ 800 rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser);844 rc = pfnGetForwarder(pModPE->pMod, iImpModule, iSymbol, pszSymbol, puValue, pfKind, pvUser); 801 845 if (!rc && pfKind) 802 846 *pfKind |= KLDRSYMKIND_FORWARDER; … … 831 875 if ( pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size 832 876 < sizeof(IMAGE_EXPORT_DIRECTORY)) 833 return KLDR_ERR_SYMBOL_NOT_FOUND; 877 return 0; /* no exports to enumerate, return success. */ 878 834 879 pExpDir = KLDRMODPE_RVA2TYPE(pvBits, 835 880 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, … … 863 908 for (iName = 0; iName < cNames; iName++) 864 909 { 865 if ( !paOrdinals[iName] != iFunction)910 if (paOrdinals[iName] != iFunction) 866 911 continue; 867 912 fFoundName = 1; 868 rc = pfnCallback(pMod, i Name+ pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *),913 rc = pfnCallback(pMod, iFunction + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *), 869 914 uValue, fKind, pvUser); 870 915 if (rc) … … 877 922 if (!fFoundName) 878 923 { 879 rc = pfnCallback(pMod, i Name+ pExpDir->Base, NULL, uValue, fKind, pvUser);924 rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, uValue, fKind, pvUser); 880 925 if (rc) 881 926 return rc; … … 958 1003 while (pImpDesc->Name && pImpDesc->FirstThunk) 959 1004 { 960 pModPE->cImportModules = 0;1005 pModPE->cImportModules++; 961 1006 pImpDesc++; 962 1007 }
Note:
See TracChangeset
for help on using the changeset viewer.