xref: /dragonfly/contrib/gdb-7/gdb/corelow.c (revision 92fc8b5c)
1 /* Core dump and executable file functions below target vector, for GDB.
2 
3    Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
4    1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
5    Free Software Foundation, Inc.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 #include "defs.h"
23 #include "arch-utils.h"
24 #include "gdb_string.h"
25 #include <errno.h>
26 #include <signal.h>
27 #include <fcntl.h>
28 #ifdef HAVE_SYS_FILE_H
29 #include <sys/file.h>		/* needed for F_OK and friends */
30 #endif
31 #include "frame.h"		/* required by inferior.h */
32 #include "inferior.h"
33 #include "symtab.h"
34 #include "command.h"
35 #include "bfd.h"
36 #include "target.h"
37 #include "gdbcore.h"
38 #include "gdbthread.h"
39 #include "regcache.h"
40 #include "regset.h"
41 #include "symfile.h"
42 #include "exec.h"
43 #include "readline/readline.h"
44 #include "gdb_assert.h"
45 #include "exceptions.h"
46 #include "solib.h"
47 #include "filenames.h"
48 #include "progspace.h"
49 #include "objfiles.h"
50 
51 
52 #ifndef O_LARGEFILE
53 #define O_LARGEFILE 0
54 #endif
55 
56 /* List of all available core_fns.  On gdb startup, each core file
57    register reader calls deprecated_add_core_fns() to register
58    information on each core format it is prepared to read.  */
59 
60 static struct core_fns *core_file_fns = NULL;
61 
62 /* The core_fns for a core file handler that is prepared to read the core
63    file currently open on core_bfd. */
64 
65 static struct core_fns *core_vec = NULL;
66 
67 /* FIXME: kettenis/20031023: Eventually this variable should
68    disappear.  */
69 
70 struct gdbarch *core_gdbarch = NULL;
71 
72 /* Per-core data.  Currently, only the section table.  Note that these
73    target sections are *not* mapped in the current address spaces' set
74    of target sections --- those should come only from pure executable
75    or shared library bfds.  The core bfd sections are an
76    implementation detail of the core target, just like ptrace is for
77    unix child targets.  */
78 static struct target_section_table *core_data;
79 
80 /* True if we needed to fake the pid of the loaded core inferior.  */
81 static int core_has_fake_pid = 0;
82 
83 static void core_files_info (struct target_ops *);
84 
85 static struct core_fns *sniff_core_bfd (bfd *);
86 
87 static int gdb_check_format (bfd *);
88 
89 static void core_open (char *, int);
90 
91 static void core_detach (struct target_ops *ops, char *, int);
92 
93 static void core_close (int);
94 
95 static void core_close_cleanup (void *ignore);
96 
97 static void add_to_thread_list (bfd *, asection *, void *);
98 
99 static void init_core_ops (void);
100 
101 void _initialize_corelow (void);
102 
103 struct target_ops core_ops;
104 
105 /* An arbitrary identifier for the core inferior.  */
106 #define CORELOW_PID 1
107 
108 /* Link a new core_fns into the global core_file_fns list.  Called on gdb
109    startup by the _initialize routine in each core file register reader, to
110    register information about each format the the reader is prepared to
111    handle. */
112 
113 void
114 deprecated_add_core_fns (struct core_fns *cf)
115 {
116   cf->next = core_file_fns;
117   core_file_fns = cf;
118 }
119 
120 /* The default function that core file handlers can use to examine a
121    core file BFD and decide whether or not to accept the job of
122    reading the core file. */
123 
124 int
125 default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
126 {
127   int result;
128 
129   result = (bfd_get_flavour (abfd) == our_fns -> core_flavour);
130   return (result);
131 }
132 
133 /* Walk through the list of core functions to find a set that can
134    handle the core file open on ABFD.  Default to the first one in the
135    list if nothing matches.  Returns pointer to set that is
136    selected. */
137 
138 static struct core_fns *
139 sniff_core_bfd (bfd *abfd)
140 {
141   struct core_fns *cf;
142   struct core_fns *yummy = NULL;
143   int matches = 0;;
144 
145   /* Don't sniff if we have support for register sets in CORE_GDBARCH.  */
146   if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
147     return NULL;
148 
149   for (cf = core_file_fns; cf != NULL; cf = cf->next)
150     {
151       if (cf->core_sniffer (cf, abfd))
152 	{
153 	  yummy = cf;
154 	  matches++;
155 	}
156     }
157   if (matches > 1)
158     {
159       warning (_("\"%s\": ambiguous core format, %d handlers match"),
160 	       bfd_get_filename (abfd), matches);
161     }
162   else if (matches == 0)
163     {
164       warning (_("\"%s\": no core file handler recognizes format, using default"),
165 	       bfd_get_filename (abfd));
166     }
167   if (yummy == NULL)
168     {
169       yummy = core_file_fns;
170     }
171   return (yummy);
172 }
173 
174 /* The default is to reject every core file format we see.  Either
175    BFD has to recognize it, or we have to provide a function in the
176    core file handler that recognizes it. */
177 
178 int
179 default_check_format (bfd *abfd)
180 {
181   return (0);
182 }
183 
184 /* Attempt to recognize core file formats that BFD rejects. */
185 
186 static int
187 gdb_check_format (bfd *abfd)
188 {
189   struct core_fns *cf;
190 
191   for (cf = core_file_fns; cf != NULL; cf = cf->next)
192     {
193       if (cf->check_format (abfd))
194 	{
195 	  return (1);
196 	}
197     }
198   return (0);
199 }
200 
201 /* Discard all vestiges of any previous core file and mark data and stack
202    spaces as empty.  */
203 
204 static void
205 core_close (int quitting)
206 {
207   char *name;
208 
209   if (core_bfd)
210     {
211       int pid = ptid_get_pid (inferior_ptid);
212       inferior_ptid = null_ptid;	/* Avoid confusion from thread stuff */
213       exit_inferior_silent (pid);
214 
215       /* Clear out solib state while the bfd is still open. See
216          comments in clear_solib in solib.c. */
217       clear_solib ();
218 
219       xfree (core_data->sections);
220       xfree (core_data);
221       core_data = NULL;
222       core_has_fake_pid = 0;
223 
224       name = bfd_get_filename (core_bfd);
225       gdb_bfd_close_or_warn (core_bfd);
226       xfree (name);
227       core_bfd = NULL;
228     }
229   core_vec = NULL;
230   core_gdbarch = NULL;
231 }
232 
233 static void
234 core_close_cleanup (void *ignore)
235 {
236   core_close (0/*ignored*/);
237 }
238 
239 /* Look for sections whose names start with `.reg/' so that we can extract the
240    list of threads in a core file.  */
241 
242 static void
243 add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
244 {
245   ptid_t ptid;
246   int core_tid;
247   int pid, lwpid;
248   asection *reg_sect = (asection *) reg_sect_arg;
249 
250   if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
251     return;
252 
253   core_tid = atoi (bfd_section_name (abfd, asect) + 5);
254 
255   if (core_gdbarch
256       && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
257     {
258       uint32_t merged_pid = core_tid;
259       pid = merged_pid & 0xffff;
260       lwpid = merged_pid >> 16;
261 
262       /* This can happen on solaris core, for example, if we don't
263 	 find a NT_PSTATUS note in the core, but do find NT_LWPSTATUS
264 	 notes.  */
265       if (pid == 0)
266 	{
267 	  core_has_fake_pid = 1;
268 	  pid = CORELOW_PID;
269 	}
270     }
271   else
272     {
273       core_has_fake_pid = 1;
274       pid = CORELOW_PID;
275       lwpid = core_tid;
276     }
277 
278   if (current_inferior ()->pid == 0)
279     inferior_appeared (current_inferior (), pid);
280 
281   ptid = ptid_build (pid, lwpid, 0);
282 
283   add_thread (ptid);
284 
285 /* Warning, Will Robinson, looking at BFD private data! */
286 
287   if (reg_sect != NULL
288       && asect->filepos == reg_sect->filepos)	/* Did we find .reg? */
289     inferior_ptid = ptid;			 /* Yes, make it current */
290 }
291 
292 /* This routine opens and sets up the core file bfd.  */
293 
294 static void
295 core_open (char *filename, int from_tty)
296 {
297   const char *p;
298   int siggy;
299   struct cleanup *old_chain;
300   char *temp;
301   bfd *temp_bfd;
302   int scratch_chan;
303   int flags;
304 
305   target_preopen (from_tty);
306   if (!filename)
307     {
308       if (core_bfd)
309 	error (_("No core file specified.  (Use `detach' to stop debugging a core file.)"));
310       else
311 	error (_("No core file specified."));
312     }
313 
314   filename = tilde_expand (filename);
315   if (!IS_ABSOLUTE_PATH(filename))
316     {
317       temp = concat (current_directory, "/", filename, (char *)NULL);
318       xfree (filename);
319       filename = temp;
320     }
321 
322   old_chain = make_cleanup (xfree, filename);
323 
324   flags = O_BINARY | O_LARGEFILE;
325   if (write_files)
326     flags |= O_RDWR;
327   else
328     flags |= O_RDONLY;
329   scratch_chan = open (filename, flags, 0);
330   if (scratch_chan < 0)
331     perror_with_name (filename);
332 
333   temp_bfd = bfd_fopen (filename, gnutarget,
334 			write_files ? FOPEN_RUB : FOPEN_RB,
335 			scratch_chan);
336   if (temp_bfd == NULL)
337     perror_with_name (filename);
338 
339   if (!bfd_check_format (temp_bfd, bfd_core)
340       && !gdb_check_format (temp_bfd))
341     {
342       /* Do it after the err msg */
343       /* FIXME: should be checking for errors from bfd_close (for one thing,
344          on error it does not free all the storage associated with the
345          bfd).  */
346       make_cleanup_bfd_close (temp_bfd);
347       error (_("\"%s\" is not a core dump: %s"),
348 	     filename, bfd_errmsg (bfd_get_error ()));
349     }
350 
351   /* Looks semi-reasonable.  Toss the old core file and work on the new.  */
352 
353   discard_cleanups (old_chain);	/* Don't free filename any more */
354   unpush_target (&core_ops);
355   core_bfd = temp_bfd;
356   old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
357 
358   /* FIXME: kettenis/20031023: This is very dangerous.  The
359      CORE_GDBARCH that results from this call may very well be
360      different from CURRENT_GDBARCH.  However, its methods may only
361      work if it is selected as the current architecture, because they
362      rely on swapped data (see gdbarch.c).  We should get rid of that
363      swapped data.  */
364   core_gdbarch = gdbarch_from_bfd (core_bfd);
365 
366   /* Find a suitable core file handler to munch on core_bfd */
367   core_vec = sniff_core_bfd (core_bfd);
368 
369   validate_files ();
370 
371   core_data = XZALLOC (struct target_section_table);
372 
373   /* Find the data section */
374   if (build_section_table (core_bfd,
375 			   &core_data->sections, &core_data->sections_end))
376     error (_("\"%s\": Can't find sections: %s"),
377 	   bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
378 
379   /* If we have no exec file, try to set the architecture from the
380      core file.  We don't do this unconditionally since an exec file
381      typically contains more information that helps us determine the
382      architecture than a core file.  */
383   if (!exec_bfd)
384     set_gdbarch_from_file (core_bfd);
385 
386   push_target (&core_ops);
387   discard_cleanups (old_chain);
388 
389   /* Do this before acknowledging the inferior, so if
390      post_create_inferior throws (can happen easilly if you're loading
391      a core file with the wrong exec), we aren't left with threads
392      from the previous inferior.  */
393   init_thread_list ();
394 
395   inferior_ptid = null_ptid;
396   core_has_fake_pid = 0;
397 
398   /* Need to flush the register cache (and the frame cache) from a
399      previous debug session.  If inferior_ptid ends up the same as the
400      last debug session --- e.g., b foo; run; gcore core1; step; gcore
401      core2; core core1; core core2 --- then there's potential for
402      get_current_regcache to return the cached regcache of the
403      previous session, and the frame cache being stale.  */
404   registers_changed ();
405 
406   /* Build up thread list from BFD sections, and possibly set the
407      current thread to the .reg/NN section matching the .reg
408      section. */
409   bfd_map_over_sections (core_bfd, add_to_thread_list,
410 			 bfd_get_section_by_name (core_bfd, ".reg"));
411 
412   if (ptid_equal (inferior_ptid, null_ptid))
413     {
414       /* Either we found no .reg/NN section, and hence we have a
415 	 non-threaded core (single-threaded, from gdb's perspective),
416 	 or for some reason add_to_thread_list couldn't determine
417 	 which was the "main" thread.  The latter case shouldn't
418 	 usually happen, but we're dealing with input here, which can
419 	 always be broken in different ways.  */
420       struct thread_info *thread = first_thread_of_process (-1);
421 
422       if (thread == NULL)
423 	{
424 	  inferior_appeared (current_inferior (), CORELOW_PID);
425 	  inferior_ptid = pid_to_ptid (CORELOW_PID);
426 	  add_thread_silent (inferior_ptid);
427 	}
428       else
429 	switch_to_thread (thread->ptid);
430     }
431 
432   post_create_inferior (&core_ops, from_tty);
433 
434   /* Now go through the target stack looking for threads since there
435      may be a thread_stratum target loaded on top of target core by
436      now.  The layer above should claim threads found in the BFD
437      sections.  */
438   target_find_new_threads ();
439 
440   p = bfd_core_file_failing_command (core_bfd);
441   if (p)
442     printf_filtered (_("Core was generated by `%s'.\n"), p);
443 
444   siggy = bfd_core_file_failing_signal (core_bfd);
445   if (siggy > 0)
446     /* NOTE: target_signal_from_host() converts a target signal value
447        into gdb's internal signal value.  Unfortunately gdb's internal
448        value is called ``target_signal'' and this function got the
449        name ..._from_host(). */
450     printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
451 		     target_signal_to_string (
452 		       (core_gdbarch != NULL) ?
453 			gdbarch_target_signal_from_host (core_gdbarch, siggy)
454 			: siggy));
455 
456   /* Fetch all registers from core file.  */
457   target_fetch_registers (get_current_regcache (), -1);
458 
459   /* Now, set up the frame cache, and print the top of stack.  */
460   reinit_frame_cache ();
461   print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
462 }
463 
464 static void
465 core_detach (struct target_ops *ops, char *args, int from_tty)
466 {
467   if (args)
468     error (_("Too many arguments"));
469   unpush_target (ops);
470   reinit_frame_cache ();
471   if (from_tty)
472     printf_filtered (_("No core file now.\n"));
473 }
474 
475 #ifdef DEPRECATED_IBM6000_TARGET
476 
477 /* Resize the core memory's section table, by NUM_ADDED.  Returns a
478    pointer into the first new slot.  This will not be necessary when
479    the rs6000 target is converted to use the standard solib
480    framework.  */
481 
482 struct target_section *
483 deprecated_core_resize_section_table (int num_added)
484 {
485   int old_count;
486 
487   old_count = resize_section_table (core_data, num_added);
488   return core_data->sections + old_count;
489 }
490 
491 #endif
492 
493 /* Try to retrieve registers from a section in core_bfd, and supply
494    them to core_vec->core_read_registers, as the register set numbered
495    WHICH.
496 
497    If inferior_ptid's lwp member is zero, do the single-threaded
498    thing: look for a section named NAME.  If inferior_ptid's lwp
499    member is non-zero, do the multi-threaded thing: look for a section
500    named "NAME/LWP", where LWP is the shortest ASCII decimal
501    representation of inferior_ptid's lwp member.
502 
503    HUMAN_NAME is a human-readable name for the kind of registers the
504    NAME section contains, for use in error messages.
505 
506    If REQUIRED is non-zero, print an error if the core file doesn't
507    have a section by the appropriate name.  Otherwise, just do nothing.  */
508 
509 static void
510 get_core_register_section (struct regcache *regcache,
511 			   const char *name,
512 			   int which,
513 			   const char *human_name,
514 			   int required)
515 {
516   static char *section_name = NULL;
517   struct bfd_section *section;
518   bfd_size_type size;
519   char *contents;
520 
521   xfree (section_name);
522 
523   if (core_gdbarch
524       && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
525     {
526       uint32_t merged_pid;
527       int pid = ptid_get_pid (inferior_ptid);
528 
529       if (core_has_fake_pid)
530 	pid = 0;
531 
532       merged_pid = ptid_get_lwp (inferior_ptid);
533       merged_pid = merged_pid << 16 | pid;
534 
535       section_name = xstrprintf ("%s/%s", name, plongest (merged_pid));
536     }
537   else if (ptid_get_lwp (inferior_ptid))
538     section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
539   else
540     section_name = xstrdup (name);
541 
542   section = bfd_get_section_by_name (core_bfd, section_name);
543   if (! section)
544     {
545       if (required)
546 	warning (_("Couldn't find %s registers in core file."), human_name);
547       return;
548     }
549 
550   size = bfd_section_size (core_bfd, section);
551   contents = alloca (size);
552   if (! bfd_get_section_contents (core_bfd, section, contents,
553 				  (file_ptr) 0, size))
554     {
555       warning (_("Couldn't read %s registers from `%s' section in core file."),
556 	       human_name, name);
557       return;
558     }
559 
560   if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
561     {
562       const struct regset *regset;
563 
564       regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
565       if (regset == NULL)
566 	{
567 	  if (required)
568 	    warning (_("Couldn't recognize %s registers in core file."),
569 		     human_name);
570 	  return;
571 	}
572 
573       regset->supply_regset (regset, regcache, -1, contents, size);
574       return;
575     }
576 
577   gdb_assert (core_vec);
578   core_vec->core_read_registers (regcache, contents, size, which,
579 				 ((CORE_ADDR)
580 				  bfd_section_vma (core_bfd, section)));
581 }
582 
583 
584 /* Get the registers out of a core file.  This is the machine-
585    independent part.  Fetch_core_registers is the machine-dependent
586    part, typically implemented in the xm-file for each architecture.  */
587 
588 /* We just get all the registers, so we don't use regno.  */
589 
590 static void
591 get_core_registers (struct target_ops *ops,
592 		    struct regcache *regcache, int regno)
593 {
594   struct core_regset_section *sect_list;
595   int i;
596 
597   if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
598       && (core_vec == NULL || core_vec->core_read_registers == NULL))
599     {
600       fprintf_filtered (gdb_stderr,
601 		     "Can't fetch registers from this type of core file\n");
602       return;
603     }
604 
605   sect_list = gdbarch_core_regset_sections (get_regcache_arch (regcache));
606   if (sect_list)
607     while (sect_list->sect_name != NULL)
608       {
609         if (strcmp (sect_list->sect_name, ".reg") == 0)
610 	  get_core_register_section (regcache, sect_list->sect_name,
611 				     0, sect_list->human_name, 1);
612         else if (strcmp (sect_list->sect_name, ".reg2") == 0)
613 	  get_core_register_section (regcache, sect_list->sect_name,
614 				     2, sect_list->human_name, 0);
615 	else
616 	  get_core_register_section (regcache, sect_list->sect_name,
617 				     3, sect_list->human_name, 0);
618 
619 	sect_list++;
620       }
621 
622   else
623     {
624       get_core_register_section (regcache,
625 				 ".reg", 0, "general-purpose", 1);
626       get_core_register_section (regcache,
627 				 ".reg2", 2, "floating-point", 0);
628     }
629 
630   /* Supply dummy value for all registers not found in the core.  */
631   for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
632     if (!regcache_valid_p (regcache, i))
633       regcache_raw_supply (regcache, i, NULL);
634 }
635 
636 static void
637 core_files_info (struct target_ops *t)
638 {
639   print_section_info (core_data, core_bfd);
640 }
641 
642 struct spuid_list
643 {
644   gdb_byte *buf;
645   ULONGEST offset;
646   LONGEST len;
647   ULONGEST pos;
648   ULONGEST written;
649 };
650 
651 static void
652 add_to_spuid_list (bfd *abfd, asection *asect, void *list_p)
653 {
654   struct spuid_list *list = list_p;
655   enum bfd_endian byte_order
656     = bfd_big_endian (abfd)? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
657   int fd, pos = 0;
658 
659   sscanf (bfd_section_name (abfd, asect), "SPU/%d/regs%n", &fd, &pos);
660   if (pos == 0)
661     return;
662 
663   if (list->pos >= list->offset && list->pos + 4 <= list->offset + list->len)
664     {
665       store_unsigned_integer (list->buf + list->pos - list->offset,
666 			      4, byte_order, fd);
667       list->written += 4;
668     }
669   list->pos += 4;
670 }
671 
672 static LONGEST
673 core_xfer_partial (struct target_ops *ops, enum target_object object,
674 		   const char *annex, gdb_byte *readbuf,
675 		   const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
676 {
677   switch (object)
678     {
679     case TARGET_OBJECT_MEMORY:
680       return section_table_xfer_memory_partial (readbuf, writebuf,
681 						offset, len,
682 						core_data->sections,
683 						core_data->sections_end,
684 						NULL);
685 
686     case TARGET_OBJECT_AUXV:
687       if (readbuf)
688 	{
689 	  /* When the aux vector is stored in core file, BFD
690 	     represents this with a fake section called ".auxv".  */
691 
692 	  struct bfd_section *section;
693 	  bfd_size_type size;
694 
695 	  section = bfd_get_section_by_name (core_bfd, ".auxv");
696 	  if (section == NULL)
697 	    return -1;
698 
699 	  size = bfd_section_size (core_bfd, section);
700 	  if (offset >= size)
701 	    return 0;
702 	  size -= offset;
703 	  if (size > len)
704 	    size = len;
705 	  if (size > 0
706 	      && !bfd_get_section_contents (core_bfd, section, readbuf,
707 					    (file_ptr) offset, size))
708 	    {
709 	      warning (_("Couldn't read NT_AUXV note in core file."));
710 	      return -1;
711 	    }
712 
713 	  return size;
714 	}
715       return -1;
716 
717     case TARGET_OBJECT_WCOOKIE:
718       if (readbuf)
719 	{
720 	  /* When the StackGhost cookie is stored in core file, BFD
721 	     represents this with a fake section called ".wcookie".  */
722 
723 	  struct bfd_section *section;
724 	  bfd_size_type size;
725 
726 	  section = bfd_get_section_by_name (core_bfd, ".wcookie");
727 	  if (section == NULL)
728 	    return -1;
729 
730 	  size = bfd_section_size (core_bfd, section);
731 	  if (offset >= size)
732 	    return 0;
733 	  size -= offset;
734 	  if (size > len)
735 	    size = len;
736 	  if (size > 0
737 	      && !bfd_get_section_contents (core_bfd, section, readbuf,
738 					    (file_ptr) offset, size))
739 	    {
740 	      warning (_("Couldn't read StackGhost cookie in core file."));
741 	      return -1;
742 	    }
743 
744 	  return size;
745 	}
746       return -1;
747 
748     case TARGET_OBJECT_LIBRARIES:
749       if (core_gdbarch
750 	  && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
751 	{
752 	  if (writebuf)
753 	    return -1;
754 	  return
755 	    gdbarch_core_xfer_shared_libraries (core_gdbarch,
756 						readbuf, offset, len);
757 	}
758       /* FALL THROUGH */
759 
760     case TARGET_OBJECT_SPU:
761       if (readbuf && annex)
762 	{
763 	  /* When the SPU contexts are stored in a core file, BFD
764 	     represents this with a fake section called "SPU/<annex>".  */
765 
766 	  struct bfd_section *section;
767 	  bfd_size_type size;
768 	  char sectionstr[100];
769 
770 	  xsnprintf (sectionstr, sizeof sectionstr, "SPU/%s", annex);
771 
772 	  section = bfd_get_section_by_name (core_bfd, sectionstr);
773 	  if (section == NULL)
774 	    return -1;
775 
776 	  size = bfd_section_size (core_bfd, section);
777 	  if (offset >= size)
778 	    return 0;
779 	  size -= offset;
780 	  if (size > len)
781 	    size = len;
782 	  if (size > 0
783 	      && !bfd_get_section_contents (core_bfd, section, readbuf,
784 					    (file_ptr) offset, size))
785 	    {
786 	      warning (_("Couldn't read SPU section in core file."));
787 	      return -1;
788 	    }
789 
790 	  return size;
791 	}
792       else if (readbuf)
793 	{
794 	  /* NULL annex requests list of all present spuids.  */
795 	  struct spuid_list list;
796 
797 	  list.buf = readbuf;
798 	  list.offset = offset;
799 	  list.len = len;
800 	  list.pos = 0;
801 	  list.written = 0;
802 	  bfd_map_over_sections (core_bfd, add_to_spuid_list, &list);
803 	  return list.written;
804 	}
805       return -1;
806 
807     default:
808       if (ops->beneath != NULL)
809 	return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
810 					      readbuf, writebuf, offset, len);
811       return -1;
812     }
813 }
814 
815 
816 /* If mourn is being called in all the right places, this could be say
817    `gdb internal error' (since generic_mourn calls breakpoint_init_inferior).  */
818 
819 static int
820 ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
821 {
822   return 0;
823 }
824 
825 
826 /* Okay, let's be honest: threads gleaned from a core file aren't
827    exactly lively, are they?  On the other hand, if we don't claim
828    that each & every one is alive, then we don't get any of them
829    to appear in an "info thread" command, which is quite a useful
830    behaviour.
831  */
832 static int
833 core_thread_alive (struct target_ops *ops, ptid_t ptid)
834 {
835   return 1;
836 }
837 
838 /* Ask the current architecture what it knows about this core file.
839    That will be used, in turn, to pick a better architecture.  This
840    wrapper could be avoided if targets got a chance to specialize
841    core_ops.  */
842 
843 static const struct target_desc *
844 core_read_description (struct target_ops *target)
845 {
846   if (core_gdbarch && gdbarch_core_read_description_p (core_gdbarch))
847     return gdbarch_core_read_description (core_gdbarch, target, core_bfd);
848 
849   return NULL;
850 }
851 
852 static char *
853 core_pid_to_str (struct target_ops *ops, ptid_t ptid)
854 {
855   static char buf[64];
856 
857   if (core_gdbarch
858       && gdbarch_core_pid_to_str_p (core_gdbarch))
859     {
860       char *ret = gdbarch_core_pid_to_str (core_gdbarch, ptid);
861 
862       if (ret != NULL)
863 	return ret;
864     }
865 
866   if (ptid_get_lwp (ptid) == 0)
867     xsnprintf (buf, sizeof buf, "<main task>");
868   else
869     xsnprintf (buf, sizeof buf, "Thread %ld", ptid_get_lwp (ptid));
870 
871   return buf;
872 }
873 
874 static int
875 core_has_memory (struct target_ops *ops)
876 {
877   return (core_bfd != NULL);
878 }
879 
880 static int
881 core_has_stack (struct target_ops *ops)
882 {
883   return (core_bfd != NULL);
884 }
885 
886 static int
887 core_has_registers (struct target_ops *ops)
888 {
889   return (core_bfd != NULL);
890 }
891 
892 /* Fill in core_ops with its defined operations and properties.  */
893 
894 static void
895 init_core_ops (void)
896 {
897   core_ops.to_shortname = "core";
898   core_ops.to_longname = "Local core dump file";
899   core_ops.to_doc =
900     "Use a core file as a target.  Specify the filename of the core file.";
901   core_ops.to_open = core_open;
902   core_ops.to_close = core_close;
903   core_ops.to_attach = find_default_attach;
904   core_ops.to_detach = core_detach;
905   core_ops.to_fetch_registers = get_core_registers;
906   core_ops.to_xfer_partial = core_xfer_partial;
907   core_ops.to_files_info = core_files_info;
908   core_ops.to_insert_breakpoint = ignore;
909   core_ops.to_remove_breakpoint = ignore;
910   core_ops.to_create_inferior = find_default_create_inferior;
911   core_ops.to_thread_alive = core_thread_alive;
912   core_ops.to_read_description = core_read_description;
913   core_ops.to_pid_to_str = core_pid_to_str;
914   core_ops.to_stratum = core_stratum;
915   core_ops.to_has_memory = core_has_memory;
916   core_ops.to_has_stack = core_has_stack;
917   core_ops.to_has_registers = core_has_registers;
918   core_ops.to_magic = OPS_MAGIC;
919 }
920 
921 void
922 _initialize_corelow (void)
923 {
924   init_core_ops ();
925 
926   add_target (&core_ops);
927 }
928