[pedump] Fix running with cooperative GC
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 3 May 2017 21:34:50 +0000 (17:34 -0400)
committerAleksey Kliger (λgeek) <akliger@gmail.com>
Thu, 4 May 2017 14:01:54 +0000 (10:01 -0400)
This is the pedump analog of 9f5115a343213e7ce27b197c96274cc611a05284
which fixed monodis under coop.

tools/pedump/pedump.c

index 072b535f299e50eeb30e684b19c3ca1dd5c81e90..829cda2bdf175fb13137240aa94b0d079346b931 100644 (file)
@@ -26,6 +26,7 @@
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/verify-internals.h>
 #include <mono/metadata/marshal.h>
+#include <mono/metadata/w32handle.h>
 #include "mono/utils/mono-digest.h"
 #include <mono/utils/mono-mmap.h>
 #include <mono/utils/mono-counters.h>
@@ -616,6 +617,11 @@ pedump_assembly_search_hook (MonoAssemblyName *aname, gpointer user_data)
        return NULL;
 }
 
+static void
+thread_state_init (MonoThreadUnwindState *ctx)
+{
+}
+
 #define VALID_ONLY_FLAG 0x08000000
 #define VERIFY_CODE_ONLY MONO_VERIFY_ALL + 1 
 #define VERIFY_METADATA_ONLY VERIFY_CODE_ONLY + 1
@@ -632,6 +638,7 @@ main (int argc, char *argv [])
        const char *flag_desc [] = {"error", "warn", "cls", "all", "code", "fail-on-verifiable", "non-strict", "valid-only", "metadata", "partial-md", NULL};
        guint flag_vals [] = {MONO_VERIFY_ERROR, MONO_VERIFY_WARNING, MONO_VERIFY_CLS, MONO_VERIFY_ALL, VERIFY_CODE_ONLY, MONO_VERIFY_FAIL_FAST, MONO_VERIFY_NON_STRICT, VALID_ONLY_FLAG, VERIFY_METADATA_ONLY, VERIFY_PARTIAL_METADATA, 0};
        int i, verify_flags = MONO_VERIFY_REPORT_ALL_ERRORS, run_new_metadata_verifier = 0;
+       MonoThreadInfoRuntimeCallbacks ticallbacks;
        
        for (i = 1; i < argc; i++){
                if (argv [i][0] != '-'){
@@ -659,11 +666,19 @@ main (int argc, char *argv [])
 #endif
        mono_counters_init ();
        mono_tls_init_runtime_keys ();
+       memset (&ticallbacks, 0, sizeof (ticallbacks));
+       ticallbacks.thread_state_init = thread_state_init;
+#ifndef HOST_WIN32
+       mono_w32handle_init ();
+#endif
+       mono_threads_runtime_init (&ticallbacks);
+
        mono_metadata_init ();
        mono_images_init ();
        mono_assemblies_init ();
        mono_loader_init ();
  
+
        if (verify_pe) {
                char *tok = strtok (flags, ",");