diff options
author | Kyungwoo Lee <kyulee@microsoft.com> | 2015-12-01 10:16:08 -0800 |
---|---|---|
committer | Kyungwoo Lee <kyulee@microsoft.com> | 2015-12-07 06:54:12 -0800 |
commit | 823b4b7d602c2298e32f2b7961bbc739cdf5b4cd (patch) | |
tree | 4aff7653d7caf70d7e23a8ec07e9245db8d7bc9c /src/ildasm | |
parent | b313fde80475f234f4746ea2e17d269bbfe00aba (diff) | |
download | coreclr-823b4b7d602c2298e32f2b7961bbc739cdf5b4cd.tar.gz coreclr-823b4b7d602c2298e32f2b7961bbc739cdf5b4cd.tar.bz2 coreclr-823b4b7d602c2298e32f2b7961bbc739cdf5b4cd.zip |
Enable ildasm for *nix
This enables ildasm for cross-platforms.
Unlike Window (where initialization is done when DLL attach), CoreCLR is explciltly hosted/initialized to get the Metadata related APIs.
This also eliminates the need of setting dynamic library path.
Currently, ildasm binary is assumed to be located same as CoreCLR binary.
I added a simple CoreCLRLoader (not meant to run an assembly file) for just direct uses of APIs. Since I expect this library to be used for ilasm work.
Resource string is also handled using a static string table based on my prior check-in.
Other changes are mostly mechanic with regard to wide constant string.
Diffstat (limited to 'src/ildasm')
-rw-r--r-- | src/ildasm/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/ildasm/dasm.cpp | 110 | ||||
-rw-r--r-- | src/ildasm/dasm_formattype.cpp | 6 | ||||
-rw-r--r-- | src/ildasm/dis.cpp | 4 | ||||
-rw-r--r-- | src/ildasm/dis.h | 27 | ||||
-rw-r--r-- | src/ildasm/dman.cpp | 19 | ||||
-rw-r--r-- | src/ildasm/dres.cpp | 3 | ||||
-rw-r--r-- | src/ildasm/dynamicarray.h (renamed from src/ildasm/DynamicArray.h) | 0 | ||||
-rw-r--r-- | src/ildasm/exe/CMakeLists.txt | 31 | ||||
-rw-r--r-- | src/ildasm/unixcoreclrloader/CMakeLists.txt | 11 | ||||
-rw-r--r-- | src/ildasm/unixcoreclrloader/coreclrloader.cpp | 73 | ||||
-rw-r--r-- | src/ildasm/unixcoreclrloader/coreclrloader.h | 32 | ||||
-rw-r--r-- | src/ildasm/windasm.cpp | 22 |
13 files changed, 287 insertions, 55 deletions
diff --git a/src/ildasm/CMakeLists.txt b/src/ildasm/CMakeLists.txt index 91ab76e066..7c1019e1ca 100644 --- a/src/ildasm/CMakeLists.txt +++ b/src/ildasm/CMakeLists.txt @@ -1,4 +1,4 @@ +add_subdirectory(exe) if (WIN32) - add_subdirectory(exe) - add_subdirectory(rcdll) + add_subdirectory(rcdll) endif() diff --git a/src/ildasm/dasm.cpp b/src/ildasm/dasm.cpp index fc8f27e085..add414d48e 100644 --- a/src/ildasm/dasm.cpp +++ b/src/ildasm/dasm.cpp @@ -43,6 +43,13 @@ #include "clrinternal.h" #endif +#ifdef FEATURE_PAL +#include "coreclrloader.h" +#include "resourcestring.h" +#define NATIVE_STRING_RESOURCE_NAME dasm_rc +DECLARE_NATIVE_STRING_RESOURCE_TABLE(NATIVE_STRING_RESOURCE_NAME); +#endif + struct MIDescriptor { mdToken tkClass; // defining class token @@ -129,6 +136,8 @@ BOOL g_fCustomInstructionEncodingSystem = FALSE; COR_FIELD_OFFSET *g_rFieldOffset = NULL; ULONG g_cFieldsMax, g_cFieldOffsets; + +char* g_pszExeFile; char g_szInputFile[MAX_FILENAME_LENGTH]; // in UTF-8 WCHAR g_wszFullInputFile[MAX_PATH + 1]; // in UTF-16 char g_szOutputFile[MAX_FILENAME_LENGTH]; // in UTF-8 @@ -230,7 +239,7 @@ WCHAR* RstrW(unsigned id) case IDS_E_CANTACCESSW32RES: case IDS_E_CANTOPENW32RES: case IDS_ERRORREOPENINGFILE: - wcscpy_s(buffer,COUNTOF(buffer),L"// "); + wcscpy_s(buffer,COUNTOF(buffer),W("// ")); buff +=3; cchBuff -= 3; break; @@ -241,22 +250,26 @@ WCHAR* RstrW(unsigned id) case IDS_E_CODESIZE: case IDS_W_CREATEDMRES: case IDS_E_READINGMRES: - wcscpy_s(buffer,COUNTOF(buffer),L"%s// "); + wcscpy_s(buffer,COUNTOF(buffer),W("%s// ")); buff +=5; cchBuff -= 5; break; case IDS_E_NORVA: - wcscpy_s(buffer,COUNTOF(buffer),L"/* "); + wcscpy_s(buffer,COUNTOF(buffer),W("/* ")); buff += 3; cchBuff -= 3; break; default: break; } +#ifdef FEATURE_PAL + LoadNativeStringResource(NATIVE_STRING_RESOURCE_TABLE(NATIVE_STRING_RESOURCE_NAME),id, buff, cchBuff, NULL); +#else _ASSERTE(g_hResources != NULL); WszLoadString(g_hResources,id,buff,cchBuff); +#endif if(id == IDS_E_NORVA) - wcscat_s(buff,cchBuff,L" */"); + wcscat_s(buff,cchBuff,W(" */")); return buffer; } @@ -312,9 +325,32 @@ extern CQuickBytes * g_szBuf_ProperName; ICLRRuntimeHostInternal *g_pCLRRuntimeHostInternal = NULL; #endif +#ifdef FEATURE_CORECLR +#ifdef FEATURE_PAL +CoreCLRLoader *g_loader; +#endif +MetaDataGetDispenserFunc metaDataGetDispenser; +GetMetaDataInternalInterfaceFunc getMetaDataInternalInterface; +GetMetaDataInternalInterfaceFromPublicFunc getMetaDataInternalInterfaceFromPublic; +GetMetaDataPublicInterfaceFromInternalFunc getMetaDataPublicInterfaceFromInternal; +#endif + BOOL Init() { -#ifndef FEATURE_CORECLR +#ifdef FEATURE_CORECLR +#ifdef FEATURE_PAL + g_loader = CoreCLRLoader::Create(g_pszExeFile); + metaDataGetDispenser = (MetaDataGetDispenserFunc)g_loader->LoadFunction("MetaDataGetDispenser"); + getMetaDataInternalInterface = (GetMetaDataInternalInterfaceFunc)g_loader->LoadFunction("GetMetaDataInternalInterface"); + getMetaDataInternalInterfaceFromPublic = (GetMetaDataInternalInterfaceFromPublicFunc)g_loader->LoadFunction("GetMetaDataInternalInterfaceFromPublic"); + getMetaDataPublicInterfaceFromInternal = (GetMetaDataPublicInterfaceFromInternalFunc)g_loader->LoadFunction("GetMetaDataPublicInterfaceFromInternal"); +#else // FEATURE_PAL + metaDataGetDispenser = (MetaDataGetDispenserFunc)MetaDataGetDispenser; + getMetaDataInternalInterface = (GetMetaDataInternalInterfaceFunc)GetMetaDataInternalInterface; + getMetaDataInternalInterfaceFromPublic = (GetMetaDataInternalInterfaceFromPublicFunc)GetMetaDataInternalInterfaceFromPublic; + getMetaDataPublicInterfaceFromInternal = (GetMetaDataPublicInterfaceFromInternalFunc)GetMetaDataPublicInterfaceFromInternal; +#endif // FEATURE_PAL +#else // FEATURE_CORECLR if (FAILED(CoInitialize(NULL))) { return FALSE; @@ -343,7 +379,7 @@ BOOL Init() { return FALSE; } -#endif +#endif // FEATURE_CORECLR g_szBuf_KEYWORD = new CQuickBytes(); g_szBuf_COMMENT = new CQuickBytes(); @@ -502,7 +538,14 @@ void Uninit() SDELETE(g_szBuf_ProperName); } -#ifndef FEATURE_CORECLR +#ifdef FEATURE_CORECLR +#ifdef FEATURE_PAL + if (g_loader != NULL) + { + g_loader->Finish(); + } +#endif +#else if (g_pCLRRuntimeHostInternal != NULL) { g_pCLRRuntimeHostInternal->Release(); @@ -981,7 +1024,7 @@ void DumpMscorlib(void* GUICookie) &md, // [OUT] Assembly MetaData. &dwFlags))) // [OUT] Flags. { - if(wcscmp(wzName,L"mscorlib") == 0) + if(wcscmp(wzName,W("mscorlib")) == 0) { printLine(GUICookie,""); sprintf_s(szString,SZSTRING_SIZE,"%s%s ",g_szAsmCodeIndent,KEYWORD(".mscorlib")); @@ -1416,7 +1459,7 @@ mdToken ResolveTypeDefReflectionNotation(IMDInternalImport *pIMDI, } mdToken ResolveTypeRefReflectionNotation(IMDInternalImport *pIMDI, - __in __nullterminated char* szNamespace, + __in __nullterminated const char* szNamespace, __inout __nullterminated char* szName, mdToken tkResScope) { @@ -1443,9 +1486,11 @@ mdToken ResolveReflectionNotation(BYTE* dataPtr, mdToken ret = 0; if(str) { - char* szNamespace = ""; + char szNamespaceDefault[] = ""; + char* szNamespace = szNamespaceDefault; char* szName = str; char* szAssembly = NULL; + char szAssemblyMscorlib[] = "mscorlib"; char* pch; memcpy(str,dataPtr,Lstr); str[Lstr] = 0; @@ -1473,7 +1518,7 @@ mdToken ResolveReflectionNotation(BYTE* dataPtr, ret = tk; else // TypeDef not found, try TypeRef from mscorlib - szAssembly = "mscorlib"; + szAssembly = szAssemblyMscorlib; } if(szAssembly != NULL) { @@ -1648,7 +1693,7 @@ mdToken TypeRefToTypeDef(mdToken tk, IMDInternalImport *pIMDI, IMDInternalImport if(FAILED(pIAMDI[0]->QueryInterface(IID_IUnknown, (void**)&pUnk))) goto AssignAndReturn; #ifdef FEATURE_CORECLR - if (FAILED(GetMetaDataInternalInterfaceFromPublic( + if (FAILED(getMetaDataInternalInterfaceFromPublic( pUnk, IID_IMDInternalImport, (LPVOID *)ppIMDInew))) @@ -2220,7 +2265,7 @@ BOOL PrettyPrintCustomAttributeNVPairs(unsigned nPairs, BYTE* dataPtr, BYTE* dat } // type of the field/property PCCOR_SIGNATURE dataTypePtr = (PCCOR_SIGNATURE)dataPtr; - char* szAppend = ""; + const char* szAppend = ""; if(*dataPtr == ELEMENT_TYPE_SZARRAY) // Only SZARRAY modifier can occur in ser.type { szAppend = "[]"; @@ -2487,7 +2532,6 @@ void DumpCustomAttributeProps(mdToken tkCA, mdToken tkType, mdToken tkOwner, BYT const char* pszMemberName; ULONG cComSig; - pszMemberName; if (FAILED(g_pImport->GetNameAndSigOfMemberRef( tkOwner, &typePtr, @@ -3284,7 +3328,8 @@ void PrettyPrintOverrideDecl(ULONG i, __inout __nullterminated char* szString, v const char * pszMemberName; mdToken tkDecl,tkDeclParent=0; char szBadToken[256]; - char* pszTailSig = ""; + char pszTailSigDefault[] = ""; + char* pszTailSig = pszTailSigDefault; CQuickBytes qbInstSig; char* szptr = &szString[0]; szptr+=sprintf_s(szptr,SZSTRING_SIZE,"%s%s ",g_szAsmCodeIndent,KEYWORD(".override")); @@ -3699,7 +3744,7 @@ lDone: ; printError(GUICookie,ERRORMSG(szString)); return FALSE; } - char* szt = "SIG:"; + const char* szt = "SIG:"; for(ULONG i=0; i<cComSig;) { szptr = &szString[0]; @@ -4303,7 +4348,8 @@ BOOL DumpProp(mdToken FuncToken, const char *pszClassName, DWORD dwClassAttrs, v if(IsPrRTSpecialName(dwAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr),KEYWORD("rtspecialname ")); { - char *pch = ""; + char pchDefault[] = ""; + char *pch = pchDefault; if(DumpBody) { pch = szptr+1; @@ -5795,7 +5841,7 @@ void WritePerfData(const char *KeyDesc, const char *KeyName, const char *UnitDes if (!g_PerfDataFilePtr) { - if((g_PerfDataFilePtr = WszCreateFile(L"c:\\temp\\perfdata.dat", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL) ) == INVALID_HANDLE_VALUE) + if((g_PerfDataFilePtr = WszCreateFile(W("c:\\temp\\perfdata.dat"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL) ) == INVALID_HANDLE_VALUE) { printLine(NULL,"PefTimer::LogStoppedTime(): Unable to open the FullPath file. No performance data will be generated"); g_fDumpToPerfWriter = FALSE; @@ -6767,7 +6813,7 @@ void DumpVtable(void* GUICookie) szptr = &szString[0]; szptr += sprintf_s(szString,SZSTRING_SIZE,"%s%s 0x%04x", g_szAsmCodeIndent,KEYWORD(".subsystem"),j); { - char* psz[15] = {"// UNKNOWN", + const char* psz[15] = {"// UNKNOWN", "// NATIVE", "// WINDOWS_GUI", "// WINDOWS_CUI", @@ -6944,13 +6990,13 @@ HRESULT VEHandlerReporter( // Return status. if(szMsg) { size_t L = wcslen(szMsg)+256; - if(wzMsg = new (nothrow) WCHAR[L]) + if((wzMsg = new (nothrow) WCHAR[L]) != NULL) { wcscpy_s(wzMsg,L,szMsg); // include token and offset from Context - if(Context.Token) swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), L" [token:0x%08X]",Context.Token); - if(Context.uOffset) swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), L" [at:0x%X]",Context.uOffset); - swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), L" [hr:0x%08X]\n",hrRpt); + if(Context.Token) swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), W(" [token:0x%08X]"),Context.Token); + if(Context.uOffset) swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), W(" [at:0x%X]"),Context.uOffset); + swprintf_s(&wzMsg[wcslen(wzMsg)], L-wcslen(wzMsg), W(" [hr:0x%08X]\n"),hrRpt); DumpMI(UnicodeToUtf(wzMsg)); delete[] wzMsg; } @@ -6964,11 +7010,11 @@ void DumpMetaInfo(__in __nullterminated const WCHAR* pwzFileName, __in_opt __nul DumpMI((char*)GUICookie); // initialize the print function for DumpMetaInfo - if(pch && (!_wcsicmp(pch+1,L"lib") || !_wcsicmp(pch+1,L"obj"))) + if(pch && (!_wcsicmp(pch+1,W("lib")) || !_wcsicmp(pch+1,W("obj")))) { // This works only when all the rest does not // Init and run. #ifdef FEATURE_CORECLR - if (MetaDataGetDispenser(CLSID_CorMetaDataDispenser, + if (metaDataGetDispenser(CLSID_CorMetaDataDispenser, IID_IMetaDataDispenserEx, (void **)&g_pDisp)) #else if(SUCCEEDED(CoInitialize(0))) @@ -7006,7 +7052,7 @@ void DumpMetaInfo(__in __nullterminated const WCHAR* pwzFileName, __in_opt __nul if(g_pDisp == NULL) { #ifdef FEATURE_CORECLR - hr = MetaDataGetDispenser(CLSID_CorMetaDataDispenser, + hr = metaDataGetDispenser(CLSID_CorMetaDataDispenser, IID_IMetaDataDispenserEx, (void **)&g_pDisp); #else hr = LegacyActivationShim::ClrCoCreateInstance( @@ -7366,8 +7412,8 @@ void CloseNamespace(__inout __nullterminated char* szString) FILE* OpenOutput(__in __nullterminated const WCHAR* wzFileName) { FILE* pfile = NULL; - if(g_uCodePage == 0xFFFFFFFF) _wfopen_s(&pfile,wzFileName,L"wb"); - else _wfopen_s(&pfile,wzFileName,L"wt"); + if(g_uCodePage == 0xFFFFFFFF) _wfopen_s(&pfile,wzFileName,W("wb")); + else _wfopen_s(&pfile,wzFileName,W("wt")); if(pfile) { @@ -7396,6 +7442,7 @@ BOOL DumpFile() static char szFilenameANSI[MAX_FILENAME_LENGTH*3]; IMetaDataDispenser *pMetaDataDispenser = NULL; const char *pszFilename = g_szInputFile; + const DWORD openFlags = ofRead | (g_fProject ? 0 : ofNoTransform); if(!(g_Mode & MODE_GUI)) { @@ -7497,9 +7544,8 @@ BOOL DumpFile() g_cbMetaData = VAL32(g_CORHeader->MetaData.Size); } - const DWORD openFlags = ofRead | (g_fProject ? 0 : ofNoTransform); #ifdef FEATURE_CORECLR - if (FAILED(GetMetaDataInternalInterface( + if (FAILED(getMetaDataInternalInterface( (BYTE *)g_pMetaData, g_cbMetaData, openFlags, @@ -7522,7 +7568,7 @@ BOOL DumpFile() TokenSigInit(g_pImport); #ifdef FEATURE_CORECLR - if (FAILED(MetaDataGetDispenser(CLSID_CorMetaDataDispenser, IID_IMetaDataDispenser, (LPVOID*)&pMetaDataDispenser))) + if (FAILED(metaDataGetDispenser(CLSID_CorMetaDataDispenser, IID_IMetaDataDispenser, (LPVOID*)&pMetaDataDispenser))) #else if (FAILED(CoCreateInstance(CLSID_CorMetaDataDispenser, 0, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenser, (LPVOID*)&pMetaDataDispenser))) #endif @@ -7863,6 +7909,7 @@ ReportAndExit: fSuccess = TRUE; } fSuccess = TRUE; +#ifndef FEATURE_PAL if(g_pFile) // dump .RES file (if any), if not to console { WCHAR wzResFileName[2048], *pwc; @@ -7888,6 +7935,7 @@ ReportAndExit: else printError(g_pFile,szString); } } +#endif if(g_fShowRefs) DumpRefs(TRUE); if(g_fDumpHTML) { diff --git a/src/ildasm/dasm_formattype.cpp b/src/ildasm/dasm_formattype.cpp index b196483fb8..263ae3976b 100644 --- a/src/ildasm/dasm_formattype.cpp +++ b/src/ildasm/dasm_formattype.cpp @@ -132,8 +132,8 @@ const char* ERRORMSG(__in_opt __nullterminated const char* szOrig) } CONTRACTL_END; - char* szPrefix = ""; - char* szPostfix = ""; + const char* szPrefix = ""; + const char* szPostfix = ""; if(g_fDumpHTML) { szPrefix = "<I><B><FONT COLOR=RED>"; @@ -283,7 +283,7 @@ const char* ProperName(__in __nullterminated const char* name, bool isLocalName) _ASSERTE (buff); if(g_fUseProperName) { - char *ret; + const char *ret; BOOL fQuoted; if(name) { diff --git a/src/ildasm/dis.cpp b/src/ildasm/dis.cpp index a5487360d2..32e4b6fc1c 100644 --- a/src/ildasm/dis.cpp +++ b/src/ildasm/dis.cpp @@ -1760,7 +1760,7 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md // Backwards compatible ldstr instruction. if (instr == CEE_LDSTR && TypeFromToken(tk) != mdtString) { - WCHAR *v1 = L""; + const WCHAR *v1 = W(""); if(g_fShowBytes) { @@ -2600,7 +2600,7 @@ static const char* keyword[] = { #undef KYWD }; static bool KywdNotSorted = TRUE; -static char* szAllowedSymbols = "#_@$."; +static const char* szAllowedSymbols = "#_@$."; static char DisallowedStarting[256]; static char DisallowedCont[256]; diff --git a/src/ildasm/dis.h b/src/ildasm/dis.h index 1f807af0af..00a689eb05 100644 --- a/src/ildasm/dis.h +++ b/src/ildasm/dis.h @@ -152,3 +152,30 @@ char *DumpGenericPars(__inout_ecount(SZSTRING_SIZE) char* szString, #define CHECK_REMAINING_SIZE if(ovadd_le((size_t)szString, SZSTRING_SIZE_M4, (size_t)szptr)) break; #define SZSTRING_REMAINING_SIZE(x) (ovadd_le((size_t)szString,SZSTRING_SIZE,(size_t)(x))?0:(SZSTRING_SIZE-((size_t)(x)-(size_t)szString))) +typedef int (*MetaDataGetDispenserFunc) ( + REFCLSID rclsid, // The class to desired. + REFIID riid, // Interface wanted on class factory. + LPVOID FAR *ppv); // Return interface pointer here. + +typedef int (*GetMetaDataInternalInterfaceFunc) ( + LPVOID pData, // [IN] in memory metadata section + ULONG cbData, // [IN] size of the metadata section + DWORD flags, // [IN] CorOpenFlags + REFIID riid, // [IN] desired interface + void **ppv); // [OUT] returned interface + +typedef int (*GetMetaDataInternalInterfaceFromPublicFunc) ( + IUnknown *pv, // [IN] Given interface + REFIID riid, // [IN] desired interface + void **ppv); // [OUT] returned interface + +typedef int (*GetMetaDataPublicInterfaceFromInternalFunc) ( + void *pv, // [IN] Given interface + REFIID riid, // [IN] desired interface + void **ppv); // [OUT] returned interface + +extern MetaDataGetDispenserFunc metaDataGetDispenser; +extern GetMetaDataInternalInterfaceFunc getMetaDataInternalInterface; +extern GetMetaDataInternalInterfaceFromPublicFunc getMetaDataInternalInterfaceFromPublic; +extern GetMetaDataPublicInterfaceFromInternalFunc getMetaDataPublicInterfaceFromInternal; + diff --git a/src/ildasm/dman.cpp b/src/ildasm/dman.cpp index 962a3a740b..10fd39a678 100644 --- a/src/ildasm/dman.cpp +++ b/src/ildasm/dman.cpp @@ -14,7 +14,6 @@ #include "dasmgui.h" #include "formattype.h" #include "dis.h" -#include "mlang.h" #include "ceeload.h" #include "dynamicarray.h" @@ -22,6 +21,10 @@ #include "clrinternal.h" +#ifndef MAX_LOCALE_NAME +#define MAX_LOCALE_NAME (32) +#endif + extern IMAGE_COR20_HEADER * g_CORHeader; extern IMDInternalImport* g_pImport; extern PELoader * g_pPELoader; @@ -632,8 +635,8 @@ static BOOL ConvertToLegalFileNameInPlace(__inout LPWSTR wzName) // neutralize reserved names static const WCHAR * const rwzReserved[] = { - L"COM", L"LPT", // '1' - '9' must follow after these - L"CON", L"PRN", L"AUX", L"NUL" + W("COM"), W("LPT"), // '1' - '9' must follow after these + W("CON"), W("PRN"), W("AUX"), W("NUL") }; for (size_t i = 0; i < (sizeof(rwzReserved) / sizeof(WCHAR *)); i++) @@ -728,7 +731,7 @@ static void DumpResourceFile(void *GUICookie, BYTE *pRes, DWORD dwOffset, LPCWST if ((!(g_Mode & MODE_GUI)) && (g_pFile != NULL)) // embedded resource -- dump as .resources file { FILE *pF = NULL; - _wfopen_s(&pF, pParam->wzFileName, L"wb"); + _wfopen_s(&pF, pParam->wzFileName, W("wb")); if (pF) { struct Param @@ -822,7 +825,7 @@ void DumpManifestResources(void* GUICookie) // add the Win32 resource file name to avoid conflict between the native and a managed resource file WCHAR *pwc = wcsrchr(wzName, L'.'); if (pwc == NULL) pwc = &wzName[wcslen(wzName)]; - wcscpy_s(pwc, 2048 - (pwc - wzFileName), L".res"); + wcscpy_s(pwc, 2048 - (pwc - wzFileName), W(".res")); NAME_ARRAY_ADD(1, wzName); @@ -879,7 +882,7 @@ void DumpManifestResources(void* GUICookie) // if we have a conflict, add a number suffix to the file name if (!fConflict || - swprintf_s(wpc, 2048 - (wpc - wzFileName), L"%d", iIndex) <= 0) + swprintf_s(wpc, 2048 - (wpc - wzFileName), W("%d"), iIndex) <= 0) { // no conflict or unable to add index break; @@ -995,14 +998,14 @@ IMetaDataAssemblyImport* GetAssemblyImport(void* GUICookie) { pbManifest += sizeof(DWORD); #ifdef FEATURE_CORECLR - if (SUCCEEDED(hr = GetMetaDataInternalInterface( + if (SUCCEEDED(hr = getMetaDataInternalInterface( pbManifest, VAL32(*pdwSize), ofRead, IID_IMDInternalImport, (LPVOID *)&pParam->pImport))) { - if (FAILED(hr = GetMetaDataPublicInterfaceFromInternal( + if (FAILED(hr = getMetaDataPublicInterfaceFromInternal( pParam->pImport, IID_IMetaDataAssemblyImport, (LPVOID *)&pParam->pAssemblyImport))) diff --git a/src/ildasm/dres.cpp b/src/ildasm/dres.cpp index d2c4191bf2..a3d1fb6a64 100644 --- a/src/ildasm/dres.cpp +++ b/src/ildasm/dres.cpp @@ -8,6 +8,7 @@ // #include "ildasmpch.h" +#ifndef FEATURE_PAL #include "debugmacros.h" #include "corpriv.h" #include "dasmenum.hpp" @@ -313,3 +314,5 @@ DWORD DumpResourceToFile(__in __nullterminated WCHAR* wzFileName) return ret; } +#endif // FEATURE_PAL + diff --git a/src/ildasm/DynamicArray.h b/src/ildasm/dynamicarray.h index eb2aab269f..eb2aab269f 100644 --- a/src/ildasm/DynamicArray.h +++ b/src/ildasm/dynamicarray.h diff --git a/src/ildasm/exe/CMakeLists.txt b/src/ildasm/exe/CMakeLists.txt index 0e912c200f..84c9d2a242 100644 --- a/src/ildasm/exe/CMakeLists.txt +++ b/src/ildasm/exe/CMakeLists.txt @@ -7,6 +7,17 @@ add_definitions(-D__ILDASM__) add_definitions(-DFEATURE_CORECLR) +include_directories(..) + +if(CLR_CMAKE_PLATFORM_UNIX) + include_directories(../unixcoreclrloader) + build_resources(${CMAKE_CURRENT_SOURCE_DIR}/../dasm.rc dasm_rc TARGET_CPP_FILE) + + set(ILDASM_RESOURCES + ${TARGET_CPP_FILE} + ) +endif(CLR_CMAKE_PLATFORM_UNIX) + set(ILDASM_SOURCES ../ceeload.cpp ../dasm.cpp @@ -31,23 +42,31 @@ set(ILDASM_LINK_LIBRARIES utilcodestaticnohost mdhotdata_full corguids - coreclr ) if(CLR_CMAKE_PLATFORM_UNIX) - # TODO target_link_libraries(ildasm + ${ILDASM_LINK_LIBRARIES} + unixcoreclrloader mscorrc_debug coreclrpal palrt ) + + # FreeBSD implements dlopen in libc + if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD) + target_link_libraries(ildasm + dl + ) + endif(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD) else() target_link_libraries(ildasm ${ILDASM_LINK_LIBRARIES} - msvcrt - ole32 - oleaut32 - shell32 + coreclr + msvcrt + ole32 + oleaut32 + shell32 ) # We will generate PDB only for the debug configuration diff --git a/src/ildasm/unixcoreclrloader/CMakeLists.txt b/src/ildasm/unixcoreclrloader/CMakeLists.txt new file mode 100644 index 0000000000..6a3916b961 --- /dev/null +++ b/src/ildasm/unixcoreclrloader/CMakeLists.txt @@ -0,0 +1,11 @@ +project(unixcoreclrloader) + +include_directories(${CMAKE_SOURCE_DIR}/src/coreclr/hosts/unixcoreruncommon) +add_library(unixcoreclrloader + STATIC + coreclrloader.cpp +) + +target_link_libraries(unixcoreclrloader + unixcoreruncommon +) diff --git a/src/ildasm/unixcoreclrloader/coreclrloader.cpp b/src/ildasm/unixcoreclrloader/coreclrloader.cpp new file mode 100644 index 0000000000..affa171bac --- /dev/null +++ b/src/ildasm/unixcoreclrloader/coreclrloader.cpp @@ -0,0 +1,73 @@ + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + + +#include <stdio.h> +#include "dlfcn.h" +#include "coreclrloader.h" +#include "coreruncommon.h" + +using namespace std; +void *CoreCLRLoader::LoadFunction(const char *funcName) +{ + void *func = nullptr; + if (coreclrLib == nullptr) { + fprintf(stderr, "Error: coreclr should be loaded before loading a function: %s\n", funcName); + } + else { + func = dlsym(coreclrLib, funcName); + if (func == nullptr) { + fprintf(stderr, "Error: cannot find %s in coreclr\n", funcName); + } + } + return func; +} + +CoreCLRLoader* CoreCLRLoader::Create(const char *exePath) +{ + string absolutePath, coreClrPath; + GetAbsolutePath(exePath, absolutePath); + GetDirectory(absolutePath.c_str(), coreClrPath); + coreClrPath.append("/"); + coreClrPath.append(coreClrDll); + + CoreCLRLoader *loader = new CoreCLRLoader(); + loader->coreclrLib = dlopen(coreClrPath.c_str(), RTLD_NOW | RTLD_LOCAL); + if (loader->coreclrLib == nullptr) + { + fprintf(stderr, "Error: Fail to load %s\n", coreClrPath.c_str()); + delete loader; + return nullptr; + } + else + { + loader->initializeCoreCLR = (InitializeCoreCLRFunction)loader->LoadFunction("coreclr_initialize"); + loader->shutdownCoreCLR = (ShutdownCoreCLRFunction)loader->LoadFunction("coreclr_shutdown"); + int ret = loader->initializeCoreCLR( + exePath, + "coreclrloader", + 0, + 0, + 0, + &loader->hostHandle, + &loader->domainId); + if (ret != 0) + { + fprintf(stderr, "Error: Fail to initialize CoreCLR\n"); + delete loader; + return nullptr; + } + } + return loader; +} + +int CoreCLRLoader::Finish() +{ + if (hostHandle != 0) { + shutdownCoreCLR(hostHandle, domainId); + delete this; + } + return 0; +} diff --git a/src/ildasm/unixcoreclrloader/coreclrloader.h b/src/ildasm/unixcoreclrloader/coreclrloader.h new file mode 100644 index 0000000000..0b1aa481f8 --- /dev/null +++ b/src/ildasm/unixcoreclrloader/coreclrloader.h @@ -0,0 +1,32 @@ + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +typedef int (*InitializeCoreCLRFunction)( + const char* exePath, + const char* appDomainFriendlyName, + int propertyCount, + const char** propertyKeys, + const char** propertyValues, + void** hostHandle, + unsigned int* domainId); + +typedef int (*ShutdownCoreCLRFunction)( + void* hostHandle, + unsigned int domainId); + +class CoreCLRLoader +{ +private: + InitializeCoreCLRFunction initializeCoreCLR; + ShutdownCoreCLRFunction shutdownCoreCLR; + void *coreclrLib; + void* hostHandle; + unsigned int domainId; +public: + static CoreCLRLoader* Create(const char *coreClrPath); + void* LoadFunction(const char* functionName); + int Finish(); +}; + diff --git a/src/ildasm/windasm.cpp b/src/ildasm/windasm.cpp index e5c78333ee..1316731e0a 100644 --- a/src/ildasm/windasm.cpp +++ b/src/ildasm/windasm.cpp @@ -61,6 +61,7 @@ extern char g_szAsmCodeIndent[]; extern DWORD g_Mode; +extern char* g_pszExeFile; extern char g_szInputFile[]; // in UTF-8 extern WCHAR g_wszFullInputFile[]; // in UTF-16 extern char g_szOutputFile[]; // in UTF-8 @@ -171,7 +172,11 @@ int ProcessOneArg(__in __nullterminated char* szArg, __out char** ppszObjFileNam if(strlen(szArg) == 0) return 0; if ((strcmp(szArg, "/?") == 0) || (strcmp(szArg, "-?") == 0)) return 1; +#ifdef FEATURE_PAL + if(szArg[0] == '-') +#else if((szArg[0] == '/') || (szArg[0] == '-')) +#endif { strncpy_s(szOpt,128, &szArg[1],10); szOpt[3] = 0; @@ -485,13 +490,13 @@ char* ANSItoUTF8(__in __nullterminated char* szANSI) int ParseCmdLineW(__in __nullterminated WCHAR* wzCmdLine, __out char** ppszObjFileName) { int argc,ret=0; - LPWSTR* argv= CommandLineToArgvW(wzCmdLine,&argc); + LPWSTR* argv= SegmentCommandLine(wzCmdLine, (DWORD*)&argc); char* szArg = new char[2048]; for(int i=1; i < argc; i++) { memset(szArg,0,2048); WszWideCharToMultiByte(CP_UTF8,0,argv[i],-1,szArg,2048,NULL,NULL); - if(ret = ProcessOneArg(szArg,ppszObjFileName)) break; + if((ret = ProcessOneArg(szArg,ppszObjFileName)) != 0) break; } VDELETE(szArg); return ret; @@ -529,7 +534,7 @@ int ParseCmdLineA(__in __nullterminated char* szCmdLine, __out char** ppszObjFil for(int i=1; i < argc; i++) { - if(ret = ProcessOneArg(argv[i],ppszObjFileName)) break; + if((ret = ProcessOneArg(argv[i],ppszObjFileName)) != 0) break; } VDELETE(szCmdLineUTF); return ret; @@ -544,6 +549,15 @@ int APIENTRY WinMain(HINSTANCE hInstance, int nCmdShow) #endif { +#if defined(FEATURE_CORECLR) && defined(FEATURE_PAL) + if (0 != PAL_Initialize(nCmdShow, lpCmdLine)) + { + printError(g_pFile, "Error: Fail to PAL_Initialize\n"); + exit(1); + } + g_pszExeFile = lpCmdLine[0]; +#endif + // ildasm does not need to be SO-robust. SO_NOT_MAINLINE_FUNCTION; @@ -581,8 +595,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); hConsoleErr = GetStdHandle(STD_ERROR_HANDLE); +#ifndef FEATURE_PAL // Dev11 #5320 - pull the localized resource loader up so if ParseCmdLineW need resources, they're already loaded g_hResources = LoadLocalizedResourceDLLForSDK(L"ildasmrc.dll"); +#endif iCommandLineParsed = ParseCmdLineW((wzCommandLine = GetCommandLineW()),&g_pszObjFileName); |