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

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