* objfiles.h (gdb_bfd_close_or_warn): Declare.
[platform/upstream/binutils.git] / gdb / corelow.c
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       if (thread == NULL)
422         {
423           inferior_appeared (current_inferior (), CORELOW_PID);
424           inferior_ptid = pid_to_ptid (CORELOW_PID);
425           add_thread_silent (inferior_ptid);
426         }
427       else
428         switch_to_thread (thread->ptid);
429     }
430
431   post_create_inferior (&core_ops, from_tty);
432
433   /* Now go through the target stack looking for threads since there
434      may be a thread_stratum target loaded on top of target core by
435      now.  The layer above should claim threads found in the BFD
436      sections.  */
437   target_find_new_threads ();
438
439   p = bfd_core_file_failing_command (core_bfd);
440   if (p)
441     printf_filtered (_("Core was generated by `%s'.\n"), p);
442
443   siggy = bfd_core_file_failing_signal (core_bfd);
444   if (siggy > 0)
445     /* NOTE: target_signal_from_host() converts a target signal value
446        into gdb's internal signal value.  Unfortunately gdb's internal
447        value is called ``target_signal'' and this function got the
448        name ..._from_host(). */
449     printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
450                      target_signal_to_string (
451                        (core_gdbarch != NULL) ?
452                         gdbarch_target_signal_from_host (core_gdbarch, siggy)
453                         : siggy));
454
455   /* Fetch all registers from core file.  */
456   target_fetch_registers (get_current_regcache (), -1);
457
458   /* Now, set up the frame cache, and print the top of stack.  */
459   reinit_frame_cache ();
460   print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
461 }
462
463 static void
464 core_detach (struct target_ops *ops, char *args, int from_tty)
465 {
466   if (args)
467     error (_("Too many arguments"));
468   unpush_target (ops);
469   reinit_frame_cache ();
470   if (from_tty)
471     printf_filtered (_("No core file now.\n"));
472 }
473
474 #ifdef DEPRECATED_IBM6000_TARGET
475
476 /* Resize the core memory's section table, by NUM_ADDED.  Returns a
477    pointer into the first new slot.  This will not be necessary when
478    the rs6000 target is converted to use the standard solib
479    framework.  */
480
481 struct target_section *
482 deprecated_core_resize_section_table (int num_added)
483 {
484   int old_count;
485
486   old_count = resize_section_table (core_data, num_added);
487   return core_data->sections + old_count;
488 }
489
490 #endif
491
492 /* Try to retrieve registers from a section in core_bfd, and supply
493    them to core_vec->core_read_registers, as the register set numbered
494    WHICH.
495
496    If inferior_ptid's lwp member is zero, do the single-threaded
497    thing: look for a section named NAME.  If inferior_ptid's lwp
498    member is non-zero, do the multi-threaded thing: look for a section
499    named "NAME/LWP", where LWP is the shortest ASCII decimal
500    representation of inferior_ptid's lwp member.
501
502    HUMAN_NAME is a human-readable name for the kind of registers the
503    NAME section contains, for use in error messages.
504
505    If REQUIRED is non-zero, print an error if the core file doesn't
506    have a section by the appropriate name.  Otherwise, just do nothing.  */
507
508 static void
509 get_core_register_section (struct regcache *regcache,
510                            const char *name,
511                            int which,
512                            const char *human_name,
513                            int required)
514 {
515   static char *section_name = NULL;
516   struct bfd_section *section;
517   bfd_size_type size;
518   char *contents;
519
520   xfree (section_name);
521
522   if (core_gdbarch
523       && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
524     {
525       uint32_t merged_pid;
526       int pid = ptid_get_pid (inferior_ptid);
527
528       if (core_has_fake_pid)
529         pid = 0;
530
531       merged_pid = ptid_get_lwp (inferior_ptid);
532       merged_pid = merged_pid << 16 | pid;
533
534       section_name = xstrprintf ("%s/%s", name, plongest (merged_pid));
535     }
536   else if (ptid_get_lwp (inferior_ptid))
537     section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
538   else
539     section_name = xstrdup (name);
540
541   section = bfd_get_section_by_name (core_bfd, section_name);
542   if (! section)
543     {
544       if (required)
545         warning (_("Couldn't find %s registers in core file."), human_name);
546       return;
547     }
548
549   size = bfd_section_size (core_bfd, section);
550   contents = alloca (size);
551   if (! bfd_get_section_contents (core_bfd, section, contents,
552                                   (file_ptr) 0, size))
553     {
554       warning (_("Couldn't read %s registers from `%s' section in core file."),
555                human_name, name);
556       return;
557     }
558
559   if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
560     {
561       const struct regset *regset;
562
563       regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
564       if (regset == NULL)
565         {
566           if (required)
567             warning (_("Couldn't recognize %s registers in core file."),
568                      human_name);
569           return;
570         }
571
572       regset->supply_regset (regset, regcache, -1, contents, size);
573       return;
574     }
575
576   gdb_assert (core_vec);
577   core_vec->core_read_registers (regcache, contents, size, which,
578                                  ((CORE_ADDR)
579                                   bfd_section_vma (core_bfd, section)));
580 }
581
582
583 /* Get the registers out of a core file.  This is the machine-
584    independent part.  Fetch_core_registers is the machine-dependent
585    part, typically implemented in the xm-file for each architecture.  */
586
587 /* We just get all the registers, so we don't use regno.  */
588
589 static void
590 get_core_registers (struct target_ops *ops,
591                     struct regcache *regcache, int regno)
592 {
593   struct core_regset_section *sect_list;
594   int i;
595
596   if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
597       && (core_vec == NULL || core_vec->core_read_registers == NULL))
598     {
599       fprintf_filtered (gdb_stderr,
600                      "Can't fetch registers from this type of core file\n");
601       return;
602     }
603
604   sect_list = gdbarch_core_regset_sections (get_regcache_arch (regcache));
605   if (sect_list)
606     while (sect_list->sect_name != NULL)
607       {
608         if (strcmp (sect_list->sect_name, ".reg") == 0)
609           get_core_register_section (regcache, sect_list->sect_name,
610                                      0, sect_list->human_name, 1);
611         else if (strcmp (sect_list->sect_name, ".reg2") == 0)
612           get_core_register_section (regcache, sect_list->sect_name,
613                                      2, sect_list->human_name, 0);
614         else
615           get_core_register_section (regcache, sect_list->sect_name,
616                                      3, sect_list->human_name, 0);
617
618         sect_list++;
619       }
620
621   else
622     {
623       get_core_register_section (regcache,
624                                  ".reg", 0, "general-purpose", 1);
625       get_core_register_section (regcache,
626                                  ".reg2", 2, "floating-point", 0);
627     }
628
629   /* Supply dummy value for all registers not found in the core.  */
630   for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
631     if (!regcache_valid_p (regcache, i))
632       regcache_raw_supply (regcache, i, NULL);
633 }
634
635 static void
636 core_files_info (struct target_ops *t)
637 {
638   print_section_info (core_data, core_bfd);
639 }
640 \f
641 struct spuid_list
642 {
643   gdb_byte *buf;
644   ULONGEST offset;
645   LONGEST len;
646   ULONGEST pos;
647   ULONGEST written;
648 };
649
650 static void
651 add_to_spuid_list (bfd *abfd, asection *asect, void *list_p)
652 {
653   struct spuid_list *list = list_p;
654   enum bfd_endian byte_order
655     = bfd_big_endian (abfd)? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
656   int fd, pos = 0;
657
658   sscanf (bfd_section_name (abfd, asect), "SPU/%d/regs%n", &fd, &pos);
659   if (pos == 0)
660     return;
661
662   if (list->pos >= list->offset && list->pos + 4 <= list->offset + list->len)
663     {
664       store_unsigned_integer (list->buf + list->pos - list->offset,
665                               4, byte_order, fd);
666       list->written += 4;
667     }
668   list->pos += 4;
669 }
670
671 static LONGEST
672 core_xfer_partial (struct target_ops *ops, enum target_object object,
673                    const char *annex, gdb_byte *readbuf,
674                    const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
675 {
676   switch (object)
677     {
678     case TARGET_OBJECT_MEMORY:
679       return section_table_xfer_memory_partial (readbuf, writebuf,
680                                                 offset, len,
681                                                 core_data->sections,
682                                                 core_data->sections_end,
683                                                 NULL);
684
685     case TARGET_OBJECT_AUXV:
686       if (readbuf)
687         {
688           /* When the aux vector is stored in core file, BFD
689              represents this with a fake section called ".auxv".  */
690
691           struct bfd_section *section;
692           bfd_size_type size;
693           char *contents;
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           char *contents;
726
727           section = bfd_get_section_by_name (core_bfd, ".wcookie");
728           if (section == NULL)
729             return -1;
730
731           size = bfd_section_size (core_bfd, section);
732           if (offset >= size)
733             return 0;
734           size -= offset;
735           if (size > len)
736             size = len;
737           if (size > 0
738               && !bfd_get_section_contents (core_bfd, section, readbuf,
739                                             (file_ptr) offset, size))
740             {
741               warning (_("Couldn't read StackGhost cookie in core file."));
742               return -1;
743             }
744
745           return size;
746         }
747       return -1;
748
749     case TARGET_OBJECT_LIBRARIES:
750       if (core_gdbarch
751           && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
752         {
753           if (writebuf)
754             return -1;
755           return
756             gdbarch_core_xfer_shared_libraries (core_gdbarch,
757                                                 readbuf, offset, len);
758         }
759       /* FALL THROUGH */
760
761     case TARGET_OBJECT_SPU:
762       if (readbuf && annex)
763         {
764           /* When the SPU contexts are stored in a core file, BFD
765              represents this with a fake section called "SPU/<annex>".  */
766
767           struct bfd_section *section;
768           bfd_size_type size;
769           char *contents;
770
771           char sectionstr[100];
772           xsnprintf (sectionstr, sizeof sectionstr, "SPU/%s", annex);
773
774           section = bfd_get_section_by_name (core_bfd, sectionstr);
775           if (section == NULL)
776             return -1;
777
778           size = bfd_section_size (core_bfd, section);
779           if (offset >= size)
780             return 0;
781           size -= offset;
782           if (size > len)
783             size = len;
784           if (size > 0
785               && !bfd_get_section_contents (core_bfd, section, readbuf,
786                                             (file_ptr) offset, size))
787             {
788               warning (_("Couldn't read SPU section in core file."));
789               return -1;
790             }
791
792           return size;
793         }
794       else if (readbuf)
795         {
796           /* NULL annex requests list of all present spuids.  */
797           struct spuid_list list;
798           list.buf = readbuf;
799           list.offset = offset;
800           list.len = len;
801           list.pos = 0;
802           list.written = 0;
803           bfd_map_over_sections (core_bfd, add_to_spuid_list, &list);
804           return list.written;
805         }
806       return -1;
807
808     default:
809       if (ops->beneath != NULL)
810         return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
811                                               readbuf, writebuf, offset, len);
812       return -1;
813     }
814 }
815
816 \f
817 /* If mourn is being called in all the right places, this could be say
818    `gdb internal error' (since generic_mourn calls breakpoint_init_inferior).  */
819
820 static int
821 ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
822 {
823   return 0;
824 }
825
826
827 /* Okay, let's be honest: threads gleaned from a core file aren't
828    exactly lively, are they?  On the other hand, if we don't claim
829    that each & every one is alive, then we don't get any of them
830    to appear in an "info thread" command, which is quite a useful
831    behaviour.
832  */
833 static int
834 core_thread_alive (struct target_ops *ops, ptid_t ptid)
835 {
836   return 1;
837 }
838
839 /* Ask the current architecture what it knows about this core file.
840    That will be used, in turn, to pick a better architecture.  This
841    wrapper could be avoided if targets got a chance to specialize
842    core_ops.  */
843
844 static const struct target_desc *
845 core_read_description (struct target_ops *target)
846 {
847   if (core_gdbarch && gdbarch_core_read_description_p (core_gdbarch))
848     return gdbarch_core_read_description (core_gdbarch, target, core_bfd);
849
850   return NULL;
851 }
852
853 static char *
854 core_pid_to_str (struct target_ops *ops, ptid_t ptid)
855 {
856   static char buf[64];
857
858   if (core_gdbarch
859       && gdbarch_core_pid_to_str_p (core_gdbarch))
860     {
861       char *ret = gdbarch_core_pid_to_str (core_gdbarch, ptid);
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 }