Blame SOURCES/gdb-6.6-buildid-locate-core-as-arg.patch

6240d7
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
6240d7
From: Fedora GDB patches <invalid@email.com>
6240d7
Date: Fri, 27 Oct 2017 21:07:50 +0200
6240d7
Subject: gdb-6.6-buildid-locate-core-as-arg.patch
6240d7
6240d7
;;=push+jan
6240d7
6240d7
http://sourceware.org/ml/gdb-patches/2010-01/msg00558.html
6240d7
6240d7
[ Fixed up since the mail.  ]
6240d7
6240d7
On Thu, 21 Jan 2010 18:17:15 +0100, Doug Evans wrote:
6240d7
> Not an exhaustive list, but if we go down the path of converting "gdb
6240d7
> corefile" to "gdb -c corefile", then we also need to think about "file
6240d7
> corefile" being converted to "core corefile" [or "target core
6240d7
> corefile", "core" is apparently deprecated in favor of "target core"]
6240d7
> and "target exec corefile" -> "target core corefile".  Presumably
6240d7
> "file corefile" (and "target exec corefile") would discard the
6240d7
> currently selected executable.  But maybe not.  Will that be confusing
6240d7
> for users?  I don't know.
6240d7
6240d7
While thinking about it overriding some GDB _commands_ was not my intention.
6240d7
6240d7
There is a general assumption if I have a shell COMMAND and some FILE I can do
6240d7
$ COMMAND FILE
6240d7
and COMMAND will appropriately load the FILE.
6240d7
6240d7
FSF GDB currently needs to specify also the executable file for core files
6240d7
which already inhibits this intuitive expectation.  OTOH with the build-id
6240d7
locating patch which could allow such intuitive start  notneeding the
6240d7
executable file.  Still it currently did not work due to the required "-c":
6240d7
$ COMMAND -c COREFILE
6240d7
6240d7
Entering "file", "core-file" or "attach" commands is already explicit enough
6240d7
so that it IMO should do what the command name says without any
6240d7
autodetections.  The second command line argument
6240d7
(captured_main->pid_or_core_arg) is also autodetected (for PID or CORE) but
6240d7
neither "attach" accepts a core file nor "core-file" accepts a PID.
6240d7
6240d7
The patch makes sense only with the build-id patchset so this is not submit
6240d7
for FSF GDB inclusion yet.  I am fine with your patch (+/- Hui Zhu's pending
6240d7
bfd_check_format_matches) as the patch below is its natural extension.
6240d7
6240d7
Sorry for the delay,
6240d7
Jan
6240d7
6240d7
2010-01-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
6240d7
6240d7
	* exceptions.h (enum errors <IS_CORE_ERROR>): New.
6240d7
	* exec.c: Include exceptions.h.
6240d7
	(exec_file_attach <bfd_core>): Call throw_error (IS_CORE_ERROR, ...).
6240d7
	* main.c (exec_or_core_file_attach): New.
6240d7
	(captured_main <optind < argc>): Set also corearg.
6240d7
	(captured_main <strcmp (execarg, symarg) == 0>): New variable func.
6240d7
	Call exec_or_core_file_attach if COREARG matches EXECARG.  Call
6240d7
	symbol_file_add_main only if CORE_BFD remained NULL.
6240d7
6240d7
Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html
6240d7
2010-01-20  Doug Evans  <dje@google.com>
6240d7
6240d7
	* exec.c (exec_file_attach): Print a more useful error message if the
6240d7
	user did "gdb core".
6240d7
6240d7
diff --git a/gdb/common/common-exceptions.h b/gdb/common/common-exceptions.h
6240d7
--- a/gdb/common/common-exceptions.h
6240d7
+++ b/gdb/common/common-exceptions.h
6240d7
@@ -104,6 +104,9 @@ enum errors {
6240d7
      "_ERROR" is appended to the name.  */
6240d7
   MAX_COMPLETIONS_REACHED_ERROR,
6240d7
 
6240d7
+  /* Attempt to load a core file as executable.  */
6240d7
+  IS_CORE_ERROR,
6240d7
+
6240d7
   /* Add more errors here.  */
6240d7
   NR_ERRORS
6240d7
 };
6240d7
diff --git a/gdb/exec.c b/gdb/exec.c
6240d7
--- a/gdb/exec.c
6240d7
+++ b/gdb/exec.c
6240d7
@@ -36,6 +36,7 @@
6240d7
 #include "gdb_bfd.h"
6240d7
 #include "gcore.h"
6240d7
 #include "source.h"
6240d7
+#include "exceptions.h"
6240d7
 
6240d7
 #include <fcntl.h>
6240d7
 #include "readline/readline.h"
6240d7
@@ -355,12 +356,27 @@ exec_file_attach (const char *filename, int from_tty)
6240d7
 
6240d7
       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
