diff --git a/gdb/NEWS b/gdb/NEWS
index 7c8cf9af4c2..eef1924c9f0 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -97,6 +97,12 @@ AArch64 MinGW                   aarch64-*-mingw*
 
 * New commands
 
+maintenance set/show gcore xml-target-description
+  With this command you can control whether or not the generate-core-file
+  command emits the NT_GDB_TDESC note.  This is mainly useful for testing
+  how GDB handles corefiles without this note, as not all software that
+  creates corefiles generates it.
+
 set local-environment
 show local-environment
 unset local-environment
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index a698b2b8451..636fd0d6b1f 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -42077,6 +42077,13 @@ buffer.
 Control whether @value{GDBN} will skip PAD packets when computing the
 packet history.
 
+@kindex maint set gcore xml-target-description
+@item maint set gcore xml-target-description
+@kindex maint show gcore xml-target-description
+@item maint show gcore xml-target-description
+Control whether @value{GDBN} will create the NT_GDB_TDESC note when using
+the @samp{generate-core-file} command.
+
 @kindex maint info jit
 @item maint info jit
 Print information about JIT code objects loaded in the current inferior.
diff --git a/gdb/elf-none-tdep.c b/gdb/elf-none-tdep.c
index 0d063038f5e..f874ba9d4b9 100644
--- a/gdb/elf-none-tdep.c
+++ b/gdb/elf-none-tdep.c
@@ -109,13 +109,15 @@ elf_none_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd,
 					     &note_data, note_size);
     }
 
-
-  /* Include the target description when possible.  Some architectures
-     allow for per-thread gdbarch so we should really be emitting a tdesc
-     per-thread, however, we don't currently support reading in a
-     per-thread tdesc, so just emit the tdesc for the signalled thread.  */
-  gdbarch = target_thread_architecture (signalled_thr->ptid);
-  gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+  if (maint_gcore_emit_xml_tdesc)
+    {
+      /* Include the target description when possible.  Some architectures
+	 allow for per-thread gdbarch so we should really be emitting a tdesc
+	 per-thread, however, we don't currently support reading in a
+	 per-thread tdesc, so just emit the tdesc for the signalled thread.  */
+      gdbarch = target_thread_architecture (signalled_thr->ptid);
+      gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+    }
 
   return note_data;
 }
diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c
index 419f935ea72..d77395dbb45 100644
--- a/gdb/fbsd-tdep.c
+++ b/gdb/fbsd-tdep.c
@@ -762,12 +762,15 @@ fbsd_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
 	return NULL;
     }
 
-  /* Include the target description when possible.  Some architectures
-     allow for per-thread gdbarch so we should really be emitting a tdesc
-     per-thread, however, we don't currently support reading in a
-     per-thread tdesc, so just emit the tdesc for the signalled thread.  */
-  gdbarch = target_thread_architecture (signalled_thr->ptid);
-  gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+  if (maint_gcore_emit_xml_tdesc)
+    {
+      /* Include the target description when possible.  Some architectures
+	 allow for per-thread gdbarch so we should really be emitting a tdesc
+	 per-thread, however, we don't currently support reading in a
+	 per-thread tdesc, so just emit the tdesc for the signalled thread.  */
+      gdbarch = target_thread_architecture (signalled_thr->ptid);
+      gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+    }
 
   return note_data;
 }
diff --git a/gdb/gcore.c b/gdb/gcore.c
index e50115370c7..03876969ae9 100644
--- a/gdb/gcore.c
+++ b/gdb/gcore.c
@@ -28,6 +28,7 @@
 #include "completer.h"
 #include "gcore.h"
 #include "cli/cli-decode.h"
+#include "cli/cli-cmds.h"
 #include <fcntl.h>
 #include "regcache.h"
 #include "regset.h"
@@ -919,6 +920,24 @@ gcore_find_signalled_thread ()
   return nullptr;
 }
 
+/* When true, emit NT_GDB_TDESC.  */
+bool maint_gcore_emit_xml_tdesc = true;
+
+/* Command lists for gcore maintenance commands.  */
+struct cmd_list_element *maint_gcore_cmdlist;
+struct cmd_list_element *maint_gcore_set_cmdlist;
+struct cmd_list_element *maint_gcore_show_cmdlist;
+
+/* "Show" callback for "maint set gcore xml-target-description".  */
+static void
+show_gcore_xml_target_description (struct ui_file *file, int from_tty,
+				   struct cmd_list_element *c,
+				   const char *value)
+{
+  gdb_printf (file, _("Write NT_GDB_TDESC note into corefiles: %s.\n"),
+	      value);
+}
+
 INIT_GDB_FILE (gcore)
 {
   cmd_list_element *generate_core_file_cmd
@@ -928,4 +947,25 @@ Usage: generate-core-file [FILENAME]\n\
 Argument is optional filename.  Default filename is 'core.PROCESS_ID'."));
 
   add_com_alias ("gcore", generate_core_file_cmd, class_files, 1);
+
+  add_basic_prefix_cmd ("gcore", class_maintenance,
+			_("gcore maintenance commands."),
+			&maint_gcore_cmdlist, 0, &maintenancelist);
+
+  add_setshow_prefix_cmd ("gcore", class_maintenance,
+			  _("Set gcore specific variables."),
+			  _("Show gcore specific variables."),
+			  &maint_gcore_set_cmdlist, &maint_gcore_show_cmdlist,
+			  &maintenance_set_cmdlist, &maintenance_show_cmdlist);
+
+  add_setshow_boolean_cmd ("xml-target-description", class_obscure,
+			    &maint_gcore_emit_xml_tdesc, _("\
+Set whether gcore emits a xml-target-description."), _("\
+Show whether gore emits a xml-target-description."), _("\
+By default, gcore emits the note NT_GDB_TDESC.\n\
+Disabling this setting will cause gcore to no longer emit this note."),
+			    nullptr,
+			    show_gcore_xml_target_description,
+			    &maint_gcore_set_cmdlist,
+			    &maint_gcore_show_cmdlist);
 }
diff --git a/gdb/gcore.h b/gdb/gcore.h
index 2431e123b60..2481bf0decc 100644
--- a/gdb/gcore.h
+++ b/gdb/gcore.h
@@ -37,4 +37,7 @@ extern bool objfile_find_memory_regions (struct target_ops *self,
 
 extern thread_info *gcore_find_signalled_thread ();
 
+/* When true, emit NT_GDB_TDESC.  */
+extern bool maint_gcore_emit_xml_tdesc;
+
 #endif /* GDB_GCORE_H */
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index a7381677498..6bc4e55aa56 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -2495,12 +2495,15 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
   /* File mappings.  */
   linux_make_mappings_corefile_notes (gdbarch, obfd, note_data, note_size);
 
-  /* Include the target description when possible.  Some architectures
-     allow for per-thread gdbarch so we should really be emitting a tdesc
-     per-thread, however, we don't currently support reading in a
-     per-thread tdesc, so just emit the tdesc for the signalled thread.  */
-  gdbarch = target_thread_architecture (signalled_thr->ptid);
-  gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+  if (maint_gcore_emit_xml_tdesc)
+    {
+      /* Include the target description when possible.  Some architectures
+	 allow for per-thread gdbarch so we should really be emitting a tdesc
+	 per-thread, however, we don't currently support reading in a
+	 per-thread tdesc, so just emit the tdesc for the signalled thread.  */
+      gdbarch = target_thread_architecture (signalled_thr->ptid);
+      gcore_elf_make_tdesc_note (gdbarch, obfd, &note_data, note_size);
+    }
 
   return note_data;
 }
