#include "symfile.h"
#include "exec.h"
#include "readline/readline.h"
-
+#include "observer.h"
#include "gdb_assert.h"
+#include "exceptions.h"
#ifndef O_BINARY
#define O_BINARY 0
#endif
-/* List of all available core_fns. On gdb startup, each core file register
- reader calls add_core_fns() to register information on each core format it
- is prepared to read. */
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
+
+/* List of all available core_fns. On gdb startup, each core file
+ register reader calls deprecated_add_core_fns() to register
+ information on each core format it is prepared to read. */
static struct core_fns *core_file_fns = NULL;
static void add_to_thread_list (bfd *, asection *, void *);
-static int ignore (CORE_ADDR, char *);
+static int ignore (CORE_ADDR, bfd_byte *);
static int core_file_thread_alive (ptid_t tid);
handle. */
void
-add_core_fns (struct core_fns *cf)
+deprecated_add_core_fns (struct core_fns *cf)
{
cf->next = core_file_fns;
core_file_fns = cf;
}
if (matches > 1)
{
- warning ("\"%s\": ambiguous core format, %d handlers match",
+ warning (_("\"%s\": ambiguous core format, %d handlers match"),
bfd_get_filename (abfd), matches);
}
else if (matches == 0)
{
- warning ("\"%s\": no core file handler recognizes format, using default",
+ warning (_("\"%s\": no core file handler recognizes format, using default"),
bfd_get_filename (abfd));
}
if (yummy == NULL)
name = bfd_get_filename (core_bfd);
if (!bfd_close (core_bfd))
- warning ("cannot close \"%s\": %s",
+ warning (_("cannot close \"%s\": %s"),
name, bfd_errmsg (bfd_get_error ()));
xfree (name);
core_bfd = NULL;
bfd *temp_bfd;
int ontop;
int scratch_chan;
+ int flags;
target_preopen (from_tty);
if (!filename)
{
- error (core_bfd ?
- "No core file specified. (Use `detach' to stop debugging a core file.)"
- : "No core file specified.");
+ if (core_bfd)
+ error (_("No core file specified. (Use `detach' to stop debugging a core file.)"));
+ else
+ error (_("No core file specified."));
}
filename = tilde_expand (filename);
old_chain = make_cleanup (xfree, filename);
- scratch_chan = open (filename, O_BINARY | ( write_files ? O_RDWR : O_RDONLY ), 0);
+ flags = O_BINARY | O_LARGEFILE;
+ if (write_files)
+ flags |= O_RDWR;
+ else
+ flags |= O_RDONLY;
+ scratch_chan = open (filename, flags, 0);
if (scratch_chan < 0)
perror_with_name (filename);
on error it does not free all the storage associated with the
bfd). */
make_cleanup_bfd_close (temp_bfd);
- error ("\"%s\" is not a core dump: %s",
+ error (_("\"%s\" is not a core dump: %s"),
filename, bfd_errmsg (bfd_get_error ()));
}
/* Find the data section */
if (build_section_table (core_bfd, &core_ops.to_sections,
&core_ops.to_sections_end))
- error ("\"%s\": Can't find sections: %s",
+ error (_("\"%s\": Can't find sections: %s"),
bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
/* If we have no exec file, try to set the architecture from the
ontop = !push_target (&core_ops);
discard_cleanups (old_chain);
+ /* This is done first, before anything has a chance to query the
+ inferior for information such as symbols. */
+ observer_notify_inferior_created (&core_ops, from_tty);
+
p = bfd_core_file_failing_command (core_bfd);
if (p)
- printf_filtered ("Core was generated by `%s'.\n", p);
+ printf_filtered (_("Core was generated by `%s'.\n"), p);
siggy = bfd_core_file_failing_signal (core_bfd);
if (siggy > 0)
into gdb's internal signal value. Unfortunately gdb's internal
value is called ``target_signal'' and this function got the
name ..._from_host(). */
- printf_filtered ("Program terminated with signal %d, %s.\n", siggy,
+ printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
target_signal_to_string (target_signal_from_host (siggy)));
/* Build up thread list from BFD sections. */
/* Now, set up the frame cache, and print the top of stack. */
flush_cached_frames ();
select_frame (get_current_frame ());
- print_stack_frame (deprecated_selected_frame,
- frame_relative_level (deprecated_selected_frame), 1);
+ print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
}
else
{
core_detach (char *args, int from_tty)
{
if (args)
- error ("Too many arguments");
+ error (_("Too many arguments"));
unpush_target (&core_ops);
reinit_frame_cache ();
if (from_tty)
- printf_filtered ("No core file now.\n");
+ printf_filtered (_("No core file now.\n"));
}
char *human_name,
int required)
{
- char section_name[100];
+ static char *section_name = NULL;
struct bfd_section *section;
bfd_size_type size;
char *contents;
+ xfree (section_name);
if (PIDGET (inferior_ptid))
- sprintf (section_name, "%s/%d", name, PIDGET (inferior_ptid));
+ section_name = xstrprintf ("%s/%d", name, PIDGET (inferior_ptid));
else
- strcpy (section_name, name);
+ section_name = xstrdup (name);
section = bfd_get_section_by_name (core_bfd, section_name);
if (! section)
{
if (required)
- warning ("Couldn't find %s registers in core file.\n", human_name);
+ warning (_("Couldn't find %s registers in core file."), human_name);
return;
}
if (! bfd_get_section_contents (core_bfd, section, contents,
(file_ptr) 0, size))
{
- warning ("Couldn't read %s registers from `%s' section in core file.\n",
+ warning (_("Couldn't read %s registers from `%s' section in core file."),
human_name, name);
return;
}
if (regset == NULL)
{
if (required)
- warning ("Couldn't recognize %s registers in core file.\n",
+ warning (_("Couldn't recognize %s registers in core file."),
human_name);
return;
}
{
case TARGET_OBJECT_MEMORY:
if (readbuf)
- return (*ops->to_xfer_memory) (offset, readbuf, len, 0/*write*/,
- NULL, ops);
+ return (*ops->deprecated_xfer_memory) (offset, readbuf, len,
+ 0/*write*/, NULL, ops);
if (writebuf)
- return (*ops->to_xfer_memory) (offset, readbuf, len, 1/*write*/,
- NULL, ops);
+ return (*ops->deprecated_xfer_memory) (offset, readbuf, len,
+ 1/*write*/, NULL, ops);
return -1;
case TARGET_OBJECT_AUXV:
size -= offset;
if (size > len)
size = len;
- if (size > 0 &&
- ! bfd_get_section_contents (core_bfd, section, readbuf,
- (file_ptr) offset, size))
+ if (size > 0
+ && !bfd_get_section_contents (core_bfd, section, readbuf,
+ (file_ptr) offset, size))
+ {
+ warning (_("Couldn't read NT_AUXV note in core file."));
+ return -1;
+ }
+
+ return size;
+ }
+ return -1;
+
+ case TARGET_OBJECT_WCOOKIE:
+ if (readbuf)
+ {
+ /* When the StackGhost cookie is stored in core file, BFD
+ represents this with a fake section called ".wcookie". */
+
+ struct bfd_section *section;
+ bfd_size_type size;
+ char *contents;
+
+ section = bfd_get_section_by_name (core_bfd, ".wcookie");
+ if (section == NULL)
+ return -1;
+
+ size = bfd_section_size (core_bfd, section);
+ if (offset >= size)
+ return 0;
+ size -= offset;
+ if (size > len)
+ size = len;
+ if (size > 0
+ && !bfd_get_section_contents (core_bfd, section, readbuf,
+ (file_ptr) offset, size))
{
- warning ("Couldn't read NT_AUXV note in core file.");
+ warning (_("Couldn't read StackGhost cookie in core file."));
return -1;
}
`gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
static int
-ignore (CORE_ADDR addr, char *contents)
+ignore (CORE_ADDR addr, bfd_byte *contents)
{
return 0;
}
core_ops.to_detach = core_detach;
core_ops.to_fetch_registers = get_core_registers;
core_ops.to_xfer_partial = core_xfer_partial;
- core_ops.to_xfer_memory = xfer_memory;
+ core_ops.deprecated_xfer_memory = xfer_memory;
core_ops.to_files_info = core_files_info;
core_ops.to_insert_breakpoint = ignore;
core_ops.to_remove_breakpoint = ignore;