summaryrefslogtreecommitdiff
path: root/src/ildasm
diff options
context:
space:
mode:
authorKyungwoo Lee <kyulee@microsoft.com>2015-12-01 10:16:08 -0800
committerKyungwoo Lee <kyulee@microsoft.com>2015-12-07 06:54:12 -0800
commit823b4b7d602c2298e32f2b7961bbc739cdf5b4cd (patch)
tree4aff7653d7caf70d7e23a8ec07e9245db8d7bc9c /src/ildasm
parentb313fde80475f234f4746ea2e17d269bbfe00aba (diff)
downloadcoreclr-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.txt4
-rw-r--r--src/ildasm/dasm.cpp110
-rw-r--r--src/ildasm/dasm_formattype.cpp6
-rw-r--r--src/ildasm/dis.cpp4
-rw-r--r--src/ildasm/dis.h27
-rw-r--r--src/ildasm/dman.cpp19
-rw-r--r--src/ildasm/dres.cpp3
-rw-r--r--src/ildasm/dynamicarray.h (renamed from src/ildasm/DynamicArray.h)0
-rw-r--r--src/ildasm/exe/CMakeLists.txt31
-rw-r--r--src/ildasm/unixcoreclrloader/CMakeLists.txt11
-rw-r--r--src/ildasm/unixcoreclrloader/coreclrloader.cpp73
-rw-r--r--src/ildasm/unixcoreclrloader/coreclrloader.h32
-rw-r--r--src/ildasm/windasm.cpp22
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);