| Index: gdb/corelow.c
|
| diff --git a/gdb/corelow.c b/gdb/corelow.c
|
| index bbfb8ee51fad9fa4de3c345880f9979b23e1802c..dd625604c935b2642c2be40c1dd870f431ad4eb9 100644
|
| --- a/gdb/corelow.c
|
| +++ b/gdb/corelow.c
|
| @@ -46,8 +46,6 @@
|
| #include "filenames.h"
|
| #include "progspace.h"
|
| #include "objfiles.h"
|
| -#include "wrapper.h"
|
| -
|
|
|
| #ifndef O_LARGEFILE
|
| #define O_LARGEFILE 0
|
| @@ -77,9 +75,6 @@ struct gdbarch *core_gdbarch = NULL;
|
| unix child targets. */
|
| static struct target_section_table *core_data;
|
|
|
| -/* True if we needed to fake the pid of the loaded core inferior. */
|
| -static int core_has_fake_pid = 0;
|
| -
|
| static void core_files_info (struct target_ops *);
|
|
|
| static struct core_fns *sniff_core_bfd (bfd *);
|
| @@ -131,8 +126,7 @@ default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
|
| }
|
|
|
| /* Walk through the list of core functions to find a set that can
|
| - handle the core file open on ABFD. Default to the first one in the
|
| - list if nothing matches. Returns pointer to set that is
|
| + handle the core file open on ABFD. Returns pointer to set that is
|
| selected. */
|
|
|
| static struct core_fns *
|
| @@ -161,15 +155,9 @@ sniff_core_bfd (bfd *abfd)
|
| bfd_get_filename (abfd), matches);
|
| }
|
| else if (matches == 0)
|
| - {
|
| - warning (_("\"%s\": no core file handler "
|
| - "recognizes format, using default"),
|
| - bfd_get_filename (abfd));
|
| - }
|
| - if (yummy == NULL)
|
| - {
|
| - yummy = core_file_fns;
|
| - }
|
| + error (_("\"%s\": no core file handler recognizes format"),
|
| + bfd_get_filename (abfd));
|
| +
|
| return (yummy);
|
| }
|
|
|
| @@ -213,16 +201,19 @@ core_close (int quitting)
|
| int pid = ptid_get_pid (inferior_ptid);
|
| inferior_ptid = null_ptid; /* Avoid confusion from thread
|
| stuff. */
|
| - exit_inferior_silent (pid);
|
| + if (pid != 0)
|
| + exit_inferior_silent (pid);
|
|
|
| /* Clear out solib state while the bfd is still open. See
|
| comments in clear_solib in solib.c. */
|
| clear_solib ();
|
|
|
| - xfree (core_data->sections);
|
| - xfree (core_data);
|
| - core_data = NULL;
|
| - core_has_fake_pid = 0;
|
| + if (core_data)
|
| + {
|
| + xfree (core_data->sections);
|
| + xfree (core_data);
|
| + core_data = NULL;
|
| + }
|
|
|
| name = bfd_get_filename (core_bfd);
|
| gdb_bfd_close_or_warn (core_bfd);
|
| @@ -249,6 +240,8 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
|
| int core_tid;
|
| int pid, lwpid;
|
| asection *reg_sect = (asection *) reg_sect_arg;
|
| + int fake_pid_p = 0;
|
| + struct inferior *inf;
|
|
|
| if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
|
| return;
|
| @@ -258,14 +251,18 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
|
| pid = bfd_core_file_pid (core_bfd);
|
| if (pid == 0)
|
| {
|
| - core_has_fake_pid = 1;
|
| + fake_pid_p = 1;
|
| pid = CORELOW_PID;
|
| }
|
|
|
| lwpid = core_tid;
|
|
|
| - if (current_inferior ()->pid == 0)
|
| - inferior_appeared (current_inferior (), pid);
|
| + inf = current_inferior ();
|
| + if (inf->pid == 0)
|
| + {
|
| + inferior_appeared (inf, pid);
|
| + inf->fake_pid_p = fake_pid_p;
|
| + }
|
|
|
| ptid = ptid_build (pid, lwpid, 0);
|
|
|
| @@ -290,6 +287,7 @@ core_open (char *filename, int from_tty)
|
| bfd *temp_bfd;
|
| int scratch_chan;
|
| int flags;
|
| + volatile struct gdb_exception except;
|
|
|
| target_preopen (from_tty);
|
| if (!filename)
|
| @@ -386,7 +384,6 @@ core_open (char *filename, int from_tty)
|
| init_thread_list ();
|
|
|
| inferior_ptid = null_ptid;
|
| - core_has_fake_pid = 0;
|
|
|
| /* Need to flush the register cache (and the frame cache) from a
|
| previous debug session. If inferior_ptid ends up the same as the
|
| @@ -428,7 +425,13 @@ core_open (char *filename, int from_tty)
|
| may be a thread_stratum target loaded on top of target core by
|
| now. The layer above should claim threads found in the BFD
|
| sections. */
|
| - gdb_target_find_new_threads ();
|
| + TRY_CATCH (except, RETURN_MASK_ERROR)
|
| + {
|
| + target_find_new_threads ();
|
| + }
|
| +
|
| + if (except.reason < 0)
|
| + exception_print (gdb_stderr, except);
|
|
|
| p = bfd_core_file_failing_command (core_bfd);
|
| if (p)
|
| @@ -437,17 +440,20 @@ core_open (char *filename, int from_tty)
|
| siggy = bfd_core_file_failing_signal (core_bfd);
|
| if (siggy > 0)
|
| {
|
| - /* NOTE: target_signal_from_host() converts a target signal
|
| - value into gdb's internal signal value. Unfortunately gdb's
|
| - internal value is called ``target_signal'' and this function
|
| - got the name ..._from_host(). */
|
| - enum target_signal sig = (core_gdbarch != NULL
|
| - ? gdbarch_target_signal_from_host (core_gdbarch,
|
| - siggy)
|
| - : target_signal_from_host (siggy));
|
| + /* If we don't have a CORE_GDBARCH to work with, assume a native
|
| + core (map gdb_signal from host signals). If we do have
|
| + CORE_GDBARCH to work with, but no gdb_signal_from_target
|
| + implementation for that gdbarch, as a fallback measure,
|
| + assume the host signal mapping. It'll be correct for native
|
| + cores, but most likely incorrect for cross-cores. */
|
| + enum gdb_signal sig = (core_gdbarch != NULL
|
| + && gdbarch_gdb_signal_from_target_p (core_gdbarch)
|
| + ? gdbarch_gdb_signal_from_target (core_gdbarch,
|
| + siggy)
|
| + : gdb_signal_from_host (siggy));
|
|
|
| printf_filtered (_("Program terminated with signal %d, %s.\n"),
|
| - siggy, target_signal_to_string (sig));
|
| + siggy, gdb_signal_to_string (sig));
|
| }
|
|
|
| /* Fetch all registers from core file. */
|
| @@ -847,6 +853,7 @@ static char *
|
| core_pid_to_str (struct target_ops *ops, ptid_t ptid)
|
| {
|
| static char buf[64];
|
| + struct inferior *inf;
|
| int pid;
|
|
|
| /* The preferred way is to have a gdbarch/OS specific
|
| @@ -865,7 +872,8 @@ core_pid_to_str (struct target_ops *ops, ptid_t ptid)
|
|
|
| /* Otherwise, this isn't a "threaded" core -- use the PID field, but
|
| only if it isn't a fake PID. */
|
| - if (!core_has_fake_pid)
|
| + inf = find_inferior_pid (ptid_get_pid (ptid));
|
| + if (inf != NULL && !inf->fake_pid_p)
|
| return normal_pid_to_str (ptid);
|
|
|
| /* No luck. We simply don't have a valid PID to print. */
|
|
|