Fix embedded coreclr detection in corhost.cpp (#80294)
authorJan Vorlicek <janvorli@microsoft.com>
Fri, 6 Jan 2023 17:26:31 +0000 (18:26 +0100)
committerGitHub <noreply@github.com>
Fri, 6 Jan 2023 17:26:31 +0000 (18:26 +0100)
The `CORECLR_EMBEDDED` define that is used in corhost.cpp to detect
whether the current host has coreclr and some other native libraries
embedded or not doesn't work. The reason is that corhost.cpp is not
compiled separately for the cases of embedded and non-embedded coreclr.

The proper way is to check the `g_coreclr_embedded` global variable
that is defined in the ceemain.cpp, which is compiled separately for
those two cases.

While we could also make the corhost.cpp build twice, it would be
a waste of time.

src/coreclr/dlls/mscoree/exports.cpp
src/coreclr/vm/ceemain.h
src/coreclr/vm/corhost.cpp

index 8b96511..1f93010 100644 (file)
@@ -14,6 +14,7 @@
 #include <utilcode.h>
 #include <corhost.h>
 #include <configuration.h>
+#include "../../vm/ceemain.h"
 #ifdef FEATURE_GDBJIT
 #include "../../vm/gdbjithelpers.h"
 #endif // FEATURE_GDBJIT
 // Holder for const wide strings
 typedef NewArrayHolder<const WCHAR> ConstWStringHolder;
 
-// Specifies whether coreclr is embedded or standalone
-extern bool g_coreclr_embedded;
-
-// Specifies whether hostpolicy is embedded in executable or standalone
-extern bool g_hostpolicy_embedded;
-
 // Holder for array of wide strings
 class ConstWStringArrayHolder : public NewArrayHolder<LPCWSTR>
 {
index 688f41c..1404a5a 100644 (file)
@@ -54,5 +54,10 @@ INT32 GetLatchedExitCode (void);
 // Stronger than IsGCHeapInitialized
 BOOL IsGarbageCollectorFullyInitialized();
 
+// Specifies whether coreclr is embedded or standalone
+extern bool g_coreclr_embedded;
+
+// Specifies whether hostpolicy is embedded in executable or standalone
+extern bool g_hostpolicy_embedded;
 
 #endif
index 2877e85..d7f3411 100644 (file)
@@ -630,23 +630,26 @@ HRESULT CorHost2::CreateAppDomainWithManager(
             sAppPaths));
     }
 
-#if defined(TARGET_UNIX) && !defined(CORECLR_EMBEDDED)
-    // Check if the current code is executing in the single file host or in libcoreclr.so. The libSystem.Native is linked
-    // into the single file host, so we need to check only when this code is in libcoreclr.so.
-    // Preload the libSystem.Native.so/dylib to detect possible problems with loading it early
-    EX_TRY
-    {
-        NativeLibrary::LoadLibraryByName(W("libSystem.Native"), SystemDomain::SystemAssembly(), FALSE, 0, TRUE);
-    }
-    EX_HOOK
+#if defined(TARGET_UNIX)
+    if (!g_coreclr_embedded)
     {
-        Exception *ex = GET_EXCEPTION();
-        SString err;
-        ex->GetMessage(err);
-        LogErrorToHost("Error message: %s", err.GetUTF8());
+        // Check if the current code is executing in the single file host or in libcoreclr.so. The libSystem.Native is linked
+        // into the single file host, so we need to check only when this code is in libcoreclr.so.
+        // Preload the libSystem.Native.so/dylib to detect possible problems with loading it early
+        EX_TRY
+        {
+            NativeLibrary::LoadLibraryByName(W("libSystem.Native"), SystemDomain::SystemAssembly(), FALSE, 0, TRUE);
+        }
+        EX_HOOK
+        {
+            Exception *ex = GET_EXCEPTION();
+            SString err;
+            ex->GetMessage(err);
+            LogErrorToHost("Error message: %s", err.GetUTF8());
+        }
+        EX_END_HOOK;
     }
-    EX_END_HOOK;
-#endif // TARGET_UNIX && !CORECLR_EMBEDDED
+#endif // TARGET_UNIX
 
     *pAppDomainID=DefaultADID;