Build crossgen for Linux
authorJohn Chen (JOCHEN7) <jochen@microsoft.com>
Tue, 28 Apr 2015 20:20:01 +0000 (13:20 -0700)
committerJohn Chen (JOCHEN7) <jochen@microsoft.com>
Wed, 29 Apr 2015 06:15:22 +0000 (23:15 -0700)
- Crossgen is now built as part of coreclr
- Crossgen successfully compiles mscorlib.dll
- Resulting mscorlib.ni.dll not yet usable

54 files changed:
clr.coreclr.props
crossgen.cmake
src/CMakeLists.txt
src/binder/CMakeLists.txt
src/dlls/mscoree/mscoree.cpp
src/gcinfo/CMakeLists.txt
src/inc/clr_std/vector
src/inc/clrconfigvalues.h
src/inc/crosscomp.h
src/inc/ex.h
src/jit/CMakeLists.txt
src/jit/error.cpp
src/md/compiler/CMakeLists.txt
src/md/enc/CMakeLists.txt
src/md/hotdata/CMakeLists.txt
src/md/runtime/CMakeLists.txt
src/mscorlib/Tools/BclRewriter/BclRewriter.targets
src/pal/inc/pal.h
src/pal/inc/rt/ntimage.h
src/pal/inc/rt/palrt.h
src/pal/src/CMakeLists.txt
src/pal/src/file/path.cpp
src/pal/src/misc/msgbox.cpp
src/strongname/api/CMakeLists.txt
src/strongname/api/strongname.cpp
src/strongname/api/strongnameinternal.cpp
src/strongname/inc/strongnameholders.h
src/strongname/inc/strongnameinternal.h
src/tools/CMakeLists.txt
src/tools/crossgen/CMakeLists.txt
src/tools/crossgen/crossgen.cpp
src/tools/util/consoleargs.cpp
src/tools/util/consoleargs.h
src/utilcode/CMakeLists.txt
src/vm/ceeload.cpp
src/vm/ceemain.cpp
src/vm/coreclr/corebindresult.inl
src/vm/crossgen/CMakeLists.txt
src/vm/crossgencompile.cpp
src/vm/frames.h
src/vm/jitinterface.cpp
src/vm/loaderallocator.cpp
src/vm/loaderallocator.hpp
src/vm/pefile.cpp
src/vm/peimage.inl
src/vm/threads.h
src/zap/nativeformatwriter.cpp
src/zap/zapheaders.cpp
src/zap/zapimage.cpp
src/zap/zapimport.cpp
src/zap/zapinfo.cpp
src/zap/zapper.cpp
src/zap/zaprelocs.cpp
src/zap/zapwriter.cpp

index da1b681..931a62c 100644 (file)
@@ -50,7 +50,7 @@
     <FeatureXPlatDacDebugging_HostWindowsAMD64 Condition="'$(TargetArch)' == 'amd64' or '$(TargetArch)' == 'arm64'">true</FeatureXPlatDacDebugging_HostWindowsAMD64>
     <FeatureXPlatDacDebugging_HostOneCorex86 Condition="'$(TargetArch)' == 'i386' or '$(TargetArch)' == 'arm'">true</FeatureXPlatDacDebugging_HostOneCorex86>
     <FeatureXPlatDacDebugging_HostOneCoreAMD64 Condition="'$(TargetArch)' == 'amd64'">true</FeatureXPlatDacDebugging_HostOneCoreAMD64>
-    <ProfilingSupportedBuild>true</ProfilingSupportedBuild>
+    <ProfilingSupportedBuild Condition="'$(TargetsWindows)' == 'true'">true</ProfilingSupportedBuild>
     <FeatureUseAsmGCWriteBarriers>true</FeatureUseAsmGCWriteBarriers>
     <!-- Setting this to "false" works only for workstation GC, not server. -->
     <FeatureSymDiff>true</FeatureSymDiff>
