diff -r c7c26511138f -r 360bd6b35136 imgtools/imglib/e32image/tr_main.cpp --- a/imgtools/imglib/e32image/tr_main.cpp Wed Jun 16 16:51:40 2010 +0300 +++ b/imgtools/imglib/e32image/tr_main.cpp Wed Jun 23 16:56:47 2010 +0800 @@ -1,997 +1,981 @@ -/* -* Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* e32tools/e32image/tr_main.cpp -* Translate X->E32Image top level -* -*/ - - -#ifndef __LINUX__ - #include -#endif -#include - -#ifdef __VC32__ - #ifdef __MSVCDOTNET__ - #include - #include - #else //!__MSVCDOTNET__ - #include - #include - #endif //__MSVCDOTNET__ -#else // !__VC32__*/ -#ifdef __TOOLS2__ - #include - #include - #else - #include - #include -#endif // __VC32__ -#endif - -#include -#include - -#ifdef __SUPPORT_PE_FILES__ -#include "pe_file.h" -#endif -#ifdef __SUPPORT_ELF_FILES__ -#include "elftran.h" -#endif - -#include -#include -#include - -extern int gAlignConstSection; -extern TUint gConstSectionAddressMask; - -int gVerbose=0; -char *gFile1=NULL; -char *gFile2=NULL; -unsigned int gStack=0; -unsigned int gHeapMin=0; -unsigned int gHeapMax=0; -TUid gUid1=KNullUid; -TUid gUid2=KNullUid; -TUid gUid3=KNullUid; -unsigned int gSecureId=0; -unsigned int gVendorId=0; -unsigned int gVersionWord=0x00010000u; -int gCallEntryPoints=TRUE; -int gFixedAddress=FALSE; -int gPriority=EPriorityForeground; -SCapabilitySet gCapability={0}; -int gAllowDllData=FALSE; -// fix warning for Linux warning: 0 instead of NULL -TUint gDataBase=0; -int gCompress=TRUE; -unsigned int gFPU=0; - -int gCodePaged=FALSE; -int gCodeUnpaged=FALSE; -int gCodeDefaultPaged=FALSE; - -int gDataPaged=FALSE; -int gDataUnpaged=FALSE; -int gDataDefaultPaged=FALSE; - -int gDebuggable=FALSE; -int gSmpSafe=FALSE; - -int gSetStack=FALSE; -int gSetHeap=FALSE; -int gSetUid1=FALSE; -int gSetUid2=FALSE; -int gSetUid3=FALSE; -int gSetCallEntryPoints=FALSE; -int gSetFixedAddress=FALSE; -int gSetPriority=FALSE; -int gSetCapability=FALSE; -int gSetCompress=FALSE; -int gSetVersion=FALSE; -int gSetSecureId=FALSE; -int gSetVendorId=FALSE; -int gSetFPU=FALSE; - -int gSetCodePaged=FALSE; -int gSetDataPaged=FALSE; - -int gSetSymLkup=FALSE; -int gSetDebuggable=FALSE; -int gSetSmpSafe=FALSE; - -enum CompressionMethods -{ - ENoCompression = 0, - EDeflate = 1, - EBytePair = 2, -}; - -int gCompressionMethod = EDeflate; -int gSuppressComprMethod = FALSE; - -#ifdef __SUPPORT_PE_FILES__ -char* gX86imp=NULL; -int gX86num_imp_dlls=0; -int gX86imp_size=0; -int gX86num_imports=0; -#endif - -TBool gLittleEndian=ETrue; - -class E32ImageFileRef - { -public: - E32ImageFileRef() {iPtr = E32ImageFile::New();} - ~E32ImageFileRef() {delete iPtr;} - class E32ImageFile& Ref() {return *iPtr;} -private: - E32ImageFileRef(const E32ImageFileRef&); - E32ImageFileRef& operator=(const E32ImageFileRef&); -private: - E32ImageFile* iPtr; - }; - -int setPagedFlags(E32ImageFile& f) - { - unsigned check1 = gCodePaged + gCodeUnpaged + gCodeDefaultPaged; - unsigned check2 = gDataPaged + gDataUnpaged + gDataDefaultPaged; - - if (check1 > 1 || check2 > 1) - { - Print(EError, "Conflicting paging options.\n"); - return KErrArgument; - } - - if (gCodePaged) - { - f.iHdr->iFlags |= KImageCodePaged; - f.iHdr->iFlags &= ~KImageCodeUnpaged; - } - else if (gCodeUnpaged) - { - f.iHdr->iFlags |= KImageCodeUnpaged; - f.iHdr->iFlags &= ~KImageCodePaged; - } - else if (gCodeDefaultPaged) - { - f.iHdr->iFlags &= ~KImageCodePaged; - f.iHdr->iFlags &= ~KImageCodeUnpaged; - } - - if (gDataPaged) - { - f.iHdr->iFlags |= KImageDataPaged; - f.iHdr->iFlags &= ~KImageDataUnpaged; - } - else if (gDataUnpaged) - { - f.iHdr->iFlags |= KImageDataUnpaged; - f.iHdr->iFlags &= ~KImageDataPaged; - } - else if (gDataDefaultPaged) - { - f.iHdr->iFlags &= ~KImageDataPaged; - f.iHdr->iFlags &= ~KImageDataUnpaged; - } - - return KErrNone; - } - -void setDebuggableFlags(E32ImageFile& f) - { - if (gDebuggable) - { - f.iHdr->iFlags |= KImageDebuggable; - } - else - { - f.iHdr->iFlags &= ~KImageDebuggable; - } - } - -void setSmpSafeFlags(E32ImageFile& f) - { - if (gSmpSafe) - { - f.iHdr->iFlags |= KImageSMPSafe; - } - else - { - f.iHdr->iFlags &= ~KImageSMPSafe; - } - } - -int dotran(const char* ifilename, const char* ofilename) - { - E32ImageFileRef fRef; - E32ImageFile& f = fRef.Ref(); - int r=f.Translate(ifilename, gDataBase, gAllowDllData, gSetSymLkup); - if (r!=KErrNone) - return r; - if (gSetStack) - f.SetStackSize(gStack); - if (gSetHeap) - { - f.SetHeapSizeMin(gHeapMin); - f.SetHeapSizeMax(gHeapMax); - } - if (!gSetUid1) - gUid1=TUid::Uid(f.iHdr->iUid1); - if (!gSetUid2) - gUid2=TUid::Uid(f.iHdr->iUid2); - if (!gSetUid3) - gUid3=TUid::Uid(f.iHdr->iUid3); - if (!gSetSecureId) - gSecureId = f.iHdr->iUid3; - if (!gSetVendorId) - gVendorId = 0; - f.SetUids(gUid1, gUid2, gUid3); - f.SetSecureId(gSecureId); - f.SetVendorId(gVendorId); - if (gSetCallEntryPoints) - f.SetCallEntryPoints(gCallEntryPoints); - if (gSetCapability) - f.SetCapability(gCapability); - if (gSetPriority) - { - if (f.iHdr->iFlags&KImageDll) - Print(EWarning,"Cannot set priority of a DLL.\n"); - else - f.SetPriority((TProcessPriority)gPriority); - } - if (gSetFixedAddress) - { - if (f.iHdr->iFlags&KImageDll) - Print(EWarning,"Cannot set fixed address for DLL.\n"); - else - f.SetFixedAddress(gFixedAddress); - } - if (gSetVersion) - f.iHdr->iModuleVersion = gVersionWord; - - if(gCompress) - { - switch(gCompressionMethod) - { - case ENoCompression: - f.iHdr->iCompressionType = KFormatNotCompressed; - break; - - case EDeflate: - f.iHdr->iCompressionType = KUidCompressionDeflate; - - break; - - case EBytePair: - f.iHdr->iCompressionType = KUidCompressionBytePair; - - break; - - default: - Print(EError, "Unknown compression method:%d", gCompressionMethod); - return 1; - - } // End of switch() - - } - else - { - f.iHdr->iCompressionType = KFormatNotCompressed; - } - - - if (gSetFPU) - f.SetFPU(gFPU); - - r = setPagedFlags(f); - if (r != KErrNone) - { - return r; - } - - setDebuggableFlags(f); - - setSmpSafeFlags(f); - - f.CreateExportBitMap(); - f.AddExportDescription(); - f.UpdateHeaderCrc(); - r = f.Validate(); - if (r!=KErrNone) - return r; - - ofstream ofile(ofilename, ios::binary); - if (!ofile) - { - Print(EError,"Cannot open %s for output.\n",ofilename); - return 1; - } - ofile << f; - ofile.close(); - if (gVerbose) - f.Dump((TText*)ofilename,gVerbose); - return KErrNone; - } - - -int dodump(const char* ifilename) - { - E32ImageFile f; - TInt r = f.Open(ifilename); - if (r>0) - return 1; - else if (r==KErrCorrupt || r==KErrNotSupported) - { - Print(EError,"%s is not a valid E32Image file.\n",ifilename); - return 1; - } - else if (r!=0) - { - Print(EError,"Error %d reading %s.\n",r,ifilename); - return 1; - } - f.Dump((TText*)ifilename, gVerbose ? gVerbose : E32ImageFile::EDumpDefaults); - return KErrNone; - } - -int doalter(const char* ifilename) - { - E32ImageFile f; - TInt r = f.Open(ifilename); - if (r>0) - return 1; - else if (r==KErrCorrupt || r==KErrNotSupported) - { - Print(EError,"%s is not a valid E32Image file.\n",ifilename); - return 1; - } - else if (r!=0) - { - Print(EError,"Error %d reading %s.\n",r,ifilename); - return 1; - } - - TUint hdrfmt = f.iHdr->HeaderFormat(); - if (hdrfmt != KImageHdrFmt_V) - { - Print(EError,"Can't modify old format binaries\n"); - return 1; - } - - if (gDataBase) - { - Print(EWarning, "Ignoring -datalinkaddress Switch"); - } - if (gSetStack) - f.SetStackSize(gStack); - if (gSetHeap) - { - f.SetHeapSizeMin(gHeapMin); - f.SetHeapSizeMax(gHeapMax); - } - if (!gSetUid1) - gUid1=TUid::Uid(f.iHdr->iUid1); - if (!gSetUid2) - gUid2=TUid::Uid(f.iHdr->iUid2); - if (!gSetUid3) - gUid3=TUid::Uid(f.iHdr->iUid3); - f.SetUids(gUid1, gUid2, gUid3); - if (gSetSecureId) - f.SetSecureId(gSecureId); - if (gSetVendorId) - f.SetVendorId(gVendorId); - if (gSetCallEntryPoints) - f.SetCallEntryPoints(gCallEntryPoints); - if (gSetCapability) - f.SetCapability(gCapability); - if (gSetPriority) - { - if (f.iHdr->iFlags&KImageDll) - Print(EWarning,"Cannot set priority of a DLL.\n"); - else - f.SetPriority((TProcessPriority)gPriority); - } - if (gSetFixedAddress) - { - if (f.iHdr->iFlags&KImageDll) - Print(EWarning,"Cannot set fixed address for DLL.\n"); - else - f.SetFixedAddress(gFixedAddress); - } - if (gSetVersion) - f.iHdr->iModuleVersion = gVersionWord; - - if(gCompress) - { - switch(gCompressionMethod) - { - case ENoCompression: - f.iHdr->iCompressionType = KFormatNotCompressed; - break; - - case EDeflate: - f.iHdr->iCompressionType = KUidCompressionDeflate; - - break; - - case EBytePair: - f.iHdr->iCompressionType = KUidCompressionBytePair; - - break; - - default: - Print(EError, "Unknown compression method:%d", gCompressionMethod); - return 1; - - } // End of switch() - } - else - f.iHdr->iCompressionType = KFormatNotCompressed; - - if (gSetFPU) - f.SetFPU(gFPU); - - r = setPagedFlags(f); - if (r != KErrNone) - { - return r; - } - - setDebuggableFlags(f); - - setSmpSafeFlags(f); - - f.UpdateHeaderCrc(); - r = f.Validate(); - if (r!=KErrNone) - return r; - - ofstream ofile(ifilename, ios::binary); - if (!ofile) - { - Print(EError,"Cannot open %s for output.\n",ifilename); - return 1; - } - ofile << f; - ofile.close(); - if (gVerbose) - f.Dump((TText *)ifilename,gVerbose); - return KErrNone; - } - -int helpme(char *aStr) - { - Print(EAlways,"Syntax: %s [options] inputfile outputfile\n",aStr); - Print(EAlways," %s [options] e32imagefile\n",aStr); - Print(EAlways,"option: [-v] [[-no]call[entrypoint]] [-priority ]\n"); - Print(EAlways," [-stack ] [-heap ] [-uid ]\n"); - Print(EAlways," [-allowdlldata] [-datalinkaddress ] [-fixed] [-moving]\n"); - Print(EAlways," [-align-const-section] [-const-section-address-mask ]\n"); - Print(EAlways," [-[no]compress] [-compressionmethod none|deflate|bytepair]\n"); - Print(EAlways," [-capability \"\"] [-version M.m] [-vid ]\n"); - Print(EAlways," [-fpu ]\n"); - Print(EAlways," [-codepaging ]\n"); - Print(EAlways," [-datapaging ]\n"); - Print(EAlways," [-debuggable]\n"); - Print(EAlways," [-smpsafe]\n"); - Print(EAlways," [-sym_name_lkup]\n"); - Print(EAlways," [-dump [h][s][c][d][e][i]]\n"); - Print(EAlways,"flags for dump: h Header\n"); - Print(EAlways," s Security info\n"); - Print(EAlways," c Code section\n"); - Print(EAlways," d Data section\n"); - Print(EAlways," e Export info\n"); - Print(EAlways," i Import table\n"); - return KErrArgument; - } - -int isNumber(char *aStr) - { - return (aStr[0]>='0') && (aStr[0]<='9'); - } - -int getUIntArg(unsigned int &aVal, int argc, char *argv[], int i) - { - if (i>=argc) - return KErrArgument; - if (!isNumber(argv[i])) - return KErrArgument; -#ifdef __LINUX__ - int n; - sscanf(argv[i], "%i", &n); - aVal = n; -#else -#ifdef __TOOLS2__ -istringstream s(argv[i]/*, strlen(argv[i])*/); -#else -istrstream s(argv[i], strlen(argv[i])); -#endif - -#if defined(__MSVCDOTNET__) || defined(__TOOLS2__) - s >> setbase(0); -#endif //__MSVCDOTNET__ - - s >> aVal; -#endif // __LINUX__ - return KErrNone; - } - -int getCapabilitiesArg(SCapabilitySet& aVal, int argc, char *argv[], int i) - { - memset(&aVal,0,sizeof(aVal)); - if (i>=argc) - return KErrArgument; - if (isNumber(argv[i])) - return getUIntArg(*(TUint*)&aVal[0], argc, argv, i); - return ParseCapabilitiesArg(aVal,argv[i]); - } - -int getPriorityArg(int &aVal, int argc, char *argv[], int i) - { - - if (i>=argc) - return KErrArgument; - if (isNumber(argv[i])) - { -#ifdef __LINUX__ - int n; - sscanf(argv[i], "%i", &n); - aVal = n; -#else -#ifdef __TOOLS2__ -istringstream s(argv[i]); -#else -istrstream s(argv[i], strlen(argv[i])); -#endif - -#if defined(__MSVCDOTNET__) || defined(__TOOLS2__) - s >> setbase(0); -#endif //__MSVCDOTNET__ - - s>>aVal; -#endif // __LINUX__ - } - else - { - if (stricmp(argv[i], "low")==0) - aVal=EPriorityLow; - else if (strnicmp(argv[i], "background",4)==0) - aVal=EPriorityBackground; - else if (strnicmp(argv[i], "foreground",4)==0) - aVal=EPriorityForeground; - else if (stricmp(argv[i], "high")==0) - aVal=EPriorityHigh; - else if (strnicmp(argv[i], "windowserver",3)==0) - aVal=EPriorityWindowServer; - else if (strnicmp(argv[i], "fileserver",4)==0) - aVal=EPriorityFileServer; - else if (strnicmp(argv[i], "realtime",4)==0) - aVal=EPriorityRealTimeServer; - else if (strnicmp(argv[i], "supervisor",3)==0) - aVal=EPrioritySupervisor; - else - { - Print(EError, "Unrecognised priority\n"); - return KErrArgument; - } - } - if (aValEPrioritySupervisor) - { - Print(EError, "Priority out of range\n"); - return KErrArgument; - } - return KErrNone; - } - -int getVersionArg(unsigned int& aVal, const char* aArg) - { - const char* s = aArg; - unsigned int major = 0; - unsigned int minor = 0; - for (; major<=6553 && *s>='0' && *s<='9'; ++s) - major = major*10 + (*s - '0'); - if (*s == '.') - { - for (++s; minor<=6553 && *s>='0' && *s<='9'; ++s) - minor = minor*10 + (*s - '0'); - if (*s==0 && major<32768 && minor<32768) - { - aVal = (major << 16) | minor; - return KErrNone; - } - } - Print(EError, "Bad argument to -version\n"); - return KErrArgument; - } - -int getFPUArg(unsigned int &aVal, int argc, char *argv[], int i) - { - if (i>=argc) - return KErrArgument; - else if (strnicmp(argv[i], "softvfp", 7)==0) - aVal = 0; - else if (strnicmp(argv[i], "vfpv2", 5)==0) - aVal = 1; - else - { - Print(EError, "Bad argument to -fpu\n"); - return KErrArgument; - } - - return KErrNone; - } - -int getCompressionMethod(int &aVal, int argc, char *argv[], int i) -{ - if( i >= argc || argv[i] == NULL) - { - Print(EError, "Missing argument to -compressionmethod\n"); - return KErrArgument; - } - else if (strnicmp(argv[i], "none", 2) == 0) - { - aVal = ENoCompression; - } - else if (strnicmp(argv[i], "deflate", 7) == 0) - { - aVal = EDeflate; - } - else if (strnicmp(argv[i], "bytepair", 8) == 0) - { - aVal = EBytePair; - } - else - { - Print(EError, "Bad argument '%s' to -compressionmethod\n", argv[i]); - return KErrArgument; - } - - return KErrNone; - -} - - -int processCL(int argc, char *argv[]) - { - - int r=KErrNone; - int i=1; - while (i=argc) - return KErrArgument; - char* s=argv[i]; - while(char c = *(s++)) - { - if(c<'a') - c += 'a'-'A'; - switch(c) - { - case 'h': gVerbose |= E32ImageFile::EDumpHeader; break; - case 's': gVerbose |= E32ImageFile::EDumpSecurityInfo; break; - case 'c': gVerbose |= E32ImageFile::EDumpCode; break; - case 'd': gVerbose |= E32ImageFile::EDumpData; break; - case 'e': gVerbose |= E32ImageFile::EDumpExports; break; - case 'i': gVerbose |= E32ImageFile::EDumpImports; break; - default: return KErrArgument; - } - } - } - else if (stricmp("-stack", argv[i])==0) - { - i++; - gSetStack=TRUE; - r=getUIntArg(gStack, argc, argv, i); - } - else if (stricmp("-uid1", argv[i])==0) - { - i++; - gSetUid1=TRUE; - unsigned int id; - r=getUIntArg(id, argc, argv, i); - gUid1=TUid::Uid(id); - } - else if (stricmp("-uid2", argv[i])==0) - { - i++; - gSetUid2=TRUE; - unsigned int id; - r=getUIntArg(id, argc, argv, i); - gUid2=TUid::Uid(id); - } - else if (stricmp("-uid3", argv[i])==0) - { - i++; - gSetUid3=TRUE; - unsigned int id; - r=getUIntArg(id, argc, argv, i); - gUid3=TUid::Uid(id); - } - else if (stricmp("-version", argv[i])==0) - { - i++; - r=getVersionArg(gVersionWord, argv[i]); - gSetVersion=TRUE; - } - else if (stricmp("-sid", argv[i])==0) - { - i++; - r=getUIntArg(gSecureId, argc, argv, i); - gSetSecureId=TRUE; - } - else if (stricmp("-vid", argv[i])==0) - { - i++; - r=getUIntArg(gVendorId, argc, argv, i); - gSetVendorId=TRUE; - } - else if (strnicmp("-nocall", argv[i], 7)==0) - { - gSetCallEntryPoints=TRUE; - gCallEntryPoints=FALSE; - } - else if (strnicmp("-call", argv[i], 5)==0) - { - gSetCallEntryPoints=TRUE; - gCallEntryPoints=TRUE; - } - else if (strnicmp("-fixed", argv[i], 3)==0) - { - gSetFixedAddress=TRUE; - gFixedAddress=TRUE; - } - else if (strnicmp("-moving", argv[i], 3)==0) - { - gSetFixedAddress=TRUE; - gFixedAddress=FALSE; - } - else if (strnicmp("-priority", argv[i], 4)==0) - { - i++; - gSetPriority=TRUE; - r=getPriorityArg(gPriority,argc,argv,i); - } - else if (strnicmp("-capability", argv[i], 10)==0) - { - i++; - gSetCapability=TRUE; - r=getCapabilitiesArg(gCapability, argc, argv, i); - } - else if (strnicmp("-heap", argv[i], 4)==0) - { - i++; - gSetHeap=TRUE; - r=getUIntArg(gHeapMin, argc, argv, i); - if (r==KErrNone) - r=getUIntArg(gHeapMax, argc, argv, ++i); - } - else if (strnicmp("-allow", argv[i], 6)==0) // Note, toolchain passes 'allow' for 'allowdlldata' - { - gAllowDllData=TRUE; - } - else if( strnicmp("-compressionmethod", argv[i], 18) == 0) - { - if(!gSuppressComprMethod) - { - gCompress = TRUE; - gSetCompress = TRUE; - r = getCompressionMethod(gCompressionMethod, argc, argv, ++i); - } - else - { - ++i; // Skip the compression method because compessionmethod suppressed. - } - } - else if (strnicmp("-compress", argv[i], 9)==0) - { - gCompress=TRUE; - gSetCompress=TRUE; - gSuppressComprMethod=FALSE; - } - else if (strnicmp("-nocompress", argv[i], 11)==0) - { - gCompress=FALSE; - gSetCompress=TRUE; - gSuppressComprMethod = TRUE; - gCompressionMethod = ENoCompression; - } - else if (strnicmp("-datalinkaddress", argv[i], 16)==0) - { - i++; - r=getUIntArg(gDataBase, argc, argv, i); - } - else if (strnicmp("-align-const-section", argv[i], 20)==0) - { - gAlignConstSection=TRUE; - } - else if (strnicmp("-const-section-address-mask", argv[i], 27)==0) - { - i++; - r=getUIntArg(gConstSectionAddressMask, argc, argv, i); - } - else if (strnicmp("-fpu", argv[i], 4)==0) - { - i++; - r=getFPUArg(gFPU, argc, argv, i); - gSetFPU=TRUE; - } - else if (strnicmp("-paged", argv[i], 6) == 0) - { - gCodePaged=TRUE; - gSetCodePaged=TRUE; - } - else if (strnicmp("-unpaged", argv[i], 8) == 0) - { - gCodeUnpaged=TRUE; - gSetCodePaged=TRUE; - } - else if (strnicmp("-defaultpaged", argv[i], 13) == 0) - { - gCodeDefaultPaged=TRUE; - gSetCodePaged=TRUE; - } - else if (strnicmp("-codepaging", argv[i], 11)==0) - { - i++; - - if (i>=argc) - { - r = KErrArgument; - } - else if ( strnicmp(argv[i], "paged", 5) == 0 ) - { - gCodePaged=TRUE; - } - else if ( strnicmp(argv[i], "unpaged", 7) == 0 ) - { - gCodeUnpaged=TRUE; - } - else if ( strnicmp(argv[i], "default", 7) == 0 ) - { - gCodeDefaultPaged=TRUE; - } - else - { - Print(EError, "Bad argument to -codepaging\n"); - r = KErrArgument; - } - - gSetCodePaged=TRUE; - } - else if (strnicmp("-datapaging", argv[i], 11)==0) - { - i++; - - if (i>=argc) - { - r = KErrArgument; - } - else if ( strnicmp(argv[i], "paged", 5) == 0 ) - { - gDataPaged=TRUE; - } - else if ( strnicmp(argv[i], "unpaged", 7) == 0 ) - { - gDataUnpaged=TRUE; - } - else if ( strnicmp(argv[i], "default", 7) == 0 ) - { - gDataDefaultPaged=TRUE; - } - else - { - Print(EError, "Bad argument to -datapaging\n"); - r = KErrArgument; - } - - gSetDataPaged=TRUE; - } - else if (strnicmp("-sym_name_lkup", argv[i], 14) == 0) - { - gSetSymLkup=TRUE; - } - else if (strnicmp("-debuggable", argv[i], 11) == 0) - { - gDebuggable=TRUE; - gSetDebuggable=TRUE; - } - else if (strnicmp("-smpsafe", argv[i], 8) == 0) - { - gSmpSafe=TRUE; - gSetSmpSafe=TRUE; - } -#ifdef __SUPPORT_PE_FILES__ - else if (strnicmp("-x86imp=", argv[i], 8)==0) - { - const char* x86impfile=argv[i]+8; - FILE* f=fopen(x86impfile,"rb"); - if (!f) - r=KErrArgument; - else - { - fseek(f,0,SEEK_END); - long size=ftell(f); - fseek(f,0,SEEK_SET); - if (size>4) - { - gX86imp=new char[size]; - fread(gX86imp,1,size,f); - } - fclose(f); - r=KErrNone; - if (gX86imp) - { - gX86imp_size=ALIGN4(size); - int i; - int* p=(int*)gX86imp; - gX86num_imp_dlls=*p++; - for (i=0; iE32Image top level +* +*/ + + +#ifndef __LINUX__ + #include +#endif +#include + +#ifdef __VC32__ + #ifdef __MSVCDOTNET__ + #include + #include + #else //!__MSVCDOTNET__ + #include + #include + #endif //__MSVCDOTNET__ +#else // !__VC32__*/ +#ifdef __TOOLS2__ + #include + #include + #else + #include + #include +#endif // __VC32__ +#endif + +#include +#include + +#ifdef __SUPPORT_PE_FILES__ +#include "pe_file.h" +#endif +#ifdef __SUPPORT_ELF_FILES__ +#include "elftran.h" +#endif + +#include "h_utl.h" +#include "h_ver.h" +#include + +extern int gAlignConstSection; +extern TUint gConstSectionAddressMask; + +int gVerbose=0; +char *gFile1=NULL; +char *gFile2=NULL; +unsigned int gStack=0; +unsigned int gHeapMin=0; +unsigned int gHeapMax=0; +TUid gUid1=KNullUid; +TUid gUid2=KNullUid; +TUid gUid3=KNullUid; +unsigned int gSecureId=0; +unsigned int gVendorId=0; +unsigned int gVersionWord=0x00010000u; +int gCallEntryPoints=TRUE; +int gFixedAddress=FALSE; +int gPriority=EPriorityForeground; +SCapabilitySet gCapability={{0}}; +int gAllowDllData=FALSE; +// fix warning for Linux warning: 0 instead of NULL +TUint gDataBase=0; +int gCompress=TRUE; +unsigned int gFPU=0; + +int gCodePaged=FALSE; +int gCodeUnpaged=FALSE; +int gCodeDefaultPaged=FALSE; + +int gDataPaged=FALSE; +int gDataUnpaged=FALSE; +int gDataDefaultPaged=FALSE; + +int gDebuggable=FALSE; +int gSmpSafe=FALSE; + +int gSetStack=FALSE; +int gSetHeap=FALSE; +int gSetUid1=FALSE; +int gSetUid2=FALSE; +int gSetUid3=FALSE; +int gSetCallEntryPoints=FALSE; +int gSetFixedAddress=FALSE; +int gSetPriority=FALSE; +int gSetCapability=FALSE; +int gSetCompress=FALSE; +int gSetVersion=FALSE; +int gSetSecureId=FALSE; +int gSetVendorId=FALSE; +int gSetFPU=FALSE; + +int gSetCodePaged=FALSE; +int gSetDataPaged=FALSE; + +int gSetSymLkup=FALSE; +int gSetDebuggable=FALSE; +int gSetSmpSafe=FALSE; + +enum CompressionMethods +{ + ENoCompression = 0, + EDeflate = 1, + EBytePair = 2, +}; + +int gCompressionMethod = EDeflate; +int gSuppressComprMethod = FALSE; + +#ifdef __SUPPORT_PE_FILES__ +char* gX86imp=NULL; +int gX86num_imp_dlls=0; +int gX86imp_size=0; +int gX86num_imports=0; +#endif + +TBool gLittleEndian=ETrue; + +class E32ImageFileRef + { +public: + E32ImageFileRef() {iPtr = E32ImageFile::New();} + ~E32ImageFileRef() {delete iPtr;} + class E32ImageFile& Ref() {return *iPtr;} +private: + E32ImageFileRef(const E32ImageFileRef&); + E32ImageFileRef& operator=(const E32ImageFileRef&); +private: + E32ImageFile* iPtr; + }; + +int setPagedFlags(E32ImageFile& f) + { + unsigned check1 = gCodePaged + gCodeUnpaged + gCodeDefaultPaged; + unsigned check2 = gDataPaged + gDataUnpaged + gDataDefaultPaged; + + if (check1 > 1 || check2 > 1) + { + Print(EError, "Conflicting paging options.\n"); + return KErrArgument; + } + + if (gCodePaged) + { + f.iHdr->iFlags |= KImageCodePaged; + f.iHdr->iFlags &= ~KImageCodeUnpaged; + } + else if (gCodeUnpaged) + { + f.iHdr->iFlags |= KImageCodeUnpaged; + f.iHdr->iFlags &= ~KImageCodePaged; + } + else if (gCodeDefaultPaged) + { + f.iHdr->iFlags &= ~KImageCodePaged; + f.iHdr->iFlags &= ~KImageCodeUnpaged; + } + + if (gDataPaged) + { + f.iHdr->iFlags |= KImageDataPaged; + f.iHdr->iFlags &= ~KImageDataUnpaged; + } + else if (gDataUnpaged) + { + f.iHdr->iFlags |= KImageDataUnpaged; + f.iHdr->iFlags &= ~KImageDataPaged; + } + else if (gDataDefaultPaged) + { + f.iHdr->iFlags &= ~KImageDataPaged; + f.iHdr->iFlags &= ~KImageDataUnpaged; + } + + return KErrNone; + } + +void setDebuggableFlags(E32ImageFile& f) + { + if (gDebuggable) + { + f.iHdr->iFlags |= KImageDebuggable; + } + else + { + f.iHdr->iFlags &= ~KImageDebuggable; + } + } + +void setSmpSafeFlags(E32ImageFile& f) + { + if (gSmpSafe) + { + f.iHdr->iFlags |= KImageSMPSafe; + } + else + { + f.iHdr->iFlags &= ~KImageSMPSafe; + } + } + +int dotran(const char* ifilename, const char* ofilename) + { + E32ImageFileRef fRef; + E32ImageFile& f = fRef.Ref(); + int r=f.Translate(ifilename, gDataBase, gAllowDllData, gSetSymLkup); + if (r!=KErrNone) + return r; + if (gSetStack) + f.SetStackSize(gStack); + if (gSetHeap) + { + f.SetHeapSizeMin(gHeapMin); + f.SetHeapSizeMax(gHeapMax); + } + if (!gSetUid1) + gUid1=TUid::Uid(f.iHdr->iUid1); + if (!gSetUid2) + gUid2=TUid::Uid(f.iHdr->iUid2); + if (!gSetUid3) + gUid3=TUid::Uid(f.iHdr->iUid3); + if (!gSetSecureId) + gSecureId = f.iHdr->iUid3; + if (!gSetVendorId) + gVendorId = 0; + f.SetUids(gUid1, gUid2, gUid3); + f.SetSecureId(gSecureId); + f.SetVendorId(gVendorId); + if (gSetCallEntryPoints) + f.SetCallEntryPoints(gCallEntryPoints); + if (gSetCapability) + f.SetCapability(gCapability); + if (gSetPriority) + { + if (f.iHdr->iFlags&KImageDll) + Print(EWarning,"Cannot set priority of a DLL.\n"); + else + f.SetPriority((TProcessPriority)gPriority); + } + if (gSetFixedAddress) + { + if (f.iHdr->iFlags&KImageDll) + Print(EWarning,"Cannot set fixed address for DLL.\n"); + else + f.SetFixedAddress(gFixedAddress); + } + if (gSetVersion) + f.iHdr->iModuleVersion = gVersionWord; + + if(gCompress) + { + switch(gCompressionMethod) + { + case ENoCompression: + f.iHdr->iCompressionType = KFormatNotCompressed; + break; + + case EDeflate: + f.iHdr->iCompressionType = KUidCompressionDeflate; + + break; + + case EBytePair: + f.iHdr->iCompressionType = KUidCompressionBytePair; + + break; + + default: + Print(EError, "Unknown compression method:%d", gCompressionMethod); + return 1; + + } // End of switch() + + } + else + { + f.iHdr->iCompressionType = KFormatNotCompressed; + } + + + if (gSetFPU) + f.SetFPU(gFPU); + + r = setPagedFlags(f); + if (r != KErrNone) + { + return r; + } + + setDebuggableFlags(f); + + setSmpSafeFlags(f); + + f.CreateExportBitMap(); + f.AddExportDescription(); + f.UpdateHeaderCrc(); + r = f.Validate(); + if (r!=KErrNone) + return r; + + ofstream ofile(ofilename, ios::binary); + if (!ofile) + { + Print(EError,"Cannot open %s for output.\n",ofilename); + return 1; + } + ofile << f; + ofile.close(); + if (gVerbose) + f.Dump(ofilename,gVerbose); + return KErrNone; + } + + +int dodump(const char* ifilename) + { + E32ImageFile f; + TInt r = f.Open(ifilename); + if (r>0) + return 1; + else if (r==KErrCorrupt || r==KErrNotSupported) + { + Print(EError,"%s is not a valid E32Image file.\n",ifilename); + return 1; + } + else if (r!=0) + { + Print(EError,"Error %d reading %s.\n",r,ifilename); + return 1; + } + f.Dump(ifilename, gVerbose ? gVerbose : E32ImageFile::EDumpDefaults); + return KErrNone; + } + +int doalter(const char* ifilename) + { + E32ImageFile f; + TInt r = f.Open(ifilename); + if (r>0) + return 1; + else if (r==KErrCorrupt || r==KErrNotSupported) + { + Print(EError,"%s is not a valid E32Image file.\n",ifilename); + return 1; + } + else if (r!=0) + { + Print(EError,"Error %d reading %s.\n",r,ifilename); + return 1; + } + + TUint hdrfmt = f.iHdr->HeaderFormat(); + if (hdrfmt != KImageHdrFmt_V) + { + Print(EError,"Can't modify old format binaries\n"); + return 1; + } + + if (gDataBase) + { + Print(EWarning, "Ignoring -datalinkaddress Switch"); + } + if (gSetStack) + f.SetStackSize(gStack); + if (gSetHeap) + { + f.SetHeapSizeMin(gHeapMin); + f.SetHeapSizeMax(gHeapMax); + } + if (!gSetUid1) + gUid1=TUid::Uid(f.iHdr->iUid1); + if (!gSetUid2) + gUid2=TUid::Uid(f.iHdr->iUid2); + if (!gSetUid3) + gUid3=TUid::Uid(f.iHdr->iUid3); + f.SetUids(gUid1, gUid2, gUid3); + if (gSetSecureId) + f.SetSecureId(gSecureId); + if (gSetVendorId) + f.SetVendorId(gVendorId); + if (gSetCallEntryPoints) + f.SetCallEntryPoints(gCallEntryPoints); + if (gSetCapability) + f.SetCapability(gCapability); + if (gSetPriority) + { + if (f.iHdr->iFlags&KImageDll) + Print(EWarning,"Cannot set priority of a DLL.\n"); + else + f.SetPriority((TProcessPriority)gPriority); + } + if (gSetFixedAddress) + { + if (f.iHdr->iFlags&KImageDll) + Print(EWarning,"Cannot set fixed address for DLL.\n"); + else + f.SetFixedAddress(gFixedAddress); + } + if (gSetVersion) + f.iHdr->iModuleVersion = gVersionWord; + + if(gCompress) + { + switch(gCompressionMethod) + { + case ENoCompression: + f.iHdr->iCompressionType = KFormatNotCompressed; + break; + + case EDeflate: + f.iHdr->iCompressionType = KUidCompressionDeflate; + + break; + + case EBytePair: + f.iHdr->iCompressionType = KUidCompressionBytePair; + + break; + + default: + Print(EError, "Unknown compression method:%d", gCompressionMethod); + return 1; + + } // End of switch() + } + else + f.iHdr->iCompressionType = KFormatNotCompressed; + + if (gSetFPU) + f.SetFPU(gFPU); + + r = setPagedFlags(f); + if (r != KErrNone) + { + return r; + } + + setDebuggableFlags(f); + + setSmpSafeFlags(f); + + f.UpdateHeaderCrc(); + r = f.Validate(); + if (r!=KErrNone) + return r; + + ofstream ofile(ifilename, ios::binary); + if (!ofile) + { + Print(EError,"Cannot open %s for output.\n",ifilename); + return 1; + } + ofile << f; + ofile.close(); + if (gVerbose) + f.Dump(ifilename,gVerbose); + return KErrNone; + } + +int helpme(char *aStr) + { + Print(EAlways,"Syntax: %s [options] inputfile outputfile\n",aStr); + Print(EAlways," %s [options] e32imagefile\n",aStr); + Print(EAlways,"option: [-v] [[-no]call[entrypoint]] [-priority ]\n"); + Print(EAlways," [-stack ] [-heap ] [-uid ]\n"); + Print(EAlways," [-allowdlldata] [-datalinkaddress ] [-fixed] [-moving]\n"); + Print(EAlways," [-align-const-section] [-const-section-address-mask ]\n"); + Print(EAlways," [-[no]compress] [-compressionmethod none|deflate|bytepair]\n"); + Print(EAlways," [-capability \"\"] [-version M.m] [-vid ]\n"); + Print(EAlways," [-fpu ]\n"); + Print(EAlways," [-codepaging ]\n"); + Print(EAlways," [-datapaging ]\n"); + Print(EAlways," [-debuggable]\n"); + Print(EAlways," [-smpsafe]\n"); + Print(EAlways," [-sym_name_lkup]\n"); + Print(EAlways," [-dump [h][s][c][d][e][i]]\n"); + Print(EAlways,"flags for dump: h Header\n"); + Print(EAlways," s Security info\n"); + Print(EAlways," c Code section\n"); + Print(EAlways," d Data section\n"); + Print(EAlways," e Export info\n"); + Print(EAlways," i Import table\n"); + return KErrArgument; + } + +int isNumber(char *aStr) + { + return (aStr[0]>='0') && (aStr[0]<='9'); + } + +int getUIntArg(unsigned int &aVal, int argc, char *argv[], int i) + { + if (i>=argc) + return KErrArgument; + if (!isNumber(argv[i])) + return KErrArgument; + + return Val(aVal,argv[i]); + } + +int getCapabilitiesArg(SCapabilitySet& aVal, int argc, char *argv[], int i) + { + memset(&aVal,0,sizeof(aVal)); + if (i>=argc) + return KErrArgument; + if (isNumber(argv[i])) + return getUIntArg(*(TUint*)&aVal[0], argc, argv, i); + return ParseCapabilitiesArg(aVal,argv[i]); + } + +int getPriorityArg(int &aVal, int argc, char *argv[], int i) + { + + if (i>=argc) + return KErrArgument; + if (isNumber(argv[i])) + { +#ifdef __LINUX__ + int n; + sscanf(argv[i], "%i", &n); + aVal = n; +#else +#ifdef __TOOLS2__ +istringstream s(argv[i]); +#else +istrstream s(argv[i], strlen(argv[i])); +#endif + +#if defined(__MSVCDOTNET__) || defined(__TOOLS2__) + s >> setbase(0); +#endif //__MSVCDOTNET__ + + s>>aVal; +#endif // __LINUX__ + } + else + { + if (stricmp(argv[i], "low")==0) + aVal=EPriorityLow; + else if (strnicmp(argv[i], "background",4)==0) + aVal=EPriorityBackground; + else if (strnicmp(argv[i], "foreground",4)==0) + aVal=EPriorityForeground; + else if (stricmp(argv[i], "high")==0) + aVal=EPriorityHigh; + else if (strnicmp(argv[i], "windowserver",3)==0) + aVal=EPriorityWindowServer; + else if (strnicmp(argv[i], "fileserver",4)==0) + aVal=EPriorityFileServer; + else if (strnicmp(argv[i], "realtime",4)==0) + aVal=EPriorityRealTimeServer; + else if (strnicmp(argv[i], "supervisor",3)==0) + aVal=EPrioritySupervisor; + else + { + Print(EError, "Unrecognised priority\n"); + return KErrArgument; + } + } + if (aValEPrioritySupervisor) + { + Print(EError, "Priority out of range\n"); + return KErrArgument; + } + return KErrNone; + } + +int getVersionArg(unsigned int& aVal, const char* aArg) + { + const char* s = aArg; + unsigned int major = 0; + unsigned int minor = 0; + for (; major<=6553 && *s>='0' && *s<='9'; ++s) + major = major*10 + (*s - '0'); + if (*s == '.') + { + for (++s; minor<=6553 && *s>='0' && *s<='9'; ++s) + minor = minor*10 + (*s - '0'); + if (*s==0 && major<32768 && minor<32768) + { + aVal = (major << 16) | minor; + return KErrNone; + } + } + Print(EError, "Bad argument to -version\n"); + return KErrArgument; + } + +int getFPUArg(unsigned int &aVal, int argc, char *argv[], int i) + { + if (i>=argc) + return KErrArgument; + else if (strnicmp(argv[i], "softvfp", 7)==0) + aVal = 0; + else if (strnicmp(argv[i], "vfpv2", 5)==0) + aVal = 1; + else + { + Print(EError, "Bad argument to -fpu\n"); + return KErrArgument; + } + + return KErrNone; + } + +int getCompressionMethod(int &aVal, int argc, char *argv[], int i) +{ + if( i >= argc || argv[i] == NULL) + { + Print(EError, "Missing argument to -compressionmethod\n"); + return KErrArgument; + } + else if (strnicmp(argv[i], "none", 2) == 0) + { + aVal = ENoCompression; + } + else if (strnicmp(argv[i], "deflate", 7) == 0) + { + aVal = EDeflate; + } + else if (strnicmp(argv[i], "bytepair", 8) == 0) + { + aVal = EBytePair; + } + else + { + Print(EError, "Bad argument '%s' to -compressionmethod\n", argv[i]); + return KErrArgument; + } + + return KErrNone; + +} + + +int processCL(int argc, char *argv[]) + { + + int r=KErrNone; + int i=1; + while (i=argc) + return KErrArgument; + char* s=argv[i]; + while(char c = *(s++)) + { + if(c<'a') + c += 'a'-'A'; + switch(c) + { + case 'h': gVerbose |= E32ImageFile::EDumpHeader; break; + case 's': gVerbose |= E32ImageFile::EDumpSecurityInfo; break; + case 'c': gVerbose |= E32ImageFile::EDumpCode; break; + case 'd': gVerbose |= E32ImageFile::EDumpData; break; + case 'e': gVerbose |= E32ImageFile::EDumpExports; break; + case 'i': gVerbose |= E32ImageFile::EDumpImports; break; + default: return KErrArgument; + } + } + } + else if (stricmp("-stack", argv[i])==0) + { + i++; + gSetStack=TRUE; + r=getUIntArg(gStack, argc, argv, i); + } + else if (stricmp("-uid1", argv[i])==0) + { + i++; + gSetUid1=TRUE; + unsigned int id; + r=getUIntArg(id, argc, argv, i); + gUid1=TUid::Uid(id); + } + else if (stricmp("-uid2", argv[i])==0) + { + i++; + gSetUid2=TRUE; + unsigned int id; + r=getUIntArg(id, argc, argv, i); + gUid2=TUid::Uid(id); + } + else if (stricmp("-uid3", argv[i])==0) + { + i++; + gSetUid3=TRUE; + unsigned int id; + r=getUIntArg(id, argc, argv, i); + gUid3=TUid::Uid(id); + } + else if (stricmp("-version", argv[i])==0) + { + i++; + r=getVersionArg(gVersionWord, argv[i]); + gSetVersion=TRUE; + } + else if (stricmp("-sid", argv[i])==0) + { + i++; + r=getUIntArg(gSecureId, argc, argv, i); + gSetSecureId=TRUE; + } + else if (stricmp("-vid", argv[i])==0) + { + i++; + r=getUIntArg(gVendorId, argc, argv, i); + gSetVendorId=TRUE; + } + else if (strnicmp("-nocall", argv[i], 7)==0) + { + gSetCallEntryPoints=TRUE; + gCallEntryPoints=FALSE; + } + else if (strnicmp("-call", argv[i], 5)==0) + { + gSetCallEntryPoints=TRUE; + gCallEntryPoints=TRUE; + } + else if (strnicmp("-fixed", argv[i], 3)==0) + { + gSetFixedAddress=TRUE; + gFixedAddress=TRUE; + } + else if (strnicmp("-moving", argv[i], 3)==0) + { + gSetFixedAddress=TRUE; + gFixedAddress=FALSE; + } + else if (strnicmp("-priority", argv[i], 4)==0) + { + i++; + gSetPriority=TRUE; + r=getPriorityArg(gPriority,argc,argv,i); + } + else if (strnicmp("-capability", argv[i], 10)==0) + { + i++; + gSetCapability=TRUE; + r=getCapabilitiesArg(gCapability, argc, argv, i); + } + else if (strnicmp("-heap", argv[i], 4)==0) + { + i++; + gSetHeap=TRUE; + r=getUIntArg(gHeapMin, argc, argv, i); + if (r==KErrNone) + r=getUIntArg(gHeapMax, argc, argv, ++i); + } + else if (strnicmp("-allow", argv[i], 6)==0) // Note, toolchain passes 'allow' for 'allowdlldata' + { + gAllowDllData=TRUE; + } + else if( strnicmp("-compressionmethod", argv[i], 18) == 0) + { + if(!gSuppressComprMethod) + { + gCompress = TRUE; + gSetCompress = TRUE; + r = getCompressionMethod(gCompressionMethod, argc, argv, ++i); + } + else + { + ++i; // Skip the compression method because compessionmethod suppressed. + } + } + else if (strnicmp("-compress", argv[i], 9)==0) + { + gCompress=TRUE; + gSetCompress=TRUE; + gSuppressComprMethod=FALSE; + } + else if (strnicmp("-nocompress", argv[i], 11)==0) + { + gCompress=FALSE; + gSetCompress=TRUE; + gSuppressComprMethod = TRUE; + gCompressionMethod = ENoCompression; + } + else if (strnicmp("-datalinkaddress", argv[i], 16)==0) + { + i++; + r=getUIntArg(gDataBase, argc, argv, i); + } + else if (strnicmp("-align-const-section", argv[i], 20)==0) + { + gAlignConstSection=TRUE; + } + else if (strnicmp("-const-section-address-mask", argv[i], 27)==0) + { + i++; + r=getUIntArg(gConstSectionAddressMask, argc, argv, i); + } + else if (strnicmp("-fpu", argv[i], 4)==0) + { + i++; + r=getFPUArg(gFPU, argc, argv, i); + gSetFPU=TRUE; + } + else if (strnicmp("-paged", argv[i], 6) == 0) + { + gCodePaged=TRUE; + gSetCodePaged=TRUE; + } + else if (strnicmp("-unpaged", argv[i], 8) == 0) + { + gCodeUnpaged=TRUE; + gSetCodePaged=TRUE; + } + else if (strnicmp("-defaultpaged", argv[i], 13) == 0) + { + gCodeDefaultPaged=TRUE; + gSetCodePaged=TRUE; + } + else if (strnicmp("-codepaging", argv[i], 11)==0) + { + i++; + + if (i>=argc) + { + r = KErrArgument; + } + else if ( strnicmp(argv[i], "paged", 5) == 0 ) + { + gCodePaged=TRUE; + } + else if ( strnicmp(argv[i], "unpaged", 7) == 0 ) + { + gCodeUnpaged=TRUE; + } + else if ( strnicmp(argv[i], "default", 7) == 0 ) + { + gCodeDefaultPaged=TRUE; + } + else + { + Print(EError, "Bad argument to -codepaging\n"); + r = KErrArgument; + } + + gSetCodePaged=TRUE; + } + else if (strnicmp("-datapaging", argv[i], 11)==0) + { + i++; + + if (i>=argc) + { + r = KErrArgument; + } + else if ( strnicmp(argv[i], "paged", 5) == 0 ) + { + gDataPaged=TRUE; + } + else if ( strnicmp(argv[i], "unpaged", 7) == 0 ) + { + gDataUnpaged=TRUE; + } + else if ( strnicmp(argv[i], "default", 7) == 0 ) + { + gDataDefaultPaged=TRUE; + } + else + { + Print(EError, "Bad argument to -datapaging\n"); + r = KErrArgument; + } + + gSetDataPaged=TRUE; + } + else if (strnicmp("-sym_name_lkup", argv[i], 14) == 0) + { + gSetSymLkup=TRUE; + } + else if (strnicmp("-debuggable", argv[i], 11) == 0) + { + gDebuggable=TRUE; + gSetDebuggable=TRUE; + } + else if (strnicmp("-smpsafe", argv[i], 8) == 0) + { + gSmpSafe=TRUE; + gSetSmpSafe=TRUE; + } +#ifdef __SUPPORT_PE_FILES__ + else if (strnicmp("-x86imp=", argv[i], 8)==0) + { + const char* x86impfile=argv[i]+8; + FILE* f=fopen(x86impfile,"rb"); + if (!f) + r=KErrArgument; + else + { + fseek(f,0,SEEK_END); + long size=ftell(f); + fseek(f,0,SEEK_SET); + if (size>4) + { + gX86imp=new char[size]; + fread(gX86imp,1,size,f); + } + fclose(f); + r=KErrNone; + if (gX86imp) + { + gX86imp_size=ALIGN4(size); + int i; + int* p=(int*)gX86imp; + gX86num_imp_dlls=*p++; + for (i=0; i