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