index f8bdbd0..af285fc 100644 (file)
@@ -4,6 +4,7 @@ add_definitions(
     -DCROSSGEN_COMPILE
     -DCROSS_COMPILE
     -DFEATURE_NATIVE_IMAGE_GENERATION
+    -DFEATURE_MERGE_JIT_AND_ENGINE
     -DSELF_NO_HOST)
 
 remove_definitions(
@@ -11,6 +12,7 @@ remove_definitions(
     -DFEATURE_EVENT_TRACE=1
     -DFEATURE_LOADER_OPTIMIZATION
     -DFEATURE_MULTICOREJIT
+    -DFEATURE_PERFMAP
     -DFEATURE_RANDOMIZED_STRING_HASHING
     -DFEATURE_VERSIONING_LOG
 )
index 95a9640..6cebd06 100644 (file)
@@ -34,11 +34,11 @@ add_subdirectory(binder)
 add_subdirectory(classlibnative)
 add_subdirectory(dlls)
 add_subdirectory(ToolBox)
+add_subdirectory(tools)
 add_subdirectory(unwinder)
 
 if(WIN32)
   add_subdirectory(ipcman)
-  add_subdirectory(tools)
 endif(WIN32)
 
 if(CLR_CMAKE_PLATFORM_UNIX)
index 7641e02..af38572 100644 (file)
@@ -35,7 +35,5 @@ if(CLR_CMAKE_PLATFORM_UNIX)
 endif(CLR_CMAKE_PLATFORM_UNIX)
 
 add_subdirectory(v3binder)
-if(WIN32)
-  add_subdirectory(v3binder_crossgen)
-endif()
+add_subdirectory(v3binder_crossgen)
 
index 2c78e7d..42c9ade 100644 (file)
@@ -907,9 +907,23 @@ STDAPI GetCORSystemDirectoryInternal(__out_ecount_part_opt(cchBuffer, *pdwLength
     if (pBuffer == NULL)
         IfFailGo(E_POINTER);
 
+#ifdef CROSSGEN_COMPILE
+    if (WszGetModuleFileName(NULL, pBuffer, cchBuffer) == 0)
+    {
+        IfFailGo(HRESULT_FROM_GetLastError());
+    }
+    WCHAR *pSeparator;
+    pSeparator = wcsrchr(pBuffer, DIRECTORY_SEPARATOR_CHAR_W);
+    if (pSeparator == NULL)
+    {
+        IfFailGo(HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND));
+    }
+    *pSeparator = W('\0');
+#else
     if (!PAL_GetPALDirectory(pBuffer, cchBuffer)) {
         IfFailGo(HRESULT_FROM_GetLastError());
     }
+#endif
 
     // Include the null terminator in the length
     *pdwLength = (DWORD)wcslen(pBuffer)+1;
@@ -1267,7 +1281,7 @@ HRESULT SetInternalSystemDirectory()
 }
 
 #if defined(CROSSGEN_COMPILE) && defined(FEATURE_CORECLR)
-void SetMscorlibPath(LPCWCHAR wzSystemDirectory)
+void SetMscorlibPath(LPCWSTR wzSystemDirectory)
 {
     wcscpy_s(g_pSystemDirectory, COUNTOF(g_pSystemDirectory), wzSystemDirectory);
 
index 2764b68..47789d8 100644 (file)
@@ -13,6 +13,4 @@ if(CLR_CMAKE_PLATFORM_UNIX)
 endif(CLR_CMAKE_PLATFORM_UNIX)
 
 add_subdirectory(lib)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif()
+add_subdirectory(crossgen)
index b189c41..6b36880 100644 (file)
@@ -27,6 +27,8 @@ namespace std
     class vector
     {
         public:
+            class const_iterator;
+
             class iterator
             {
                 friend class std::vector<T>::const_iterator;
index 75836e0..b333184 100644 (file)
@@ -764,7 +764,7 @@ CONFIG_DWORD_INFO(INTERNAL_NoASLRForNgen, W("NoASLRForNgen"), 0, "Turn off IMAGE
 RETAIL_CONFIG_DWORD_INFO_EX(EXTERNAL_NgenAllowOutput, W("NgenAllowOutput"), 0, "If set to 1, the NGEN worker will bind to the parent console, thus allowing stdout output to work", CLRConfig::REGUTIL_default)
 
 #ifdef CROSSGEN_COMPILE
-RETAIL_CONFIG_DWORD_INFO(INTERNAL_CrossGenAssumeInputSigned, L"CrossGenAssumeInputSigned", 1, "CrossGen should assume that its input assemblies will be signed before deployment")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_CrossGenAssumeInputSigned, W("CrossGenAssumeInputSigned"), 1, "CrossGen should assume that its input assemblies will be signed before deployment")
 #endif
 
 // 
index 1c21ab6..07801ef 100644 (file)
@@ -360,5 +360,5 @@ typedef struct _T_KNONVOLATILE_CONTEXT_POINTERS {
 
 
 #ifdef CROSSGEN_COMPILE
-void CrossGenNotSupported(char * message);
+void CrossGenNotSupported(const char * message);
 #endif
index 8babb68..644e19e 100644 (file)
@@ -7,6 +7,8 @@
 #if !defined(_EX_H_)
 #define _EX_H_
 
+void RetailAssertIfExpectedClean();             // Defined in src/utilcode/debug.cpp
+
 #ifdef CLR_STANDALONE_BINDER
 
 #define INCONTRACT(x)
@@ -51,7 +53,6 @@ inline void IfFailThrow(HRESULT hr)
     }
 }
 
-void RetailAssertIfExpectedClean();             // Defined in src\util\Debug.cpp
 /*
 inline HRESULT OutOfMemory()
 {
@@ -1252,7 +1253,6 @@ Exception *ExThrowWithInnerHelper(Exception *inner);
 // a RetailAssert when a reg key is set if we get an unexpected HRESULT
 // from one of the RPC calls.
 //===================================================================================
-void RetailAssertIfExpectedClean();             // Defined in src\util\Debug.cpp
 
 #define EX_CATCH_HRESULT_AND_NGEN_CLEAN(_hr)                                    \
     EX_CATCH                                                                    \
index d5f2623..b1c3e09 100644 (file)
@@ -90,6 +90,4 @@ endif()
 set(CLR_EXPORTED_SYMBOL_FILE ${CLRJIT_EXPORTS_DEF})
 
 add_subdirectory(dll)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif()
+add_subdirectory(crossgen)
index 223afb1..370a452 100644 (file)
@@ -356,7 +356,7 @@ void logf_stdout(const char* fmt, va_list args)
     }
     else
     {
-#ifdef CROSSGEN_COMPILE
+#if defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX)
         // Crossgen has forced stdout into UNICODE only mode:
         //     _setmode(_fileno(stdout), _O_U8TEXT); 
         //
index 130a8d2..b9fb91b 100644 (file)
@@ -31,6 +31,4 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 add_subdirectory(dac)
 add_subdirectory(wks)
 add_subdirectory(dbi)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif(WIN32)
+add_subdirectory(crossgen)
index 8ba256b..a7a2c91 100644 (file)
@@ -21,6 +21,4 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 add_subdirectory(dac)
 add_subdirectory(wks)
 add_subdirectory(dbi)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif(WIN32)
+add_subdirectory(crossgen)
index 246dc63..199edaa 100644 (file)
@@ -15,7 +15,7 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 
 add_subdirectory(dac)
 add_subdirectory(full)
+add_subdirectory(crossgen)
 if(WIN32)
   add_subdirectory(full-staticcrt)
-  add_subdirectory(crossgen)
 endif(WIN32)
index eb25640..96c9b51 100644 (file)
@@ -20,6 +20,4 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 add_subdirectory(dac)
 add_subdirectory(wks)
 add_subdirectory(dbi)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif(WIN32)
+add_subdirectory(crossgen)
index a0f67a6..d64414f 100644 (file)
   
   <Target Name="RewriteWithBclRewriter" 
           Inputs="@(AnnotatedAssembly)" Outputs="@(RewrittenAssembly)">
+
+    <PropertyGroup>
+      <OSPlatform Condition="'$(TargetsWindows)' == 'true'">win</OSPlatform>
+      <OSPlatform Condition="'$(TargetsWindows)' != 'true'">unix</OSPlatform>
+    </PropertyGroup>
    
-    <Exec Command="&quot;$(BclRewriterCommand)&quot; &quot;@(AnnotatedAssembly)&quot; &quot;/out:$(BclRewriterOutput)&quot; &quot;/include:$(BclRewriterModelFile)&quot; /platform:win /architecture:$(Platform) /flavor:$(_BuildType) /define:$(DefineConstants) /keepTempFiles+" StandardOutputImportance="Normal" />
+    <Exec Command="&quot;$(BclRewriterCommand)&quot; &quot;@(AnnotatedAssembly)&quot; &quot;/out:$(BclRewriterOutput)&quot; &quot;/include:$(BclRewriterModelFile)&quot; /platform:$(OSPlatform) /architecture:$(Platform) /flavor:$(_BuildType) /define:$(DefineConstants) /keepTempFiles+" StandardOutputImportance="Normal" />
 
     <!-- Update the location of the symbol file-->
     <PropertyGroup>
index d43e7d0..7c9936f 100644 (file)
@@ -702,8 +702,19 @@ MessageBoxW(
         IN LPCWSTR lpCaption,
         IN UINT uType);
 
+PALIMPORT
+int
+PALAPI
+MessageBoxA(
+        IN LPVOID hWnd,  // NOTE: diff from winuser.h
+        IN LPCSTR lpText,
+        IN LPCSTR lpCaption,
+        IN UINT uType);
+
 #ifdef UNICODE
 #define MessageBox MessageBoxW
+#else
+#define MessageBox MessageBoxA
 #endif
 
 /***************** wincon.h Entrypoints **********************************/
@@ -786,6 +797,7 @@ typedef struct _SECURITY_ATTRIBUTES {
 #define FILE_ATTRIBUTE_SYSTEM                   0x00000004
 #define FILE_ATTRIBUTE_DIRECTORY                0x00000010
 #define FILE_ATTRIBUTE_ARCHIVE                  0x00000020
+#define FILE_ATTRIBUTE_DEVICE                   0x00000040
 #define FILE_ATTRIBUTE_NORMAL                   0x00000080
 
 #define FILE_FLAG_WRITE_THROUGH    0x80000000
index 8d3a0c8..66201f0 100644 (file)
@@ -428,8 +428,10 @@ typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
 //      IMAGE_LIBRARY_PROCESS_TERM           0x0002     // Reserved.
 //      IMAGE_LIBRARY_THREAD_INIT            0x0004     // Reserved.
 //      IMAGE_LIBRARY_THREAD_TERM            0x0008     // Reserved.
+#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040    // DLL can move
+#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT   0x0100     // Image ix NX compatible
 #define IMAGE_DLLCHARACTERISTICS_NO_BIND     0x0800     // Do not bind this image.
-//                                           0x1000     // Reserved.
+#define IMAGE_DLLCHARACTERISTICS_APPCONTAINER 0x1000    // Image should execute in an AppContainer
 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER  0x2000     // Driver uses WDM model
 //                                           0x4000     // Reserved.
 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE     0x8000
index 1d6344d..8369cae 100644 (file)
@@ -1144,7 +1144,7 @@ errno_t __cdecl getenv_s(size_t *_ReturnValue, char *_Dst, size_t _SizeInWords,
 
 STDAPI_(BOOL) PathAppendW(LPWSTR pszPath, LPCWSTR pszMore);
 STDAPI_(int) PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR  pszPath);
-STDAPI_(LPWSTR) PathFindFileNameW(LPCWSTR pPath);
+PALIMPORT LPWSTR PALAPI PathFindFileNameW(LPCWSTR pPath);
 STDAPI_(LPWSTR) PathFindExtensionW(LPCWSTR pszPath);
 STDAPI_(int) PathGetDriveNumberW(LPCWSTR lpsz);
 STDAPI_(BOOL) PathIsRelativeW(LPCWSTR lpszPath);
@@ -1333,9 +1333,11 @@ typedef VOID (__stdcall *WAITORTIMERCALLBACK)(PVOID, BOOLEAN);
 
 #ifdef PLATFORM_UNIX
 #define DIRECTORY_SEPARATOR_CHAR_W W('/')
+#define DIRECTORY_SEPARATOR_STR_W W("/")
 #define PATH_SEPARATOR_CHAR_W W(':')
 #else // PLATFORM_UNIX
 #define DIRECTORY_SEPARATOR_CHAR_W W('\\')
+#define DIRECTORY_SEPARATOR_STR_W W("\\")
 #define PATH_SEPARATOR_CHAR_W W(';')
 #endif // PLATFORM_UNIX
 
index e2d57cb..3dff2db 100644 (file)
@@ -102,6 +102,7 @@ set(SOURCES
   misc/fmtmessage.cpp
   misc/interlock.cpp
   misc/miscpalapi.cpp
+  misc/msgbox.cpp
   misc/dactableaddress.cpp
   misc/strutil.cpp
   misc/sysinfo.cpp
index e91975b..f9e2234 100644 (file)
@@ -1485,3 +1485,42 @@ done:
     return nRet;
 }
 
+/*++
+Function:
+  PathFindFileNameW
+
+See MSDN doc.
+--*/
+LPWSTR
+PALAPI
+PathFindFileNameW(
+    IN LPCWSTR pPath
+    )
+{
+    PERF_ENTRY(PathFindFileNameW);
+    ENTRY("PathFindFileNameW(pPath=%p (%S))\n",
+          pPath?pPath:W16_NULLSTRING,
+          pPath?pPath:W16_NULLSTRING);
+
+    LPWSTR ret = (LPWSTR)pPath;
+    if (ret != NULL && *ret != W('\0'))
+    {
+        ret = PAL_wcschr(ret, W('\0')) - 1;
+        if (ret > pPath && *ret == W('/'))
+        {
+            ret--;
+        }
+        while (ret > pPath && *ret != W('/'))
+        {
+            ret--;
+        }
+        if (*ret == W('/') && *(ret + 1) != W('\0'))
+        {
+            ret++;
+        }
+    }
+done:
+    LOGEXIT("PathFindFileNameW returns %S\n", ret);
+    PERF_EXIT(PathFindFileNameW);
+    return ret;
+}
index 37b9422..a06d53b 100644 (file)
@@ -187,6 +187,68 @@ MessageBoxW(
             goto error;
         }
     }
+
+    rc = MessageBoxA(hWnd, text, caption, uType);
+
+error:
+    PAL_free(caption);
+    PAL_free(text);
+
+
+    LOGEXIT("MessageBoxW returns %d\n", rc);
+    PERF_EXIT(MessageBoxW);
+    return rc;
+}
+
+
+/*++
+Function:
+  MessageBoxA
+
+This is a small subset of MessageBox that simply logs a message to the
+system logging facility and returns. A typical log entry will look
+like:
+
+May 23 15:48:10 rice example1: MessageBox: Caption: Error Text
+
+Note:
+  hWnd should always be NULL.
+
+See MSDN doc.
+--*/
+int
+PALAPI
+MessageBoxA(
+           IN LPVOID hWnd,
+           IN LPCSTR lpText,
+           IN LPCSTR lpCaption,
+           IN UINT uType)
+{
+    INT len = 0;
+    INT rc = 0;
+
+    PERF_ENTRY(MessageBoxA);
+    ENTRY( "MessageBoxA (hWnd=%p, lpText=%p (%s), lpCaption=%p (%s), uType=%#x)\n",
+           hWnd, lpText?lpText:"NULL", lpText?lpText:"NULL",
+           lpCaption?lpCaption:"NULL",
+           lpCaption?lpCaption:"NULL", uType );
+
+    if (hWnd != NULL)
+    {
+        ASSERT("hWnd != NULL");
+    }
+
+    if (lpText == NULL)
+    {
+        WARN("No message text\n");
+
+        lpText = "(no message text)";
+    }
+
+    if (lpCaption == NULL)
+    {
+        lpCaption = "Error";
+    }
     
     if (uType & MB_DEFMASK)
     {
@@ -233,8 +295,8 @@ MessageBoxW(
     osstatus = SessionGetInfo(callerSecuritySession, &secSession, &secSessionInfo);
     if (noErr == osstatus && (secSessionInfo & sessionHasGraphicAccess) != 0)
     {
-        CFStringRef cfsTitle = CFStringCreateWithCString(kCFAllocatorDefault, caption, kCFStringEncodingUTF8);
-        CFStringRef cfsText = CFStringCreateWithCString(kCFAllocatorDefault, text, kCFStringEncodingUTF8);
+        CFStringRef cfsTitle = CFStringCreateWithCString(kCFAllocatorDefault, lpCaption, kCFStringEncodingUTF8);
+        CFStringRef cfsText = CFStringCreateWithCString(kCFAllocatorDefault, lpText, kCFStringEncodingUTF8);
         CFStringRef cfsButton1 = NULL;
         CFStringRef cfsButton2 = NULL;
         CFStringRef cfsButton3 = NULL;
@@ -336,25 +398,21 @@ MessageBoxW(
     {
         // We're not in a login session, e.g., running via ssh, and so bringing
         // up a message box would be bad form.
-        fprintf ( stderr, "MessageBox: %s: %s", caption, text );
-        syslog(LOG_USER|LOG_ERR, "MessageBox: %s: %s", caption, text);
+        fprintf ( stderr, "MessageBox: %s: %s", lpCaption, lpText );
+        syslog(LOG_USER|LOG_ERR, "MessageBox: %s: %s", lpCaption, lpText);
     }
 #else // __APPLE__
-    fprintf ( stderr, "MessageBox: %s: %s", caption, text );
-    syslog(LOG_USER|LOG_ERR, "MessageBox: %s: %s", caption, text);
+    fprintf ( stderr, "MessageBox: %s: %s", lpCaption, lpText );
+    syslog(LOG_USER|LOG_ERR, "MessageBox: %s: %s", lpCaption, lpText);
 
     // Some systems support displaying a GUI dialog. (This will suspend the current thread until they hit the
     // 'OK' button and allow a debugger to be attached).
-    PAL_DisplayDialog(caption, text);
+    PAL_DisplayDialog(lpCaption, lpText);
 #endif // __APPLE__ else
 
     PALCLeaveCriticalSection( &msgbox_critsec);
 error:
-    PAL_free(caption);
-    PAL_free(text);
-
-
-    LOGEXIT("MessageBoxW returns %d\n", rc);
-    PERF_EXIT(MessageBoxW);
+    LOGEXIT("MessageBoxA returns %d\n", rc);
+    PERF_EXIT(MessageBoxA);
     return rc;
 }
index 9b1a490..079d9a5 100644 (file)
@@ -24,6 +24,4 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 
 add_subdirectory(dac)
 add_subdirectory(wks)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif(WIN32)
+add_subdirectory(crossgen)
index ec91fe8..44ca173 100644 (file)
@@ -114,9 +114,9 @@ enum StrongNameCachedCsp {
 // allocated lazily as needed.
 struct SN_THREAD_CTX {
     DWORD       m_dwLastError;
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
     HCRYPTPROV  m_hProv[CachedCspCount];
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 };
 
 #endif // !DACCESS_COMPILE
@@ -200,7 +200,7 @@ struct SN_THREAD_CTX {
 #endif // FEATURE_WINDOWSPHONE
 #endif // FEATURE_CORECLR
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 
 #ifdef FEATURE_STRONGNAME_MIGRATION
 #include "caparser.h"
@@ -4668,11 +4668,11 @@ ErrExit:
 
 #endif // #ifndef DACCESS_COMPILE
 
-#else // !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#else // !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 
 #define InitStrongName() S_OK
 
-#endif // !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#endif // !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 
 
 // Free buffer allocated by routines below.
@@ -4698,12 +4698,12 @@ SN_THREAD_CTX *GetThreadContext()
         if (pThreadCtx == NULL)
             return NULL;
         pThreadCtx->m_dwLastError = S_OK;
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
         for (ULONG i = 0; i < CachedCspCount; i++)
         {
             pThreadCtx->m_hProv[i] = NULL;
         }
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 
         EX_TRY {
             ClrFlsSetValue(TlsIdx_StrongName, pThreadCtx);
index 10a08fa..5eda45f 100644 (file)
@@ -300,7 +300,7 @@ bool StrongNameIsValidPublicKey(const PublicKeyBlob &keyPublicKey, bool fImportK
         return false;
     }
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
     // Make sure the public key blob imports properly
     if (fImportKeys)
     {
@@ -316,9 +316,9 @@ bool StrongNameIsValidPublicKey(const PublicKeyBlob &keyPublicKey, bool fImportK
             return false;
         }
     }
-#else // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#else // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
     _ASSERTE(!fImportKeys);
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 
     return true;
 }
@@ -345,7 +345,7 @@ DWORD StrongNameSizeOfPublicKey(const PublicKeyBlob &keyPublicKey)
            GET_UNALIGNED_VAL32(&keyPublicKey.cbPublicKey);  // the number of bytes in the key
 }
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 
 //---------------------------------------------------------------------------------------
 //
@@ -444,5 +444,5 @@ bool StrongNameCryptAcquireContext(HCRYPTPROV *phProv, LPCWSTR pwszContainer, LP
     return !!WszCryptAcquireContext(phProv, pwszContainer, pwszProvider, dwProvType, dwFlags);
 }
 
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 
index 663fd5e..36597ea 100644 (file)
@@ -22,7 +22,7 @@ void VoidStrongNameFreeBuffer(__in T *pBuffer)
 }
 NEW_WRAPPER_TEMPLATE1(StrongNameBufferHolder, VoidStrongNameFreeBuffer<_TYPE>);
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 // Holder for HCRYPTPROV handles directly allocated from CAPI
 inline void ReleaseCapiProvider(HCRYPTPROV hProv)
 {
index ec5fb5d..6666bb2 100644 (file)
@@ -41,7 +41,7 @@ bool StrongNameIsEcmaKey(const PublicKeyBlob &keyPublicKey);
 
 bool StrongNameIsTheKey(__in_ecount(cbKey) const BYTE *pbKey, DWORD cbKey);
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 
 // Verify the format of a public key blob
 bool StrongNameIsValidKeyPair(__in_ecount(cbKeyPair) const BYTE *pbKeyPair, DWORD cbKeyPair);
@@ -49,7 +49,7 @@ bool StrongNameIsValidKeyPair(__in_ecount(cbKeyPair) const BYTE *pbKeyPair, DWOR
 bool GetBytesFromHex(LPCUTF8 szHexString, ULONG cchHexString, BYTE** buffer, ULONG *cbBufferSize);
 
 bool StrongNameCryptAcquireContext(HCRYPTPROV *phProv, LPCWSTR pwszContainer, LPCWSTR pwszProvider, DWORD dwProvType, DWORD dwFlags);
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 
 #ifdef FEATURE_CORECLR
 bool StrongNameIsSilverlightPlatformKey(__in_ecount(cbKey) const BYTE *pbKey, DWORD cbKey);
index d23b7e0..87c3eae 100644 (file)
@@ -1,3 +1,6 @@
 add_subdirectory(crossgen)
-add_subdirectory(GenClrDebugResource)
-add_subdirectory(InjectResource)
\ No newline at end of file
+
+if(WIN32)
+  add_subdirectory(GenClrDebugResource)
+  add_subdirectory(InjectResource)
+endif(WIN32)
index e7e2b65..e35db0f 100644 (file)
@@ -7,26 +7,40 @@ include_directories(../util)
 include_directories(../../pal/prebuilt/corerror)
 
 set(crossgen_SOURCES crossgen.cpp ../util/consoleargs.cpp)
-set(crossgen_RESOURCES Native.rc)
+if(WIN32)
+    set(crossgen_RESOURCES Native.rc)
+endif()
 
 add_definitions(-DFX_VER_INTERNALNAME_STR=crossgen.exe)
 add_definitions(-DNO_NGENPDB)
 
-if(CLR_CMAKE_PLATFORM_UNIX)
-    # This does not compile on Linux yet
-    if(CAN_BE_COMPILED_ON_LINUX)
-        add_executable(crossgen
-          ${crossgen_SOURCES}
-          ${crossgen_RESOURCES}
-        )
-    endif(CAN_BE_COMPILED_ON_LINUX)
+add_executable(crossgen
+  ${crossgen_SOURCES}
+  ${crossgen_RESOURCES}
+)
 
-else()
-    add_executable(crossgen
-      ${crossgen_SOURCES}
-      ${crossgen_RESOURCES}
-    )
+target_link_libraries(crossgen
+    cee_crossgen
+    mdcompiler_crossgen
+    mdruntime_crossgen
+    mdruntimerw_crossgen
+    mdhotdata_crossgen
+    corguids
+    jit_crossgen
+    gcinfo_crossgen
+    corzap_crossgen
+    mscorlib_crossgen
+    strongname_crossgen
+    utilcode_crossgen
+    v3binder_crossgen
+)
 
+if(CLR_CMAKE_PLATFORM_UNIX)
+    target_link_libraries(crossgen
+        coreclrpal
+        palrt
+    )
+else()
     target_link_libraries(crossgen
         advapi32
         ole32
@@ -36,32 +50,17 @@ else()
         version
         shlwapi
         bcrypt
-        corguids
-        utilcode_crossgen
-        corzap_crossgen
-        jit_crossgen
-        gcinfo_crossgen
-        strongname_crossgen
-        mdcompiler_crossgen
         mdwinmd_crossgen
-        mdruntimerw_crossgen
-        mdhotdata_crossgen
-        mdruntime_crossgen
-        cee_crossgen
-        mscorlib_crossgen
-        v3binder_crossgen
         ${STATIC_MT_CRT_LIB}
     )
 
-    # Can't compile on linux yet so only add for windows
-    # add the install targets
-    install (TARGETS crossgen DESTINATION .)
-    
     # We will generate PDB only for the debug configuration
     install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/crossgen.pdb DESTINATION PDB)
 
 endif(CLR_CMAKE_PLATFORM_UNIX)
 
+install (TARGETS crossgen DESTINATION .)
+
 add_subdirectory(../../zap/crossgen ../../zap/crossgen)
 add_subdirectory(../../vm/crossgen ../../vm/crossgen)
 add_subdirectory(../../vm/crossgen_mscorlib ../../vm/crossgen_mscorlib)
index db663f0..5005ea4 100644 (file)
@@ -23,9 +23,6 @@
 #include "coregen.h"
 #include "consoleargs.h"
 
-#define SEPARATOR_CHAR_W W('\\')
-#define SEPARATOR_STRING_W W("\\")
-
 // Return values from wmain() in case of error
 enum ReturnValues
 {
@@ -41,7 +38,7 @@ STDAPI CreatePDBWorker(LPCWSTR pwzAssemblyPath, LPCWSTR pwzPlatformAssembliesPat
 STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembliesPaths, LPCWSTR pwzTrustedPlatformAssemblies, LPCWSTR pwzPlatformResourceRoots, LPCWSTR pwzAppPaths, LPCWSTR pwzOutputFilename=NULL, LPCWSTR pwzPlatformWinmdPaths=NULL, ICorSvcLogger *pLogger = NULL);
 void SetSvcLogger(ICorSvcLogger *pCorSvcLogger);
 #ifdef FEATURE_CORECLR
-void SetMscorlibPath(LPCWCHAR wzSystemDirectory);
+void SetMscorlibPath(LPCWSTR wzSystemDirectory);
 #endif
 
 /* --------------------------------------------------------------------------- *    
@@ -57,7 +54,7 @@ void Outputf(LPCWSTR szFormat, ...)
 {
     va_list args;
     va_start(args, szFormat);
-    vwprintf(szFormat, args);
+    vfwprintf(stdout, szFormat, args);
     va_end(args);
 }
 
@@ -259,7 +256,7 @@ bool MatchParameter(LPCWSTR szArg, LPCWSTR szTestParamName)
 // Returns true if pwzString ends with the string in pwzCandidate
 // Ignores case
 //
-bool StringEndsWith(LPWSTR pwzString, LPWSTR pwzCandidate)
+bool StringEndsWith(LPCWSTR pwzString, LPCWSTR pwzCandidate)
 {
     size_t stringLength = wcslen(pwzString);
     size_t candidateLength = wcslen(pwzCandidate);
@@ -269,7 +266,7 @@ bool StringEndsWith(LPWSTR pwzString, LPWSTR pwzCandidate)
         return false;
     }
 
-    LPWSTR pwzStringEnd = pwzString + stringLength - candidateLength;
+    LPCWSTR pwzStringEnd = pwzString + stringLength - candidateLength;
 
     return !_wcsicmp(pwzStringEnd, pwzCandidate);
 }
@@ -322,7 +319,7 @@ bool ComputeMscorlibPathFromTrustedPlatformAssemblies(LPWSTR pwzMscorlibPath, DW
 // Given a path terminated with "\\" and a search mask, this function will add
 // the enumerated files, corresponding to the search mask, from the path into
 // the refTPAList.
-void PopulateTPAList(SString path, LPWSTR pwszMask, SString &refTPAList, bool fCompilingMscorlib, bool fCreatePDB)
+void PopulateTPAList(SString path, LPCWSTR pwszMask, SString &refTPAList, bool fCompilingMscorlib, bool fCreatePDB)
 {
     _ASSERTE(path.GetCount() > 0);
     ClrDirectoryEnumerator folderEnumerator(path.GetUnicode(), pwszMask);
@@ -444,7 +441,9 @@ extern HMODULE g_hThisInst;
 
 int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
 {
+#ifndef FEATURE_PAL
     g_hThisInst = WszGetModuleHandle(NULL);
+#endif
 
     /////////////////////////////////////////////////////////////////////////
     //
@@ -468,8 +467,10 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
 
     HRESULT hr;
 
+#ifndef PLATFORM_UNIX
     // This is required to properly display Unicode characters
     _setmode(_fileno(stdout), _O_U8TEXT);
+#endif
 
     // Skip this executable path
     argv++;
@@ -690,7 +691,7 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
             argc--;
 
             // Ensure output dir ends in a backslash, or else diasymreader has issues
-            if (wzDirectoryToStorePDB[wcslen(wzDirectoryToStorePDB)-1] != SEPARATOR_CHAR_W)
+            if (wzDirectoryToStorePDB[wcslen(wzDirectoryToStorePDB)-1] != DIRECTORY_SEPARATOR_CHAR_W)
             {
                 if (wcscat_s(
                         wzDirectoryToStorePDB, 
@@ -811,7 +812,7 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
             Output(W("You must specify an output filename (/out <file>)\n"));
             exit(INVALID_ARGUMENTS);
         }
-        if (CopyFileExW(pwzFilename, pwzOutputFilename, NULL, NULL, NULL, 0) == 0)
+        if (CopyFileW(pwzFilename, pwzOutputFilename, FALSE) == 0)
         {
             DWORD dwLastError = GetLastError();
             OutputErrf(W("Error: x86 copy failed for \"%s\" (0x%08x)\n"), pwzFilename, HRESULT_FROM_WIN32(dwLastError));
@@ -928,7 +929,7 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
             exit(CLR_INIT_ERROR);
         }
 
-        wchar_t* pszSep = wcsrchr(wzTrustedPathRoot, SEPARATOR_CHAR_W);
+        wchar_t* pszSep = wcsrchr(wzTrustedPathRoot, DIRECTORY_SEPARATOR_CHAR_W);
         if (pszSep == NULL)
         {
             ERROR_HR(W("Error: wcsrchr returned NULL; GetModuleFileName must have given us something bad\n"), E_UNEXPECTED);
@@ -988,3 +989,31 @@ int _cdecl wmain(int argc, __in_ecount(argc) WCHAR **argv)
 
     return 0;
 }
+
+#ifdef PLATFORM_UNIX
+int main(int argc, char *argv[])
+{
+    if (0 != PAL_Initialize(argc, argv))
+    {
+        return FAILURE_RESULT;
+    }
+
+    wchar_t **wargv = new wchar_t*[argc];
+    for (int i = 0; i < argc; i++)
+    {
+        size_t len = strlen(argv[i]) + 1;
+        wargv[i] = new wchar_t[len];
+        WszMultiByteToWideChar(CP_ACP, 0, argv[i], -1, wargv[i], len);
+    }
+
+    int ret = wmain(argc, wargv);
+
+    for (int i = 0; i < argc; i++)
+    {
+        delete[] wargv[i];
+    }
+    delete[] wargv;
+
+    return ret;
+}
+#endif // PLATFORM_UNIX
index ad316e7..5bf88a5 100644 (file)
@@ -3,6 +3,7 @@
 // Licensed under the MIT license. See LICENSE file in the project root for full license information. 
 //
 
+#include <stdio.h>
 #include "consoleargs.h"
 #include <strsafe.h>
 
@@ -45,6 +46,7 @@ inline int HexValue (WCHAR c)
     return (c >= '0' && c <= '9') ? c - '0' : (c & 0xdf) - 'A' + 10;
 }
 
+#ifndef PLATFORM_UNIX
 //  Get canonical file path from a user specified path.  wszSrcfileName can include relative paths, etc.
 //  Much of this function was taken from csc.exe.
 DWORD GetCanonFilePath(_In_z_ LPCWSTR wszSrcFileName, _Out_z_cap_(cchDestFileName) LPWSTR wszDestFileName, _In_ DWORD cchDestFileName, _In_ bool fPreserveSrcCasing)
@@ -103,12 +105,12 @@ DWORD GetCanonFilePath(_In_z_ LPCWSTR wszSrcFileName, _Out_z_cap_(cchDestFileNam
     // devices beginning with "\\.\"
     // or wildcards
     // or characters 0-31
-    if (wcschr( full_path + (hasDrive ? 2 : 0), L':') != NULL ||
-        wcsncmp( full_path, L"\\\\?\\", 4) == 0 ||
-        wcsncmp( full_path, L"\\\\.\\", 4) == 0 ||
-        wcspbrk(full_path, L"?*\x1\x2\x3\x4\x5\x6\x7\x8\x9"
-            L"\xA\xB\xC\xD\xE\xF\x10\x11\x12\x13\x14\x15"
-            L"\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\0") != NULL) {
+    if (wcschr( full_path + (hasDrive ? 2 : 0), W(':')) != NULL ||
+        wcsncmp( full_path, W("\\\\?\\"), 4) == 0 ||
+        wcsncmp( full_path, W("\\\\.\\"), 4) == 0 ||
+        wcspbrk(full_path, W("?*\x1\x2\x3\x4\x5\x6\x7\x8\x9")
+            W("\xA\xB\xC\xD\xE\xF\x10\x11\x12\x13\x14\x15")
+            W("\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\0")) != NULL) {
         SetLastError(ERROR_INVALID_NAME);
         goto FAIL;
     }
@@ -299,6 +301,7 @@ FAIL:
     }
     return 0;
 }
+#endif // !PLATFORM_UNIX
 
 bool FreeString(LPCWSTR szText)
 {
@@ -334,19 +337,26 @@ void ConsoleArgs::CleanUpArgs()
     }
 }
 
-bool ConsoleArgs::GetFullFileName(LPCWSTR szSource, __deref_out_ecount(cbFilenameBuffer) LPWSTR filenameBuffer, DWORD cbFilenameBuffer, bool fOutputFilename)
+bool ConsoleArgs::GetFullFileName(LPCWSTR szSource, __deref_out_ecount(cchFilenameBuffer) LPWSTR filenameBuffer, DWORD cchFilenameBuffer, bool fOutputFilename)
 {
-    if (0 == GetCanonFilePath( szSource, filenameBuffer, cbFilenameBuffer, fOutputFilename))
+#ifdef PLATFORM_UNIX
+    WCHAR tempBuffer[MAX_PATH];
+    memset(filenameBuffer, 0, cchFilenameBuffer * sizeof(WCHAR));
+    if (!PathCanonicalizeW(tempBuffer, szSource) ||
+        StringCchCopyW(filenameBuffer, cchFilenameBuffer, tempBuffer) != S_OK)
+#else
+    if (0 == GetCanonFilePath( szSource, filenameBuffer, cchFilenameBuffer, fOutputFilename))
+#endif
     {
         if (filenameBuffer[0] == L'\0')
         {
             // This could easily fail because of an overflow, but that's OK
             // we only want what will fit in the output buffer so we can print
             // a good error message
-            StringCchCopyW(filenameBuffer, cbFilenameBuffer - 4, szSource);
+            StringCchCopyW(filenameBuffer, cchFilenameBuffer - 4, szSource);
             // Don't cat on the ..., only stick it in the last 4 characters
             // to indicate truncation (if the string is short than this it just won't print)
-            StringCchCopyW(filenameBuffer + cbFilenameBuffer - 4, 4, L"...");
+            StringCchCopyW(filenameBuffer + cchFilenameBuffer - 4, 4, W("..."));
         }
         return false;
     }
@@ -374,7 +384,7 @@ void ConsoleArgs::SetErrorMessage(__deref_in LPCWSTR pwzMessage)
         return;
     }
 
-    wcscpy_s(m_lastErrorMessage, wcslen(pwzMessage) + 1, pwzMessage);
+    wcscpy_s((LPWSTR)m_lastErrorMessage, wcslen(pwzMessage) + 1, pwzMessage);
 }
 
 //
@@ -633,7 +643,7 @@ LEADINGWHITE:
 
         if (chIllegal != 0)
         {
-            SetErrorMessage(L"Illegal option character.");
+            SetErrorMessage(W("Illegal option character."));
             break;
         }
 
@@ -641,13 +651,13 @@ LEADINGWHITE:
         WCHAR * szArgCopy = new WCHAR[cchLen];
         if (!szArgCopy || FAILED(StringCchCopyW(szArgCopy, cchLen, pFirst)))
         {
-            SetErrorMessage(L"Out of memory.");
+            SetErrorMessage(W("Out of memory."));
             break;
         }
         WStrList * listArgNew = new WStrList( szArgCopy, (*argLast));
         if (!listArgNew)
         {
-            SetErrorMessage(L"Out of memory.");
+            SetErrorMessage(W("Out of memory."));
             break;
         }
 
@@ -678,7 +688,7 @@ bool ConsoleArgs::ExpandResponseFiles(__in int argc, __deref_in_ecount(argc) con
         LPWSTR copyArg = new WCHAR[wcslen(argv[0]) + 1];
         if (!copyArg)
         {
-            SetErrorMessage(L"Out of memory.");
+            SetErrorMessage(W("Out of memory."));
             return false;
         }
         wcscpy_s(copyArg, wcslen(argv[0]) + 1, argv[0]);
@@ -686,7 +696,7 @@ bool ConsoleArgs::ExpandResponseFiles(__in int argc, __deref_in_ecount(argc) con
         WStrList * listArgNew = new WStrList(copyArg, (*argLast));
         if (!listArgNew)
         {
-            SetErrorMessage(L"Out of memory.");
+            SetErrorMessage(W("Out of memory."));
             return false;
         }
         
@@ -713,7 +723,7 @@ bool ConsoleArgs::ExpandResponseFiles(__in int argc, __deref_in_ecount(argc) con
     m_rgArgs = new LPWSTR[newArgc];
     if (!m_rgArgs)
     {
-        SetErrorMessage(L"Out of memory.");
+        SetErrorMessage(W("Out of memory."));
         return false;
     }
     int i = 0;
@@ -745,21 +755,23 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
     HANDLE hFile = CreateFile(pwzFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
-        SetErrorMessage(L"Cannot open response file.");
+        SetErrorMessage(W("Cannot open response file."));
         goto ErrExit;
     }
+
+    {
     DWORD size = GetFileSize(hFile, NULL);
     bufA = new char[size];
     
     if (!bufA)
     {
-        SetErrorMessage(L"Out of memory");
+        SetErrorMessage(W("Out of memory"));
         goto ErrExit;
     }
     DWORD numRead = 0;
     if (!ReadFile(hFile, bufA, size, &numRead, NULL) || numRead != size)
     {
-        SetErrorMessage(L"Failure reading response file.");
+        SetErrorMessage(W("Failure reading response file."));
         goto ErrExit;
     }
 
@@ -790,13 +802,13 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
     }
     else if (byte0 == 0xFE && byte1 == 0xFF)
     {
-        SetErrorMessage(L"Invalid response file format.  Use little endian encoding with Unicode");
+        SetErrorMessage(W("Invalid response file format.  Use little endian encoding with Unicode"));
         goto ErrExit;
     }
-    else if (byte0 == 0xFF && byte1 == 0xFE && byte2 == 0x00 && byte3 == 0x00 ||
-        byte0 == 0x00 && byte1 == 0x00 && byte2 == 0xFE && byte3 == 0xFF)
+    else if ((byte0 == 0xFF && byte1 == 0xFE && byte2 == 0x00 && byte3 == 0x00) ||
+        (byte0 == 0x00 && byte1 == 0x00 && byte2 == 0xFE && byte3 == 0xFF))
     {
-        SetErrorMessage(L"Invalid response file format.  Use ANSI, UTF-8, or UTF-16");
+        SetErrorMessage(W("Invalid response file format.  Use ANSI, UTF-8, or UTF-16"));
         goto ErrExit;
     }
 
@@ -810,7 +822,7 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
         // Sanity check - requiredSize better be an even number since we're dealing with UTF-16
         if (requiredSize % 2 != 0)
         {
-            SetErrorMessage(L"Response file corrupt.  Expected UTF-16 encoding but we had an odd number of bytes");
+            SetErrorMessage(W("Response file corrupt.  Expected UTF-16 encoding but we had an odd number of bytes"));
             goto ErrExit;
         }
 
@@ -819,7 +831,7 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
         bufW = new WCHAR[requiredSize];
         if (!bufW)
         {
-            SetErrorMessage(L"Out of memory");
+            SetErrorMessage(W("Out of memory"));
             goto ErrExit;
         }
 
@@ -835,13 +847,13 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
         bufW = new WCHAR[requiredSize + 1];
         if (!bufW)
         {
-            SetErrorMessage(L"Out of memory");
+            SetErrorMessage(W("Out of memory"));
             goto ErrExit;
         }
 
         if (!MultiByteToWideChar(CP_UTF8, 0, postByteOrderMarks, size, bufW, requiredSize))
         {
-            SetErrorMessage(L"Failure reading response file.");
+            SetErrorMessage(W("Failure reading response file."));
             goto ErrExit;
         }
 
@@ -851,6 +863,7 @@ bool ConsoleArgs::ReadTextFile(LPCWSTR pwzFilename, __deref_out LPWSTR *ppwzText
     *ppwzTextBuffer = bufW;
     
     success = true;
+    }
 
 ErrExit:
     if (bufA)
@@ -883,7 +896,7 @@ void ConsoleArgs::ProcessResponseArgs()
 
         if (wcslen(szArg) == 1)
         {
-            SetErrorMessage(L"No response file specified");
+            SetErrorMessage(W("No response file specified"));
             goto CONTINUE;
         }
 
@@ -895,22 +908,27 @@ void ConsoleArgs::ProcessResponseArgs()
         hr = TreeAdd(&response_files, szFilename);
         if (hr == E_OUTOFMEMORY)
         {
-            SetErrorMessage(L"Out of memory.");
+            SetErrorMessage(W("Out of memory."));
             goto CONTINUE;
         }
         else if (hr == S_FALSE)
         {
-            SetErrorMessage(L"Duplicate response file.");
+            SetErrorMessage(W("Duplicate response file."));
             goto CONTINUE;
         }
         
-        LPWSTR pwzFileBuffer = nullptr;
+        {
+        LPWSTR pwzFileBuffer;
+        pwzFileBuffer = nullptr;
         if (!ReadTextFile(szFilename, &pwzFileBuffer))
         {
             goto CONTINUE;
         }
 
         LPWSTR szActualText = nullptr;
+#ifdef PLATFORM_UNIX
+        szActualText = pwzFileBuffer;
+#else
         DWORD dwNumChars = ExpandEnvironmentStrings(pwzFileBuffer, NULL, 0);
         LPWSTR szExpandedBuffer = new WCHAR[dwNumChars];
         if (szExpandedBuffer != nullptr)
@@ -927,8 +945,10 @@ void ConsoleArgs::ProcessResponseArgs()
                 
             }
         }
+#endif
         
         TextToArgs(szActualText, &listCurArg->next);
+        }
 
 CONTINUE:  // remove the response file argument, and continue to the next.
         listCurArg->arg = NULL;
index 869cee3..e9bc93b 100644 (file)
 #include "tree.h"
 #include <strsafe.h>
 
+#include "palclr.h"
+
 typedef tree<LPCWSTR> b_tree;
 typedef list<WCHAR*> WStrList;
 
-const LPWSTR kOutOfMemory = L"Out of memory";
+const LPCWSTR kOutOfMemory = W("Out of memory");
 
 class ConsoleArgs
 {
@@ -40,7 +42,7 @@ public:
     // Frees all memory used by the arg list and the argv/argc array
     void CleanUpArgs();
 
-    LPWSTR ErrorMessage()
+    LPCWSTR ErrorMessage()
     {
         if (m_errorOccured)
         {
@@ -65,7 +67,7 @@ private:
     WStrList * m_listArgs;
 
     bool m_errorOccured;
-    LPWSTR m_lastErrorMessage;
+    LPCWSTR m_lastErrorMessage;
 };
 
 #endif // __CONSOLEARGS_H__
index d8ea9f1..0db79c1 100644 (file)
@@ -95,7 +95,5 @@ endif(CLR_CMAKE_PLATFORM_UNIX)
 add_subdirectory(dac)
 add_subdirectory(dyncrt)
 add_subdirectory(staticnohost)
-if(WIN32)
-  add_subdirectory(crossgen)
-endif(WIN32)
+add_subdirectory(crossgen)
 
index 4b8cc42..f5bf61c 100644 (file)
@@ -11023,7 +11023,7 @@ void Module::Fixup(DataImage *image)
     STANDARD_VM_CONTRACT;
 
     // Propagate all changes to the image copy
-    memcpy(image->GetImagePointer(this), this, sizeof(Module));
+    memcpy(image->GetImagePointer(this), (void*)this, sizeof(Module));
 
     //
     // Zero out VTable
@@ -11072,7 +11072,7 @@ void Module::Fixup(DataImage *image)
     // Clear active dependencies - they will be refilled at load time
     image->ZeroField(this, offsetof(Module, m_activeDependencies), sizeof(m_activeDependencies));
     new (image->GetImagePointer(this, offsetof(Module, m_unconditionalDependencies))) SynchronizedBitMask();
-    image->ZeroField(this, offsetof(Module, m_unconditionalDependencies) + offsetof(SynchronizedBitMask, SynchronizedBitMask::m_bitMaskLock) + offsetof(SimpleRWLock,SimpleRWLock::m_spinCount), sizeof(m_unconditionalDependencies.m_bitMaskLock.m_spinCount));
+    image->ZeroField(this, offsetof(Module, m_unconditionalDependencies) + offsetof(SynchronizedBitMask, m_bitMaskLock) + offsetof(SimpleRWLock,m_spinCount), sizeof(m_unconditionalDependencies.m_bitMaskLock.m_spinCount));
     image->ZeroField(this, offsetof(Module, m_dwNumberOfActivations), sizeof(m_dwNumberOfActivations));
 
     image->ZeroField(this, offsetof(Module, m_LookupTableCrst), sizeof(m_LookupTableCrst));
index 833d5ec..ecac60a 100644 (file)
@@ -1417,7 +1417,7 @@ HRESULT EEStartup(COINITIEE fFlags)
 
     _ASSERTE(!g_fEEStarted && !g_fEEInit && SUCCEEDED (g_EEStartupStatus));
 
-#ifdef FEATURE_PAL
+#if defined(FEATURE_PAL) && !defined(CROSSGEN_COMPILE)
     DacGlobals::Initialize();
 #endif
 
index 9b6cc46..fdfdf77 100644 (file)
@@ -48,7 +48,7 @@ inline BOOL CoreBindResult::IsMscorlib()
 #ifndef CROSSGEN_COMPILE
     return pAssembly->GetAssemblyName()->IsMscorlib();
 #else
-    return (pAssembly->GetPath()).EndsWithCaseInsensitive(SString(L"mscorlib.dll"), PEImage::GetFileSystemLocale());
+    return (pAssembly->GetPath()).EndsWithCaseInsensitive(SString(W("mscorlib.dll")), PEImage::GetFileSystemLocale());
 #endif
 }
 
index 2bf63c4..5f0b230 100644 (file)
@@ -2,89 +2,87 @@ include(${CLR_DIR}/crossgen.cmake)
 
 set(VM_CROSSGEN_SOURCES
     ../class.cpp
-    ../AppDomain.cpp
+    ../appdomain.cpp
     ../array.cpp
-    ../Assembly.cpp
-    ../AssemblySpec.cpp
+    ../assembly.cpp
+    ../assemblyspec.cpp
     ../binder.cpp
     ../ceeload.cpp
     ../ceemain.cpp
     ../classhash.cpp
     ../clrex.cpp
-    ../CLRPrivBinderUtil.cpp
-    ../CLRPrivBinderWinRT.cpp
-    ../CLRPrivTypeCacheWinRT.cpp
+    ../clrprivbinderutil.cpp
     ../clsload.cpp
     ../comdelegate.cpp
     ../codeman.cpp
     ../compile.cpp
-    ../ConstrainedExecutionRegion.cpp
-    ../CustomMarshalerInfo.cpp
-    ../Domainfile.cpp
-    ../BaseAssemblySpec.cpp
+    ../constrainedexecutionregion.cpp
+    ../custommarshalerinfo.cpp
+    ../domainfile.cpp
+    ../baseassemblyspec.cpp
     ../corebindresult.cpp
     ../coreassemblyspec.cpp
     ../crossdomaincalls.cpp
     ../dataimage.cpp
-    ../decodeMD.cpp
-    ../DebugInfoStore.cpp
+    ../decodemd.cpp
+    ../debuginfostore.cpp
     ../ecall.cpp
     ../eeconfig.cpp
     ../eehash.cpp
     ../eetwain.cpp
     ../excep.cpp
-    ../Field.cpp
-    ../Fieldmarshaler.cpp
+    ../field.cpp
+    ../fieldmarshaler.cpp
     ../formattype.cpp
-    ../TypeEquivalenceHash.cpp
-    ../GCDecode.cpp
+    ../typeequivalencehash.cpp
+    ../gcdecode.cpp
     ../genericdict.cpp
     ../generics.cpp
     ../genmeth.cpp
     ../hash.cpp
-    ../ILMarshalers.cpp
-    ../ILStubCache.cpp
-    ../ILStubResolver.cpp
+    ../ilmarshalers.cpp
+    ../ilstubcache.cpp
+    ../ilstubresolver.cpp
     ../instmethhash.cpp
     ../interoputil.cpp
     ../invokeutil.cpp
     ../inlinetracking.cpp
-    ../contractImpl.cpp
-    ../JITInterface.cpp
-    ../LoaderAllocator.cpp
-    ../ListLock.cpp
+    ../contractimpl.cpp
+    ../jitinterface.cpp
+    ../loaderallocator.cpp
+    ../listlock.cpp
     ../memberload.cpp
-    ../Method.cpp
-    ../MethodImpl.cpp
-    ../MethodTable.cpp
+    ../method.cpp
+    ../methodimpl.cpp
+    ../methodtable.cpp
     ../methodtablebuilder.cpp
     ../mscorlib.cpp
     ../stubcache.cpp
     ../mlinfo.cpp
-    ../DllImport.cpp
-    ../DllImportCallback.cpp
-    ../PEFile.cpp
-    ../PEFingerprint.cpp
-    ../PEImage.cpp
-    ../PEImageLayout.cpp
+    ../dllimport.cpp
+    ../dllimportcallback.cpp
+    ../pefile.cpp
+    ../pefingerprint.cpp
+    ../peimage.cpp
+    ../peimagelayout.cpp
     ../pendingload.cpp
-    ../Precode.cpp
+    ../precode.cpp
     ../olevariant.cpp
     ../security.cpp
     ../securitypolicy.cpp
-    ../securityAttributes.cpp
-    ../SecurityDeclarative.cpp
-    ../SecurityDeclarativeCache.cpp
-    ../SecurityDescriptor.cpp
-    ../SecurityDescriptorAppdomain.cpp
-    ../SecurityDescriptorAssembly.cpp
+    ../securityattributes.cpp
+    ../securitydeclarative.cpp
+    ../securitydeclarativecache.cpp
+    ../securitydescriptor.cpp
+    ../securitydescriptorappdomain.cpp
+    ../securitydescriptorassembly.cpp
     ../securitymeta.cpp
-    ../SecurityTransparentAssembly.cpp
+    ../securitytransparentassembly.cpp
     ../siginfo.cpp
-    ../SigFormat.cpp
-    ../SimpleRWLock.cpp
+    ../sigformat.cpp
+    ../simplerwlock.cpp
     ../spinlock.cpp
-    ../StackingAllocator.cpp
+    ../stackingallocator.cpp
     ../stubgen.cpp
     ../stublink.cpp
     ../typectxt.cpp
@@ -96,19 +94,11 @@ set(VM_CROSSGEN_SOURCES
     ../util.cpp
     ../vars.cpp
     ../zapsig.cpp
-    ../classcompat.cpp
-    ../COMtoCLRCall.cpp
-    ../CLRtoCOMCall.cpp
-    ../RuntimeCallableWrapper.cpp
-    ../WinRTHelpers.cpp
-    ../WinRTTypeNameConverter.cpp
-    ../DbgGcInfoDecoder.cpp
-    ../GcInfoDecoder.cpp
-    ../SHA1.cpp
-    ../amd64/StubLinkerAMD64.cpp
+    ../dbggcinfodecoder.cpp
+    ../gcinfodecoder.cpp
+    ../sha1.cpp
+    ../amd64/stublinkeramd64.cpp
     ../crossgencompile.cpp
-    ../CrossgenRoParseTypeName.cpp
-    ../CrossgenRoResolveNamespace.cpp
 )
 
 include_directories(BEFORE ..)
@@ -116,6 +106,19 @@ include_directories(${CLR_DIR}/src/gc)
 include_directories(../amd64)
 
 if (WIN32)
+  list(APPEND VM_CROSSGEN_SOURCES
+    ../classcompat.cpp
+    ../clrprivbinderwinrt.cpp
+    ../clrprivtypecachewinrt.cpp
+    ../comtoclrcall.cpp
+    ../clrtocomcall.cpp
+    ../crossgenroparsetypename.cpp
+    ../crossgenroresolvenamespace.cpp
+    ../runtimecallablewrapper.cpp
+    ../winrthelpers.cpp
+    ../winrttypenameconverter.cpp
+  )
+
   add_precompiled_header(common.h ../common.cpp VM_CROSSGEN_SOURCES)
   # mscorlib.cpp does not compile with precompiled header file
   set_source_files_properties(../mscorlib.cpp PROPERTIES COMPILE_FLAGS "/Y-")
index 99a43f1..a14c166 100644 (file)
@@ -30,7 +30,7 @@
 // Pull in some implementation files from other places in the tree
 //
 
-#include "..\..\dlls\mscoree\mscoree.cpp"
+#include "../../dlls/mscoree/mscoree.cpp"
 
 //---------------------------------------------------------------------------------------
 //
@@ -39,7 +39,7 @@
 
 #undef ExitProcess
 
-void CrossGenNotSupported(char * message)
+void CrossGenNotSupported(const char * message)
 {
     _ASSERTE(!"CrossGenNotSupported");
     fprintf(stderr, "Fatal error: %s\n", message);
index 770d83f..58702aa 100644 (file)
@@ -418,9 +418,9 @@ class Frame : public FrameBase
 
 public:
 
-#if defined(FEATURE_PAL) && !defined(DACCESS_COMPILE) 
+#if defined(FEATURE_PAL) && !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
     virtual ~Frame();
-#endif // FEATURE_PAL && !DACCESS_COMPILE 
+#endif // FEATURE_PAL && !DACCESS_COMPILE && !CROSSGEN_COMPILE
 
     //------------------------------------------------------------------------
     // Special characteristics of a frame
index 8af3fd9..335a9db 100644 (file)
@@ -93,7 +93,7 @@
 
 
 #if defined(CROSSGEN_COMPILE)
-static const PCHAR hlpNameTable[CORINFO_HELP_COUNT] = {
+static const char *const hlpNameTable[CORINFO_HELP_COUNT] = {
 #define JITHELPER(code, pfnHelper, sig) #code,
 #include "jithelpers.h"
 };
index fad8142..545d94f 100644 (file)
@@ -1444,14 +1444,12 @@ BOOL AppDomainLoaderAllocator::CanUnload()
     return m_Id.GetAppDomain()->CanUnload();
 }
 
-#ifndef CROSSGEN_COMPILE
 BOOL AssemblyLoaderAllocator::CanUnload()
 {
     LIMITED_METHOD_CONTRACT;
 
     return TRUE;
 }
-#endif // CROSSGEN_COMPILE
 
 BOOL LoaderAllocator::IsDomainNeutral()
 {
index 046ea9f..a9166ea 100644 (file)
@@ -491,10 +491,10 @@ public:
     virtual BOOL CanUnload();
     void SetDomainAssembly(DomainAssembly *pDomainAssembly) { WRAPPER_NO_CONTRACT; m_Id.SetDomainAssembly(pDomainAssembly); }
 
-#ifndef DACCESS_COMPILE
+#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
     virtual void RegisterHandleForCleanup(OBJECTHANDLE objHandle);
     virtual void CleanupHandles();
-#endif // !defined(DACCESS_COMPILE)
+#endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
 
 private:
     struct HandleCleanupListItem
index 4b20970..815071c 100644 (file)
@@ -4314,7 +4314,7 @@ void PEAssembly::VerifyStrongName()
 #endif // !defined(FEATURE_CORECLR)    
     else
     {
-#if defined(FEATURE_CORECLR) && !defined(CROSSGEN_COMPILE)
+#if defined(FEATURE_CORECLR) && (!defined(CROSSGEN_COMPILE) || defined(PLATFORM_UNIX))
         // Runtime policy on CoreCLR is to skip verification of ALL assemblies
         m_flags |= PEFILE_SKIP_MODULE_HASH_CHECKS;
         m_fStrongNameVerified = TRUE;
@@ -4367,7 +4367,7 @@ void PEAssembly::VerifyStrongName()
 #endif
         }
 
-#endif // FEATURE_CORECLR && !CROSSGEN_COMPILE
+#endif // FEATURE_CORECLR && (!CROSSGEN_COMPILE || PLATFORM_UNIX)
     }
 
     m_fStrongNameVerified = TRUE;
index 3014c96..ed9750d 100644 (file)
@@ -406,7 +406,7 @@ inline const BOOL PEImage::HasStrongNameSignature()
 
 #ifndef DACCESS_COMPILE
 
-#if !defined(FEATURE_CORECLR) || defined(CROSSGEN_COMPILE)
+#if !defined(FEATURE_CORECLR) || (defined(CROSSGEN_COMPILE) && !defined(PLATFORM_UNIX))
 inline const HRESULT PEImage::VerifyStrongName(DWORD* verifyOutputFlags)  
 {
     WRAPPER_NO_CONTRACT;
@@ -446,7 +446,7 @@ inline const HRESULT PEImage::VerifyStrongName(DWORD* verifyOutputFlags)
     }
     return hr;
 }    
-#endif // !FEATURE_CORECLR || CROSSGEN_COMPILE
+#endif // !FEATURE_CORECLR || (CROSSGEN_COMPILE && !PLATFORM_UNIX)
 
 #endif // !DACCESS_COMPILE
 
index 7864ad9..b77c33b 100644 (file)
@@ -236,6 +236,7 @@ public:
     }
 
     PTR_Frame GetFrame() { return NULL; }
+    void SetFrame(Frame *pFrame) { }
     DWORD CatchAtSafePoint() { return 0; }
     DWORD CatchAtSafePointOpportunistic() { return 0; }
 
index 1a5cf86..5462659 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "common.h"
 
-#include "NativeFormatWriter.h"
+#include "nativeformatwriter.h"
 
 namespace NativeFormat
 {
index 1d20118..7df102a 100644 (file)
@@ -222,6 +222,7 @@ void ZapVersionResource::Save(ZapWriter * pZapWriter)
 
 void ZapImage::CopyWin32VersionResource()
 {
+#ifndef FEATURE_PAL
     // Copy the version resource over so it is easy to see in the dumps where the ngened module came from
     COUNT_T cbResourceData;
     PVOID pResourceData = m_ModuleDecoder.GetWin32Resource(MAKEINTRESOURCE(1), RT_VERSION, &cbResourceData);
@@ -237,6 +238,7 @@ void ZapImage::CopyWin32VersionResource()
     m_pWin32ResourceSection->Place(pVersionData);
 
     SetDirectoryEntry(IMAGE_DIRECTORY_ENTRY_RESOURCE, m_pWin32ResourceSection);
+#endif
 }
 #undef MAKEINTRESOURCE
 
index 67bad6d..3d673bf 100644 (file)
@@ -1863,6 +1863,9 @@ void ZapImage::OutputTables()
         // 512 byte alignment, since there is no plan to compress data partitions.
         SetFileAlignment(0x1000);
     }
+#elif defined(FEATURE_PAL)
+    // PAL library requires native image sections to align to page bounaries.
+    SetFileAlignment(0x1000);
 #endif
 }
 
@@ -4097,7 +4100,7 @@ HRESULT ZapImage::LocateProfileData()
         return S_FALSE;
     }
 
-#if !defined(FEATURE_CORECLR) || defined(FEATURE_WINDOWSPHONE)
+#if !defined(FEATURE_PAL)
     //
     // See if there's profile data in the resource section of the PE
     //
index 4867fc6..22675d8 100644 (file)
@@ -341,7 +341,7 @@ ZapGenericSignature * ZapImportTable::GetGenericSignature(PVOID signature, BOOL
     void * pMemory = new (m_pImage->GetHeap()) BYTE[cbAllocSize.Value()];
 
     pGenericSignature = new (pMemory) ZapGenericSignature(cbSig);
-    memcpy(pGenericSignature + 1, pSig, cbSig);
+    memcpy((void *)(pGenericSignature + 1), pSig, cbSig);
 
     m_genericSignatures.Add(pGenericSignature);
 
@@ -421,7 +421,7 @@ void ZapImportSectionsTable::Save(ZapWriter * pZapWriter)
 
 
 ZapImportSectionSignatures::ZapImportSectionSignatures(ZapImage * pImage, ZapVirtualSection * pImportSection, ZapVirtualSection * pGCSection)
-    : m_pImage(pImage), m_pImportSection(pImportSection)
+    : m_pImportSection(pImportSection), m_pImage(pImage)
 {
     if (pGCSection != NULL)
     {
index 6b03028..ca2a67b 100644 (file)
@@ -29,7 +29,9 @@ class MethodDesc;
 class MethodTable;
 #include "CompactLayoutWriter.h"
 #endif
+#ifdef MDIL
 #include "TritonStress.h"
+#endif
 
 ZapInfo::ZapInfo(ZapImage * pImage, mdMethodDef md, CORINFO_METHOD_HANDLE handle, CORINFO_MODULE_HANDLE module, unsigned methodProfilingDataFlags)
     : m_pImage(pImage),
index 56835ca..1985f83 100644 (file)
@@ -24,7 +24,9 @@
 #endif
 
 #include "clr/fs/dir.h"
+#ifdef FEATURE_FUSION
 #include "ngenparser.inl"
+#endif
 
 /* --------------------------------------------------------------------------- *
  * Error Macros
@@ -940,8 +942,8 @@ void Zapper::InitEE(BOOL fForceDebug, BOOL fForceProfile, BOOL fForceInstrument)
     {
         // Allow a second jit to be loaded into the system.
         // 
-        LPWSTR altName;
-        hr = CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_AltJitName, &altName);
+        LPCWSTR altName;
+        hr = CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_AltJitName, (LPWSTR*)&altName);
         if (FAILED(hr))
         {
             Error(W("Unable to load alternative Jit Compiler\r\n"));
@@ -3504,6 +3506,7 @@ void Zapper::DefineOutputAssembly(SString& strAssemblyName, ULONG * pHashAlgId)
         ThrowHR(HRESULT_FROM_WIN32(ERROR_INVALID_NAME));
     }
 
+#ifndef PLATFORM_UNIX
     //
     // We always need a hash since our assembly module is separate from the manifest.
     // Use MD5 by default.
@@ -3511,6 +3514,7 @@ void Zapper::DefineOutputAssembly(SString& strAssemblyName, ULONG * pHashAlgId)
 
     if (hashAlgId == 0)
         hashAlgId = CALG_MD5;
+#endif
 
     mdAssembly tkEmitAssembly;
     IfFailThrow(m_pAssemblyEmit->DefineAssembly(pbPublicKey, cbPublicKey, hashAlgId,
index bea40c3..2d6859e 100644 (file)
@@ -352,7 +352,7 @@ ZapBlobWithRelocs * ZapBlobWithRelocs::NewBlob(ZapWriter * pWriter, PVOID pData,
     ZapBlobWithRelocs * pZapBlobWithRelocs = new (pMemory) ZapBlobWithRelocs(cbSize);
     
     if (pData != NULL)
-        memcpy(pZapBlobWithRelocs + 1, pData, cbSize);
+        memcpy((void*)(pZapBlobWithRelocs + 1), pData, cbSize);
 
     return pZapBlobWithRelocs;
 }
@@ -383,7 +383,7 @@ public:
         ZapAlignedBlobWithRelocsConst<alignment> * pZapBlob = new (pMemory) ZapAlignedBlobWithRelocsConst<alignment>(cbSize);
 
         if (pData != NULL)
-            memcpy(pZapBlob + 1, pData, cbSize);
+            memcpy((void*)(pZapBlob + 1), pData, cbSize);
 
         return pZapBlob;
     }
index 6ad554e..09eb8bb 100644 (file)
@@ -628,7 +628,7 @@ ZapBlob * ZapBlob::NewBlob(ZapWriter * pWriter, PVOID pData, SIZE_T cbSize)
     ZapBlob * pZapBlob = new (pMemory) ZapBlob(cbSize);
     
     if (pData != NULL)
-        memcpy(pZapBlob + 1, pData, cbSize);
+        memcpy((void*)(pZapBlob + 1), pData, cbSize);
 
     return pZapBlob;
 }
@@ -659,7 +659,7 @@ public:
         ZapAlignedBlobConst<alignment> * pZapBlob = new (pMemory) ZapAlignedBlobConst<alignment>(cbSize);
 
         if (pData != NULL)
-            memcpy(pZapBlob + 1, pData, cbSize);
+            memcpy((void *)(pZapBlob + 1), pData, cbSize);
 
         return pZapBlob;
     }