6240d7
 	{
6240d7
+	  int is_core;
6240d7
+
6240d7
+	  /* If the user accidentally did "gdb core", print a useful
6240d7
+	     error message.  Check it only after bfd_object has been checked as
6240d7
+	     a valid executable may get recognized for example also as
6240d7
+	     "trad-core".  */
6240d7
+	  is_core = bfd_check_format (exec_bfd, bfd_core);
6240d7
+
6240d7
 	  /* Make sure to close exec_bfd, or else "run" might try to use
6240d7
 	     it.  */
6240d7
 	  exec_close ();
6240d7
-	  error (_("\"%s\": not in executable format: %s"),
6240d7
-		 scratch_pathname,
6240d7
-		 gdb_bfd_errmsg (bfd_get_error (), matching).c_str ());
6240d7
+
6240d7
+	  if (is_core != 0)
6240d7
+	    throw_error (IS_CORE_ERROR,
6240d7
+		   _("\"%s\" is a core file.\n"
6240d7
+		     "Please specify an executable to debug."),
6240d7
+		   scratch_pathname);
6240d7
+	  else
6240d7
+	    error (_("\"%s\": not in executable format: %s"),
6240d7
+		   scratch_pathname,
6240d7
+		   gdb_bfd_errmsg (bfd_get_error (), matching).c_str ());
6240d7
 	}
6240d7
 
6240d7
       if (build_section_table (exec_bfd, &sections, &sections_end))
6240d7
diff --git a/gdb/main.c b/gdb/main.c
6240d7
--- a/gdb/main.c
6240d7
+++ b/gdb/main.c
6240d7
@@ -448,6 +448,35 @@ struct cmdarg
6240d7
   char *string;
6240d7
 };
6240d7
 
6240d7
+/* Call exec_file_attach.  If it detected FILENAME is a core file call
6240d7
+   core_file_command.  Print the original exec_file_attach error only if
6240d7
+   core_file_command failed to find a matching executable.  */
6240d7
+
6240d7
+static void
6240d7
+exec_or_core_file_attach (const char *filename, int from_tty)
6240d7
+{
6240d7
+  gdb_assert (exec_bfd == NULL);
6240d7
+
6240d7
+  TRY
6240d7
+    {
6240d7
+      exec_file_attach (filename, from_tty);
6240d7
+    }
6240d7
+  CATCH (e, RETURN_MASK_ALL)
6240d7
+    {
6240d7
+      if (e.error == IS_CORE_ERROR)
6240d7
+	{
6240d7
+	  core_file_command ((char *) filename, from_tty);
6240d7
+
6240d7
+	  /* Iff the core file found its executable suppress the error message
6240d7
+	     from exec_file_attach.  */
6240d7
+	  if (exec_bfd != NULL)
6240d7
+	    return;
6240d7
+	}
6240d7
+      throw_exception (e);
6240d7
+    }
6240d7
+  END_CATCH
6240d7
+}
6240d7
+
6240d7
 static void
6240d7
 captured_main_1 (struct captured_main_args *context)
6240d7
 {
6240d7
@@ -893,6 +922,8 @@ captured_main_1 (struct captured_main_args *context)
6240d7
 	{
6240d7
 	  symarg = argv[optind];
6240d7
 	  execarg = argv[optind];
6240d7
+	  if (optind + 1 == argc && corearg == NULL)
6240d7
+	    corearg = argv[optind];
6240d7
 	  optind++;
6240d7
 	}
6240d7
 
6240d7
@@ -1043,12 +1074,25 @@ captured_main_1 (struct captured_main_args *context)
6240d7
       && symarg != NULL
6240d7
       && strcmp (execarg, symarg) == 0)
6240d7
     {
6240d7
+      catch_command_errors_const_ftype *func;
6240d7
+
6240d7
+      /* Call exec_or_core_file_attach only if the file was specified as
6240d7
+	 a command line argument (and not an a command line option).  */
6240d7
+      if (corearg != NULL && strcmp (corearg, execarg) == 0)
6240d7
+	{
6240d7
+	  func = exec_or_core_file_attach;
6240d7
+	  corearg = NULL;
6240d7
+	}
6240d7
+      else
6240d7
+	func = exec_file_attach;
6240d7
+
6240d7
       /* The exec file and the symbol-file are the same.  If we can't
6240d7
          open it, better only print one error message.
6240d7
-         catch_command_errors returns non-zero on success!  */
6240d7
-      ret = catch_command_errors (exec_file_attach, execarg,
6240d7
-				  !batch_flag);
6240d7
-      if (ret != 0)
6240d7
+         catch_command_errors returns non-zero on success!
6240d7
+	 Do not load EXECARG as a symbol file if it has been already processed
6240d7
+	 as a core file.  */
6240d7
+      ret = catch_command_errors (func, execarg, !batch_flag);
6240d7
+      if (ret != 0 && core_bfd == NULL)
6240d7
 	ret = catch_command_errors (symbol_file_add_main_adapter,
6240d7
 				    symarg, !batch_flag);
6240d7
     }