Changeset 41 in kStuff
- Timestamp:
- Aug 24, 2011 2:35:57 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/k/kLdr.h
r29 r41 337 337 /** Core or dump. */ 338 338 KLDRTYPE_CORE, 339 /** Debug module (debug info with empty code & data segments). */ 340 KLDRTYPE_DEBUG_INFO, 339 341 /** The end of the valid types values (exclusive). */ 340 342 KLDRTYPE_END, … … 523 525 * @param iMajorVer The major version number of the debug info format. -1 if unknow - implies invalid iMinorVer. 524 526 * @param iMinorVer The minor version number of the debug info format. -1 when iMajorVer is -1. 527 * @param pszPartNm The name of the debug info part, NULL if not applicable. 525 528 * @param offFile The file offset *if* this type has one specific location in the executable image file. 526 529 * This is -1 if there isn't any specific file location. … … 532 535 */ 533 536 typedef int FNKLDRENUMDBG(PKLDRMOD pMod, KU32 iDbgInfo, KLDRDBGINFOTYPE enmType, KI16 iMajorVer, KI16 iMinorVer, 534 KLDRFOFF offFile, KLDRADDR LinkAddress, KLDRSIZE cb, const char *pszExtFile, void *pvUser); 537 const char *pszPartNm, KLDRFOFF offFile, KLDRADDR LinkAddress, KLDRSIZE cb, 538 const char *pszExtFile, void *pvUser); 535 539 /** Pointer to a debug info enumerator callback. */ 536 540 typedef FNKLDRENUMDBG *PFNKLDRENUMDBG; -
trunk/kLdr/kLdrMod.c
r30 r41 311 311 return rc; 312 312 if ( u.u16 == IMAGE_DOS_SIGNATURE 313 && kRdrSize(pRdr) > sizeof(IMAGE_DOS_HEADER))313 && kRdrSize(pRdr) > (KFOFF)sizeof(IMAGE_DOS_HEADER)) 314 314 { 315 315 rc = kRdrRead(pRdr, &u, sizeof(u.u32), K_OFFSETOF(IMAGE_DOS_HEADER, e_lfanew)); -
trunk/kLdr/kLdrModMachO.c
r29 r41 330 330 return KLDR_ERR_MACHO_UNSUPPORTED_MACHINE; 331 331 } 332 if (s.Hdr32.filetype != MH_OBJECT) 332 if ( s.Hdr32.filetype != MH_OBJECT 333 && s.Hdr32.filetype != MH_EXECUTE 334 && s.Hdr32.filetype != MH_DYLIB 335 && s.Hdr32.filetype != MH_DSYM) 333 336 return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE; 334 337 … … 432 435 switch (s.Hdr32.filetype) 433 436 { 434 case MH_OBJECT: 435 pMod->enmType = KLDRTYPE_OBJECT; 436 break; 437 case MH_OBJECT: pMod->enmType = KLDRTYPE_OBJECT; break; 438 case MH_EXECUTE: pMod->enmType = KLDRTYPE_EXECUTABLE_FIXED; break; 439 case MH_DYLIB: pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break; 440 case MH_DSYM: pMod->enmType = KLDRTYPE_DEBUG_INFO; break; 437 441 default: 438 442 return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE; … … 677 681 { 678 682 case MH_OBJECT: 683 case MH_EXECUTE: 684 case MH_DYLIB: 685 case MH_DSYM: 679 686 { 680 687 cSections++; … … 852 859 { 853 860 case MH_OBJECT: 861 case MH_EXECUTE: 862 case MH_DYLIB: 863 case MH_DSYM: 854 864 { 855 865 cSections++; … … 1000 1010 { 1001 1011 case MH_OBJECT: 1012 case MH_EXECUTE: 1013 case MH_DYLIB: 1014 case MH_DSYM: 1002 1015 if (!cSegments) 1003 1016 return KLDR_ERR_MACHO_BAD_OBJECT_FILE; … … 1073 1086 { 1074 1087 case MH_OBJECT: 1088 case MH_EXECUTE: 1089 case MH_DYLIB: 1090 case MH_DSYM: 1075 1091 { 1076 1092 /* Section data extract. */ … … 1204 1220 { 1205 1221 case MH_OBJECT: 1222 case MH_EXECUTE: 1223 case MH_DYLIB: 1224 case MH_DSYM: 1206 1225 { 1207 1226 /* Section data extract. */ … … 1321 1340 { 1322 1341 case MH_OBJECT: 1342 case MH_EXECUTE: 1343 case MH_DYLIB: /** @todo ??? */ 1344 case MH_DSYM: 1323 1345 pModMachO->offSymbols = u.pSymTab->symoff + pModMachO->offImage; 1324 1346 pModMachO->cSymbols = u.pSymTab->nsyms; … … 1396 1418 { 1397 1419 case MH_OBJECT: 1420 case MH_EXECUTE: 1421 case MH_DYLIB: /** @todo dylib */ 1422 case MH_DSYM: 1398 1423 { 1399 1424 KLDRADDR cb1; … … 1505 1530 * Take action according to file type. 1506 1531 */ 1507 if (pModMachO->Hdr.filetype == MH_OBJECT) 1532 if ( pModMachO->Hdr.filetype == MH_OBJECT 1533 || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */ 1534 || pModMachO->Hdr.filetype == MH_DYLIB 1535 || pModMachO->Hdr.filetype == MH_DSYM) 1508 1536 { 1509 1537 rc = kldrModMachOLoadObjSymTab(pModMachO); … … 1797 1825 * Take action according to file type. 1798 1826 */ 1799 if (pModMachO->Hdr.filetype == MH_OBJECT) 1827 if ( pModMachO->Hdr.filetype == MH_OBJECT 1828 || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */ 1829 || pModMachO->Hdr.filetype == MH_DYLIB 1830 || pModMachO->Hdr.filetype == MH_DSYM) 1800 1831 { 1801 1832 rc = kldrModMachOLoadObjSymTab(pModMachO); … … 2110 2141 static int kldrModMachOEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser) 2111 2142 { 2112 #if 0 2113 PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData; 2114 const IMAGE_DEBUG_DIRECTORY *pDbgDir; 2115 KU32 iDbgInfo; 2116 KU32 cb; 2117 int rc; 2118 2119 /* 2120 * Check that there is a debug directory first. 2121 */ 2122 cb = pModMachO->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size; 2123 if ( cb < sizeof(IMAGE_DEBUG_DIRECTORY) /* screw borland linkers */ 2124 || !pModMachO->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress) 2125 return 0; 2126 2127 /* 2128 * Make sure we've got mapped bits. 2129 */ 2130 rc = kldrModMachOBitsAndBaseAddress(pModMachO, &pvBits, NULL); 2131 if (rc) 2132 return rc; 2133 2134 /* 2135 * Enumerate the debug directory. 2136 */ 2137 pDbgDir = KLDRMODMACHO_RVA2TYPE(pvBits, 2138 pModMachO->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress, 2139 const IMAGE_DEBUG_DIRECTORY *); 2140 for (iDbgInfo = 0;; iDbgInfo++, pDbgDir++, cb -= sizeof(IMAGE_DEBUG_DIRECTORY)) 2141 { 2142 KLDRDBGINFOTYPE enmDbgInfoType; 2143 2144 /* convert the type. */ 2145 switch (pDbgDir->Type) 2146 { 2147 case IMAGE_DEBUG_TYPE_UNKNOWN: 2148 case IMAGE_DEBUG_TYPE_FPO: 2149 case IMAGE_DEBUG_TYPE_COFF: /*stabs dialect??*/ 2150 case IMAGE_DEBUG_TYPE_MISC: 2151 case IMAGE_DEBUG_TYPE_EXCEPTION: 2152 case IMAGE_DEBUG_TYPE_FIXUP: 2153 case IMAGE_DEBUG_TYPE_BORLAND: 2154 default: 2155 enmDbgInfoType = KLDRDBGINFOTYPE_UNKNOWN; 2156 break; 2157 case IMAGE_DEBUG_TYPE_CODEVIEW: 2158 enmDbgInfoType = KLDRDBGINFOTYPE_CODEVIEW; 2159 break; 2160 } 2161 2162 rc = pfnCallback(pMod, iDbgInfo, 2163 enmDbgInfoType, pDbgDir->MajorVersion, pDbgDir->MinorVersion, 2164 pDbgDir->PointerToRawData ? pDbgDir->PointerToRawData : -1, 2165 pDbgDir->AddressOfRawData ? pDbgDir->AddressOfRawData : NIL_KLDRADDR, 2166 pDbgDir->SizeOfData, 2167 NULL, 2168 pvUser); 2169 if (rc) 2143 PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData; 2144 int rc = 0; 2145 KU32 iSect; 2146 2147 for (iSect = 0; iSect < pModMachO->cSections; iSect++) 2148 { 2149 section_32_t *pMachOSect = pModMachO->paSections[iSect].pvMachoSection; /* (32-bit & 64-bit starts the same way) */ 2150 if (kHlpStrComp(pMachOSect->segname, "DWARF")) 2151 continue; 2152 2153 rc = pfnCallback(pMod, iSect, KLDRDBGINFOTYPE_DWARF, 0, 0, pMachOSect->sectname, 2154 pModMachO->paSections[iSect].offFile, 2155 pModMachO->paSections[iSect].LinkAddress, 2156 pModMachO->paSections[iSect].cb, 2157 NULL, pvUser); 2158 if (rc != 0) 2170 2159 break; 2171 2172 /* next */2173 if (cb <= sizeof(IMAGE_DEBUG_DIRECTORY))2174 break;2175 2160 } 2176 2161 2177 2162 return rc; 2178 #else2179 return 0;2180 #endif2181 2163 } 2182 2164 -
trunk/kLdr/kLdrModPE.c
r29 r41 1193 1193 1194 1194 rc = pfnCallback(pMod, iDbgInfo, 1195 enmDbgInfoType, pDbgDir->MajorVersion, pDbgDir->MinorVersion, 1195 enmDbgInfoType, pDbgDir->MajorVersion, pDbgDir->MinorVersion, NULL, 1196 1196 pDbgDir->PointerToRawData ? (KLDRFOFF)pDbgDir->PointerToRawData : -1, 1197 1197 pDbgDir->AddressOfRawData ? pDbgDir->AddressOfRawData : NIL_KLDRADDR,
Note:
See TracChangeset
for help on using the changeset viewer.