Changeset 52 for trunk/kLdr/kLdrModMachO.c
- Timestamp:
- Jul 9, 2013, 7:03:37 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrModMachO.c
r51 r52 126 126 /** Pointer to the user mapping. */ 127 127 void *pvMapping; 128 /** The module open flags. */ 129 KU32 fOpenFlags; 128 130 129 131 /** The offset of the image. (FAT fun.) */ … … 188 190 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 189 191 190 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, PKLDRMODMACHO *ppMod);192 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppMod); 191 193 static int kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage, 192 KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, PKBOOL pfCanLoad,193 PK LDRADDR pLinkAddress);194 KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, 195 PKBOOL pfCanLoad, PKLDRADDR pLinkAddress); 194 196 static int kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStringPool, KU32 cbStringPool); 195 197 static int kldrModMachOAdjustBaseAddress(PKLDRMODMACHO pModMachO, PKLDRADDR pBaseAddress); … … 248 250 * Create the instance data and do a minimal header validation. 249 251 */ 250 rc = kldrModMachODoCreate(pRdr, offNewHdr == -1 ? 0 : offNewHdr, &pModMachO);252 rc = kldrModMachODoCreate(pRdr, offNewHdr == -1 ? 0 : offNewHdr, fFlags, &pModMachO); 251 253 if (!rc) 252 254 { … … 278 280 * simplify cleanup on failure. 279 281 */ 280 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, PKLDRMODMACHO *ppModMachO)282 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppModMachO) 281 283 { 282 284 union … … 355 357 : sizeof(mach_header_64_t) + offImage); 356 358 if (!rc) 357 rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage, 359 rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage, fOpenFlags, 358 360 &cSegments, &cSections, &cbStringPool, &fCanLoad, &LinkAddress); 359 361 if (rc) … … 456 458 pModMachO->pvBits = NULL; 457 459 pModMachO->pvMapping = NULL; 460 pModMachO->fOpenFlags = fOpenFlags; 458 461 pModMachO->Hdr = s.Hdr64; 459 462 if ( s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE … … 512 515 */ 513 516 static int kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage, 514 KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, PKBOOL pfCanLoad,515 PK LDRADDR pLinkAddress)517 KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, 518 PKBOOL pfCanLoad, PKLDRADDR pLinkAddress) 516 519 { 517 520 union … … 526 529 } u; 527 530 const KU64 cbFile = kRdrSize(pRdr) - offImage; 531 const char *pchCurSegName = NULL; 528 532 KU32 cSegments = 0; 529 533 KU32 cSections = 0; … … 667 671 break; 668 672 673 case S_MOD_INIT_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ constructors) */ 674 if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO)) 675 return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION; 676 case S_MOD_TERM_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ destructors) */ 677 if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO)) 678 return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION; 679 if (pSect->reserved1 || pSect->reserved2) 680 return KLDR_ERR_MACHO_BAD_SECTION; 681 fFileBits = 1; 682 break; /* ignored */ 683 669 684 case S_LITERAL_POINTERS: 670 685 case S_INTERPOSING: 671 686 case S_GB_ZEROFILL: 672 case S_MOD_INIT_FUNC_POINTERS: 673 return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION; 674 case S_MOD_TERM_FUNC_POINTERS: 675 return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION; 687 return KLDR_ERR_MACHO_UNSUPPORTED_SECTION; 676 688 677 689 default: … … 720 732 721 733 /* a new segment? */ 722 if ( cSections == 1723 || kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))734 if ( !pchCurSegName 735 || kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname))) 724 736 { 725 737 #if 0 /** @todo This doesn't work because of BSS. */ … … 735 747 736 748 /* ok. count it and the string. */ 749 pchCurSegName = &pSect->segname[0]; 750 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1; 737 751 cSegments++; 738 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;739 752 740 753 /* Link address lower? */ … … 855 868 break; 856 869 870 case S_MOD_INIT_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ constructors) */ 871 if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO)) 872 return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION; 873 case S_MOD_TERM_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ destructors) */ 874 if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO)) 875 return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION; 876 if (pSect->reserved1 || pSect->reserved2) 877 return KLDR_ERR_MACHO_BAD_SECTION; 878 fFileBits = 1; 879 break; /* ignored */ 880 857 881 case S_LITERAL_POINTERS: 858 882 case S_INTERPOSING: 859 883 case S_GB_ZEROFILL: 860 884 return KLDR_ERR_MACHO_UNSUPPORTED_SECTION; 861 #if 1 /** @todo this requires a query API or flag... */862 case S_MOD_INIT_FUNC_POINTERS:863 return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION;864 case S_MOD_TERM_FUNC_POINTERS:865 return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION;866 #else867 case S_MOD_INIT_FUNC_POINTERS:868 case S_MOD_TERM_FUNC_POINTERS:869 fFileBits = 1;870 break; /* ignored */871 #endif872 885 873 886 default: … … 916 929 917 930 /* a new segment? */ 918 if ( ! cSections == 1919 || kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))931 if ( !pchCurSegName 932 || kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname))) 920 933 { 921 934 #if 0 /** @todo This doesn't work because of BSS. */ … … 931 944 932 945 /* ok. count it and the string. */ 946 pchCurSegName = &pSect->segname[0]; 947 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1; 933 948 cSegments++; 934 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;935 949 936 950 /* Link address lower? */ … … 1108 1122 const symtab_command_t *pSymTab; 1109 1123 } u; 1124 const char *pchCurSegName = NULL; 1110 1125 KU32 cLeft = pModMachO->Hdr.ncmds; 1111 1126 KU32 cbLeft = pModMachO->Hdr.sizeofcmds; 1112 1127 const KU8 *pb = pModMachO->pbLoadCommands; 1113 int fFirstSegment = 1;1114 1128 PKLDRSEG pSeg = &pModMachO->pMod->aSegments[0]; 1115 1129 PKLDRMODMACHOSEG pSegExtra = &pModMachO->aSegments[0]; … … 1178 1192 } 1179 1193 1180 if ( fFirstSegment1181 || kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))1194 if ( !pchCurSegName 1195 || kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname))) 1182 1196 { 1183 1197 /* close the previous segment */ … … 1213 1227 pSeg->MapAddress = 0; 1214 1228 1229 pSegExtra->iOrgSegNo = pSegExtra - &pModMachO->aSegments[0]; 1215 1230 pSegExtra->cSections = 0; 1216 1231 pSegExtra->paSections = pSectExtra; … … 1218 1233 pSeg++; 1219 1234 pSegExtra++; 1220 fFirstSegment = 0;1235 pchCurSegName = &pSect->segname[0]; 1221 1236 } 1222 1237 else … … 1313 1328 } 1314 1329 1315 if ( fFirstSegment1316 || kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))1330 if ( !pchCurSegName 1331 || kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname))) 1317 1332 { 1318 1333 /* close the previous segment */ … … 1354 1369 pSeg++; 1355 1370 pSegExtra++; 1356 fFirstSegment = 0;1371 pchCurSegName = &pSect->segname[0]; 1357 1372 } 1358 1373 else
Note:
See TracChangeset
for help on using the changeset viewer.