Changeset 2850
- Timestamp:
- Nov 2, 2006, 3:28:29 AM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.h
r2849 r2850 603 603 /** Valid symbol kind mask. */ 604 604 #define KLDRSYMKIND_MASK 0x00000033 605 /** Weak symbol. */ 606 #define KLDRSYMKIND_WEAK 0x00000100 605 607 /** @} */ 606 608 … … 917 919 /** The specified ARCH+CPU isn't compatible with image. */ 918 920 #define KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE (KLDR_ERR_BASE + 45) 921 /** Symbol not found. */ 922 #define KLDR_ERR_SYMBOL_NOT_FOUND (KLDR_ERR_BASE + 46) 919 923 920 924 /** Encountered a bad fixup. */ -
trunk/kLdr/kLdrDyldMod.c
r2848 r2850 877 877 878 878 879 /** 880 * @copydoc FNKLDRMODGETIMPORT 881 * pvUser points to the KLDRDYLDMOD. 882 */ 883 static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol, 884 PKLDRADDR puValue, uint32_t *pfKind, void *pvUser) 885 { 886 int rc; 887 PKLDRDYLDMOD pDyldMod = (PKLDRDYLDMOD)pvUser; 888 889 if (iImport != NIL_KLDRMOD_IMPORT) 890 { 891 /* specific import module search. */ 892 PKLDRDYLDMOD pPrereqMod; 893 894 KLDRDYLDMOD_ASSERT(iImport < pDyldMod->cPrereqs); 895 pPrereqMod = pDyldMod->papPrereqs[iImport]; 896 897 KLDRDYLDMOD_ASSERT(pPrereqMod); 898 KLDRDYLDMOD_ASSERT(pPrereqMod->u32MagicHead == KLDRDYMOD_MAGIC); 899 KLDRDYLDMOD_ASSERT(pPrereqMod->u32MagicTail == KLDRDYMOD_MAGIC); 900 KLDRDYLDMOD_ASSERT(pPrereqMod->enmState < KLDRSTATE_TERMINATING); 901 902 rc = kLdrModQuerySymbol(pPrereqMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, 903 uSymbol, pszSymbol, puValue, pfKind); 904 if (rc) 905 { 906 if (pszSymbol) 907 kldrDyldFailure(rc, "%s[%d]->%s.%s", pDyldMod->pMod->pszName, iImport, 908 pPrereqMod->pMod->pszName, pszSymbol); 909 else 910 kldrDyldFailure(rc, "%s[%d]->%s.%d", pDyldMod->pMod->pszName, iImport, 911 pPrereqMod->pMod->pszName, uSymbol); 912 } 913 } 914 else 915 { 916 /* bind list search. */ 917 unsigned fFound = 0; 918 PKLDRDYLDMOD pBindMod = g_pkLdrDyldBindHead; 919 rc = 0; 920 while (pBindMod) 921 { 922 uint32_t fKind; 923 KLDRADDR uValue; 924 rc = kLdrModQuerySymbol(pBindMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, 925 uSymbol, pszSymbol, &uValue, &fKind); 926 if ( !rc 927 && ( !fFound 928 || !(fKind & KLDRSYMKIND_WEAK) 929 ) 930 ) 931 { 932 *pfKind = fKind; 933 *puValue = uValue; 934 fFound = 1; 935 if (!(fKind & KLDRSYMKIND_WEAK)) 936 break; 937 } 938 939 /* next */ 940 pBindMod = pBindMod->Bind.pNext; 941 } 942 rc = fFound ? 0 : KLDR_ERR_SYMBOL_NOT_FOUND; 943 if (!fFound) 944 { 945 if (pszSymbol) 946 kldrDyldFailure(rc, "%s->%s", pDyldMod->pMod->pszName, pszSymbol); 947 else 948 kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, uSymbol); 949 } 950 } 951 952 return rc; 953 } 954 879 955 880 956 /** … … 895 971 896 972 /* do the job */ 897 rc = kLdrModFixupMapping(pMod->pMod, NULL, NULL);/// @todo fixme.973 rc = kLdrModFixupMapping(pMod->pMod, kldrDyldModFixupGetImportCallback, pMod);/// @todo fixme. 898 974 if (!rc) 899 975 pMod->enmState = KLDRSTATE_FIXED_UP;
Note:
See TracChangeset
for help on using the changeset viewer.