Fix xdebug (#5309)
authorUri Simchoni <urisimchoni@users.noreply.github.com>
Tue, 8 Aug 2017 20:38:25 +0000 (23:38 +0300)
committerZoltan Varga <vargaz@gmail.com>
Tue, 8 Aug 2017 20:38:25 +0000 (16:38 -0400)
* [mini] fix xdebug null pointer dereferencing

Some trampolines are nameless, avoid crashing when generating their
debug info.

This change is released under the MIT license.

* [mini]: image-writer - move definition of USE_BIN_WRITER to header file

USE_BIN_WRITER is being used by xdebug for conditional compilation.

This change is released under the MIT license.

* [mini]: xdebug - obtain definition of USE_BIN_WRITER from header file

This re-enables xdebug on supported platforms.

This change is released under the MIT license.

mono/mini/image-writer.c
mono/mini/image-writer.h
mono/mini/xdebug.c

index b5cf20dfde120e02d353ad7e69e64c3b82788dd6..97ade6b06f10f397386f4d14140010f138b8309d 100644 (file)
 #define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1)))
 #define ROUND_DOWN(VALUE,SIZE) ((VALUE) & ~((SIZE) - 1))
 
-#if defined(TARGET_AMD64) && !defined(HOST_WIN32) && !defined(__APPLE__)
-#define USE_ELF_WRITER 1
-#define USE_ELF_RELA 1
-#endif
-
-#if defined(TARGET_X86) && !defined(HOST_WIN32) && !defined(__APPLE__)
-#define USE_ELF_WRITER 1
-#endif
-
-#if defined(TARGET_ARM) && !defined(TARGET_MACH) && !defined(HOST_WIN32)
-//#define USE_ELF_WRITER 1
-#endif
-
-#if defined(__mips__)
-#define USE_ELF_WRITER 1
-#endif
-
-#if defined(TARGET_X86) && defined(__APPLE__)
-//#define USE_MACH_WRITER
-#endif
-
-#if defined(USE_ELF_WRITER) || defined(USE_MACH_WRITER)
-#define USE_BIN_WRITER 1
-#endif
-
 #ifdef USE_BIN_WRITER
 
 typedef struct _BinSymbol BinSymbol;
index 3da1717d3e3d56e7791748e64c1bf88b302bed3c..0c34246422e8b90c7c397a1647be7d7b0d962bb0 100644 (file)
 
 typedef struct _MonoImageWriter MonoImageWriter;
 
+#if defined(TARGET_AMD64) && !defined(HOST_WIN32) && !defined(__APPLE__)
+#define USE_ELF_WRITER 1
+#define USE_ELF_RELA 1
+#endif
+
+#if defined(TARGET_X86) && !defined(HOST_WIN32) && !defined(__APPLE__)
+#define USE_ELF_WRITER 1
+#endif
+
+#if defined(TARGET_ARM) && !defined(TARGET_MACH) && !defined(HOST_WIN32)
+//#define USE_ELF_WRITER 1
+#endif
+
+#if defined(__mips__)
+#define USE_ELF_WRITER 1
+#endif
+
+#if defined(TARGET_X86) && defined(__APPLE__)
+//#define USE_MACH_WRITER
+#endif
+
+#if defined(USE_ELF_WRITER) || defined(USE_MACH_WRITER)
+#define USE_BIN_WRITER 1
+#endif
+
 /* Relocation types */
 #define R_ARM_CALL 28
 #define R_ARM_JUMP24 29
index ee8f4f79061c26081ef606cd010e4afd5d79bc0e..7d88f7da640f9ed10b62d915ac05ed5a81b6a4f2 100644 (file)
@@ -28,7 +28,6 @@
 #include <glib.h>
 #include "mini.h"
 
-#if !defined(DISABLE_AOT) && !defined(DISABLE_JIT) && USE_BIN_WRITER
 #include <sys/types.h>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -50,6 +49,9 @@
 #include <sys/stat.h>
 
 #include "image-writer.h"
+
+#if !defined(DISABLE_AOT) && !defined(DISABLE_JIT) && USE_BIN_WRITER
+
 #include "dwarfwriter.h"
 
 #include "mono/utils/mono-compiler.h"
@@ -339,6 +341,10 @@ mono_save_xdebug_info (MonoCompile *cfg)
 void
 mono_save_trampoline_xdebug_info (MonoTrampInfo *info)
 {
+       const char *info_name = info->name;
+       if (info_name == NULL)
+               info_name = "";
+
        if (use_gdb_interface) {
                MonoImageWriter *w;
                MonoDwarfWriter *dw;
@@ -348,7 +354,7 @@ mono_save_trampoline_xdebug_info (MonoTrampInfo *info)
 
                xdebug_begin_emit (&w, &dw);
 
-               mono_dwarf_writer_emit_trampoline (dw, info->name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
+               mono_dwarf_writer_emit_trampoline (dw, info_name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
 
                xdebug_end_emit (w, dw, NULL);
                
@@ -358,7 +364,7 @@ mono_save_trampoline_xdebug_info (MonoTrampInfo *info)
                        return;
 
                mono_loader_lock_if_inited ();
-               mono_dwarf_writer_emit_trampoline (xdebug_writer, info->name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
+               mono_dwarf_writer_emit_trampoline (xdebug_writer, info_name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
                fflush (xdebug_fp);
                mono_loader_unlock_if_inited ();
        }