2007-10-30 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
6aba47ca
DJ
3 Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
4 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
961cb7b5 5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
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
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
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.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
0e24ac5d 23#include "arch-utils.h"
c906108c
SS
24#include "gdb_string.h"
25#include <errno.h>
26#include <signal.h>
27#include <fcntl.h>
fc24370e
MS
28#ifdef HAVE_SYS_FILE_H
29#include <sys/file.h> /* needed for F_OK and friends */
30#endif
c5aa993b 31#include "frame.h" /* required by inferior.h */
c906108c
SS
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"
4e052eda 39#include "regcache.h"
0e24ac5d 40#include "regset.h"
990f9fe3 41#include "symfile.h"
4646aa9d 42#include "exec.h"
dbda9972 43#include "readline/readline.h"
0e24ac5d 44#include "gdb_assert.h"
60250e8b 45#include "exceptions.h"
a77053c2 46#include "solib.h"
0e24ac5d 47
8e860359 48
ee28ca0f
AC
49#ifndef O_LARGEFILE
50#define O_LARGEFILE 0
51#endif
52
00e32a35
AC
53/* List of all available core_fns. On gdb startup, each core file
54 register reader calls deprecated_add_core_fns() to register
55 information on each core format it is prepared to read. */
c906108c
SS
56
57static struct core_fns *core_file_fns = NULL;
58
2acceee2
JM
59/* The core_fns for a core file handler that is prepared to read the core
60 file currently open on core_bfd. */
61
62static struct core_fns *core_vec = NULL;
63
0e24ac5d
MK
64/* FIXME: kettenis/20031023: Eventually this variable should
65 disappear. */
66
67struct gdbarch *core_gdbarch = NULL;
68
a14ed312 69static void core_files_info (struct target_ops *);
c906108c 70
a14ed312 71static struct core_fns *sniff_core_bfd (bfd *);
2acceee2 72
020cc13c 73static int gdb_check_format (bfd *);
2acceee2 74
a14ed312 75static void core_open (char *, int);
c906108c 76
a14ed312 77static void core_detach (char *, int);
c906108c 78
a14ed312 79static void core_close (int);
c906108c 80
74b7792f
AC
81static void core_close_cleanup (void *ignore);
82
56be3814 83static void get_core_registers (struct regcache *, int);
c906108c 84
4efb68b1 85static void add_to_thread_list (bfd *, asection *, void *);
c906108c 86
39f77062 87static int core_file_thread_alive (ptid_t tid);
c906108c 88
a14ed312 89static void init_core_ops (void);
c906108c 90
a14ed312 91void _initialize_corelow (void);
c906108c
SS
92
93struct target_ops core_ops;
94
95/* Link a new core_fns into the global core_file_fns list. Called on gdb
96 startup by the _initialize routine in each core file register reader, to
97 register information about each format the the reader is prepared to
98 handle. */
99
100void
00e32a35 101deprecated_add_core_fns (struct core_fns *cf)
c906108c 102{
c5aa993b 103 cf->next = core_file_fns;
c906108c
SS
104 core_file_fns = cf;
105}
106
2acceee2
JM
107/* The default function that core file handlers can use to examine a
108 core file BFD and decide whether or not to accept the job of
109 reading the core file. */
110
111int
fba45db2 112default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
2acceee2
JM
113{
114 int result;
115
116 result = (bfd_get_flavour (abfd) == our_fns -> core_flavour);
117 return (result);
118}
119
120/* Walk through the list of core functions to find a set that can
121 handle the core file open on ABFD. Default to the first one in the
ee923081 122 list if nothing matches. Returns pointer to set that is
2acceee2
JM
123 selected. */
124
125static struct core_fns *
fba45db2 126sniff_core_bfd (bfd *abfd)
2acceee2
JM
127{
128 struct core_fns *cf;
129 struct core_fns *yummy = NULL;
130 int matches = 0;;
131
0e24ac5d
MK
132 /* Don't sniff if we have support for register sets in CORE_GDBARCH. */
133 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
134 return NULL;
135
2acceee2
JM
136 for (cf = core_file_fns; cf != NULL; cf = cf->next)
137 {
138 if (cf->core_sniffer (cf, abfd))
139 {
140 yummy = cf;
141 matches++;
142 }
143 }
144 if (matches > 1)
145 {
8a3fe4f8 146 warning (_("\"%s\": ambiguous core format, %d handlers match"),
2acceee2
JM
147 bfd_get_filename (abfd), matches);
148 }
149 else if (matches == 0)
150 {
8a3fe4f8 151 warning (_("\"%s\": no core file handler recognizes format, using default"),
2acceee2
JM
152 bfd_get_filename (abfd));
153 }
154 if (yummy == NULL)
155 {
156 yummy = core_file_fns;
157 }
158 return (yummy);
159}
160
161/* The default is to reject every core file format we see. Either
162 BFD has to recognize it, or we have to provide a function in the
163 core file handler that recognizes it. */
164
165int
fba45db2 166default_check_format (bfd *abfd)
2acceee2
JM
167{
168 return (0);
169}
170
171/* Attempt to recognize core file formats that BFD rejects. */
172
020cc13c 173static int
fba45db2 174gdb_check_format (bfd *abfd)
2acceee2
JM
175{
176 struct core_fns *cf;
177
178 for (cf = core_file_fns; cf != NULL; cf = cf->next)
179 {
180 if (cf->check_format (abfd))
181 {
81a9a963 182 return (1);
2acceee2
JM
183 }
184 }
81a9a963 185 return (0);
2acceee2 186}
c906108c
SS
187
188/* Discard all vestiges of any previous core file and mark data and stack
189 spaces as empty. */
190
c906108c 191static void
fba45db2 192core_close (int quitting)
c906108c
SS
193{
194 char *name;
195
196 if (core_bfd)
197 {
39f77062 198 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */
c906108c 199
7a292a7a 200 /* Clear out solib state while the bfd is still open. See
c5aa993b 201 comments in clear_solib in solib.c. */
7a292a7a
SS
202#ifdef CLEAR_SOLIB
203 CLEAR_SOLIB ();
a77053c2
MK
204#else
205 clear_solib ();
7a292a7a
SS
206#endif
207
c906108c
SS
208 name = bfd_get_filename (core_bfd);
209 if (!bfd_close (core_bfd))
8a3fe4f8 210 warning (_("cannot close \"%s\": %s"),
c906108c 211 name, bfd_errmsg (bfd_get_error ()));
b8c9b27d 212 xfree (name);
c906108c 213 core_bfd = NULL;
c906108c
SS
214 if (core_ops.to_sections)
215 {
b8c9b27d 216 xfree (core_ops.to_sections);
c906108c
SS
217 core_ops.to_sections = NULL;
218 core_ops.to_sections_end = NULL;
219 }
220 }
2acceee2 221 core_vec = NULL;
0e24ac5d 222 core_gdbarch = NULL;
c906108c
SS
223}
224
74b7792f
AC
225static void
226core_close_cleanup (void *ignore)
227{
228 core_close (0/*ignored*/);
229}
230
c906108c
SS
231/* Look for sections whose names start with `.reg/' so that we can extract the
232 list of threads in a core file. */
233
234static void
4efb68b1 235add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c
SS
236{
237 int thread_id;
238 asection *reg_sect = (asection *) reg_sect_arg;
239
240 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
241 return;
242
243 thread_id = atoi (bfd_section_name (abfd, asect) + 5);
244
39f77062 245 add_thread (pid_to_ptid (thread_id));
c906108c
SS
246
247/* Warning, Will Robinson, looking at BFD private data! */
248
249 if (reg_sect != NULL
c5aa993b 250 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
39f77062 251 inferior_ptid = pid_to_ptid (thread_id); /* Yes, make it current */
c906108c
SS
252}
253
254/* This routine opens and sets up the core file bfd. */
255
256static void
fba45db2 257core_open (char *filename, int from_tty)
c906108c
SS
258{
259 const char *p;
260 int siggy;
261 struct cleanup *old_chain;
262 char *temp;
263 bfd *temp_bfd;
264 int ontop;
265 int scratch_chan;
ee28ca0f 266 int flags;
c906108c
SS
267
268 target_preopen (from_tty);
269 if (!filename)
270 {
8a3fe4f8
AC
271 if (core_bfd)
272 error (_("No core file specified. (Use `detach' to stop debugging a core file.)"));
273 else
274 error (_("No core file specified."));
c906108c
SS
275 }
276
277 filename = tilde_expand (filename);
278 if (filename[0] != '/')
279 {
1754f103 280 temp = concat (current_directory, "/", filename, (char *)NULL);
b8c9b27d 281 xfree (filename);
c906108c
SS
282 filename = temp;
283 }
284
b8c9b27d 285 old_chain = make_cleanup (xfree, filename);
c906108c 286
ee28ca0f
AC
287 flags = O_BINARY | O_LARGEFILE;
288 if (write_files)
289 flags |= O_RDWR;
290 else
291 flags |= O_RDONLY;
292 scratch_chan = open (filename, flags, 0);
c906108c
SS
293 if (scratch_chan < 0)
294 perror_with_name (filename);
295
9f76c2cd
MM
296 temp_bfd = bfd_fopen (filename, gnutarget,
297 write_files ? FOPEN_RUB : FOPEN_RB,
298 scratch_chan);
c906108c
SS
299 if (temp_bfd == NULL)
300 perror_with_name (filename);
301
2acceee2
JM
302 if (!bfd_check_format (temp_bfd, bfd_core) &&
303 !gdb_check_format (temp_bfd))
c906108c
SS
304 {
305 /* Do it after the err msg */
306 /* FIXME: should be checking for errors from bfd_close (for one thing,
c5aa993b
JM
307 on error it does not free all the storage associated with the
308 bfd). */
5c65bbb6 309 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 310 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
311 filename, bfd_errmsg (bfd_get_error ()));
312 }
313
314 /* Looks semi-reasonable. Toss the old core file and work on the new. */
315
c5aa993b 316 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
317 unpush_target (&core_ops);
318 core_bfd = temp_bfd;
74b7792f 319 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 320
0e24ac5d
MK
321 /* FIXME: kettenis/20031023: This is very dangerous. The
322 CORE_GDBARCH that results from this call may very well be
323 different from CURRENT_GDBARCH. However, its methods may only
324 work if it is selected as the current architecture, because they
325 rely on swapped data (see gdbarch.c). We should get rid of that
326 swapped data. */
327 core_gdbarch = gdbarch_from_bfd (core_bfd);
328
2acceee2
JM
329 /* Find a suitable core file handler to munch on core_bfd */
330 core_vec = sniff_core_bfd (core_bfd);
331
c906108c
SS
332 validate_files ();
333
334 /* Find the data section */
335 if (build_section_table (core_bfd, &core_ops.to_sections,
336 &core_ops.to_sections_end))
8a3fe4f8 337 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
338 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
339
2f1b5984
MK
340 /* If we have no exec file, try to set the architecture from the
341 core file. We don't do this unconditionally since an exec file
342 typically contains more information that helps us determine the
343 architecture than a core file. */
344 if (!exec_bfd)
345 set_gdbarch_from_file (core_bfd);
cbda0a99 346
c906108c
SS
347 ontop = !push_target (&core_ops);
348 discard_cleanups (old_chain);
349
20d2ca3e
AC
350 /* This is done first, before anything has a chance to query the
351 inferior for information such as symbols. */
9353355f 352 post_create_inferior (&core_ops, from_tty);
20d2ca3e 353
c906108c
SS
354 p = bfd_core_file_failing_command (core_bfd);
355 if (p)
a3f17187 356 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
357
358 siggy = bfd_core_file_failing_signal (core_bfd);
359 if (siggy > 0)
8e6a3c35 360 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 361 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
362 value is called ``target_signal'' and this function got the
363 name ..._from_host(). */
a3f17187 364 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
8e6a3c35 365 target_signal_to_string (target_signal_from_host (siggy)));
c906108c
SS
366
367 /* Build up thread list from BFD sections. */
368
369 init_thread_list ();
370 bfd_map_over_sections (core_bfd, add_to_thread_list,
371 bfd_get_section_by_name (core_bfd, ".reg"));
372
373 if (ontop)
374 {
375 /* Fetch all registers from core file. */
594f7785 376 target_fetch_registers (get_current_regcache (), -1);
c906108c 377
c906108c 378 /* Now, set up the frame cache, and print the top of stack. */
35f196d9 379 reinit_frame_cache ();
b04f3ab4 380 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
381 }
382 else
383 {
384 warning (
c5aa993b 385 "you won't be able to access this core file until you terminate\n\
c906108c
SS
386your %s; do ``info files''", target_longname);
387 }
388}
389
390static void
fba45db2 391core_detach (char *args, int from_tty)
c906108c
SS
392{
393 if (args)
8a3fe4f8 394 error (_("Too many arguments"));
c906108c
SS
395 unpush_target (&core_ops);
396 reinit_frame_cache ();
397 if (from_tty)
a3f17187 398 printf_filtered (_("No core file now.\n"));
c906108c
SS
399}
400
de57eccd
JM
401
402/* Try to retrieve registers from a section in core_bfd, and supply
403 them to core_vec->core_read_registers, as the register set numbered
404 WHICH.
405
39f77062
KB
406 If inferior_ptid is zero, do the single-threaded thing: look for a
407 section named NAME. If inferior_ptid is non-zero, do the
de57eccd 408 multi-threaded thing: look for a section named "NAME/PID", where
39f77062 409 PID is the shortest ASCII decimal representation of inferior_ptid.
de57eccd
JM
410
411 HUMAN_NAME is a human-readable name for the kind of registers the
412 NAME section contains, for use in error messages.
413
414 If REQUIRED is non-zero, print an error if the core file doesn't
415 have a section by the appropriate name. Otherwise, just do nothing. */
416
417static void
9eefc95f
UW
418get_core_register_section (struct regcache *regcache,
419 char *name,
de57eccd
JM
420 int which,
421 char *human_name,
422 int required)
423{
3ecda457 424 static char *section_name = NULL;
7be0c536 425 struct bfd_section *section;
de57eccd
JM
426 bfd_size_type size;
427 char *contents;
428
3ecda457 429 xfree (section_name);
39f77062 430 if (PIDGET (inferior_ptid))
3ecda457 431 section_name = xstrprintf ("%s/%d", name, PIDGET (inferior_ptid));
de57eccd 432 else
3ecda457 433 section_name = xstrdup (name);
de57eccd
JM
434
435 section = bfd_get_section_by_name (core_bfd, section_name);
436 if (! section)
437 {
438 if (required)
8a3fe4f8 439 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
440 return;
441 }
442
443 size = bfd_section_size (core_bfd, section);
444 contents = alloca (size);
445 if (! bfd_get_section_contents (core_bfd, section, contents,
446 (file_ptr) 0, size))
447 {
8a3fe4f8 448 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
449 human_name, name);
450 return;
451 }
452
0e24ac5d
MK
453 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
454 {
455 const struct regset *regset;
456
457 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
458 if (regset == NULL)
459 {
460 if (required)
8a3fe4f8 461 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
462 human_name);
463 return;
464 }
465
9eefc95f 466 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
467 return;
468 }
469
470 gdb_assert (core_vec);
9eefc95f 471 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
472 ((CORE_ADDR)
473 bfd_section_vma (core_bfd, section)));
474}
475
476
c906108c
SS
477/* Get the registers out of a core file. This is the machine-
478 independent part. Fetch_core_registers is the machine-dependent
479 part, typically implemented in the xm-file for each architecture. */
480
481/* We just get all the registers, so we don't use regno. */
482
c906108c 483static void
56be3814 484get_core_registers (struct regcache *regcache, int regno)
c906108c 485{
9c5ea4d9 486 int i;
c906108c 487
0e24ac5d
MK
488 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
489 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
490 {
491 fprintf_filtered (gdb_stderr,
c5aa993b 492 "Can't fetch registers from this type of core file\n");
c906108c
SS
493 return;
494 }
495
56be3814 496 get_core_register_section (regcache,
9eefc95f 497 ".reg", 0, "general-purpose", 1);
56be3814 498 get_core_register_section (regcache,
9eefc95f 499 ".reg2", 2, "floating-point", 0);
56be3814 500 get_core_register_section (regcache,
9eefc95f 501 ".reg-xfp", 3, "extended floating-point", 0);
06caf7d2
CES
502 get_core_register_section (regcache,
503 ".reg-ppc-vmx", 3, "ppc Altivec", 0);
c906108c 504
9c5ea4d9 505 /* Supply dummy value for all registers not found in the core. */
f57d151a 506 for (i = 0; i < gdbarch_num_regs (current_gdbarch); i++)
9c5ea4d9
UW
507 if (!regcache_valid_p (regcache, i))
508 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
509}
510
c906108c 511static void
fba45db2 512core_files_info (struct target_ops *t)
c906108c
SS
513{
514 print_section_info (t, core_bfd);
515}
e2544d02
RM
516\f
517static LONGEST
518core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
519 const char *annex, gdb_byte *readbuf,
520 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
521{
522 switch (object)
523 {
524 case TARGET_OBJECT_MEMORY:
525 if (readbuf)
7160c4c3
PA
526 return (*ops->deprecated_xfer_memory) (offset, readbuf,
527 len, 0/*write*/, NULL, ops);
e2544d02 528 if (writebuf)
7160c4c3
PA
529 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
530 len, 1/*write*/, NULL, ops);
e2544d02
RM
531 return -1;
532
533 case TARGET_OBJECT_AUXV:
534 if (readbuf)
535 {
536 /* When the aux vector is stored in core file, BFD
537 represents this with a fake section called ".auxv". */
538
c4c5b7ba 539 struct bfd_section *section;
e2544d02
RM
540 bfd_size_type size;
541 char *contents;
542
543 section = bfd_get_section_by_name (core_bfd, ".auxv");
544 if (section == NULL)
545 return -1;
546
547 size = bfd_section_size (core_bfd, section);
548 if (offset >= size)
549 return 0;
550 size -= offset;
551 if (size > len)
552 size = len;
403e1656
MK
553 if (size > 0
554 && !bfd_get_section_contents (core_bfd, section, readbuf,
555 (file_ptr) offset, size))
e2544d02 556 {
8a3fe4f8 557 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
558 return -1;
559 }
560
561 return size;
562 }
563 return -1;
564
403e1656
MK
565 case TARGET_OBJECT_WCOOKIE:
566 if (readbuf)
567 {
568 /* When the StackGhost cookie is stored in core file, BFD
569 represents this with a fake section called ".wcookie". */
570
571 struct bfd_section *section;
572 bfd_size_type size;
573 char *contents;
574
575 section = bfd_get_section_by_name (core_bfd, ".wcookie");
576 if (section == NULL)
577 return -1;
578
579 size = bfd_section_size (core_bfd, section);
580 if (offset >= size)
581 return 0;
582 size -= offset;
583 if (size > len)
584 size = len;
585 if (size > 0
586 && !bfd_get_section_contents (core_bfd, section, readbuf,
587 (file_ptr) offset, size))
588 {
8a3fe4f8 589 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
590 return -1;
591 }
592
593 return size;
594 }
595 return -1;
596
de584861
PA
597 case TARGET_OBJECT_LIBRARIES:
598 if (core_gdbarch
599 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
600 {
601 if (writebuf)
602 return -1;
603 return
604 gdbarch_core_xfer_shared_libraries (core_gdbarch,
605 readbuf, offset, len);
606 }
607 /* FALL THROUGH */
608
e2544d02
RM
609 default:
610 if (ops->beneath != NULL)
611 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
612 readbuf, writebuf, offset, len);
613 return -1;
614 }
615}
616
c906108c
SS
617\f
618/* If mourn is being called in all the right places, this could be say
619 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
620
621static int
8181d85f 622ignore (struct bp_target_info *bp_tgt)
c906108c
SS
623{
624 return 0;
625}
626
627
628/* Okay, let's be honest: threads gleaned from a core file aren't
629 exactly lively, are they? On the other hand, if we don't claim
630 that each & every one is alive, then we don't get any of them
631 to appear in an "info thread" command, which is quite a useful
632 behaviour.
c5aa993b 633 */
c906108c 634static int
39f77062 635core_file_thread_alive (ptid_t tid)
c906108c
SS
636{
637 return 1;
638}
639
4eb0ad19
DJ
640/* Ask the current architecture what it knows about this core file.
641 That will be used, in turn, to pick a better architecture. This
642 wrapper could be avoided if targets got a chance to specialize
643 core_ops. */
644
645static const struct target_desc *
646core_read_description (struct target_ops *target)
647{
648 if (gdbarch_core_read_description_p (current_gdbarch))
649 return gdbarch_core_read_description (current_gdbarch, target, core_bfd);
650
651 return NULL;
652}
653
c906108c
SS
654/* Fill in core_ops with its defined operations and properties. */
655
656static void
fba45db2 657init_core_ops (void)
c906108c
SS
658{
659 core_ops.to_shortname = "core";
660 core_ops.to_longname = "Local core dump file";
661 core_ops.to_doc =
662 "Use a core file as a target. Specify the filename of the core file.";
663 core_ops.to_open = core_open;
664 core_ops.to_close = core_close;
665 core_ops.to_attach = find_default_attach;
c906108c 666 core_ops.to_detach = core_detach;
c906108c 667 core_ops.to_fetch_registers = get_core_registers;
e2544d02 668 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 669 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
670 core_ops.to_files_info = core_files_info;
671 core_ops.to_insert_breakpoint = ignore;
672 core_ops.to_remove_breakpoint = ignore;
673 core_ops.to_create_inferior = find_default_create_inferior;
c906108c 674 core_ops.to_thread_alive = core_file_thread_alive;
4eb0ad19 675 core_ops.to_read_description = core_read_description;
c906108c
SS
676 core_ops.to_stratum = core_stratum;
677 core_ops.to_has_memory = 1;
678 core_ops.to_has_stack = 1;
679 core_ops.to_has_registers = 1;
c5aa993b 680 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
681}
682
683/* non-zero if we should not do the add_target call in
684 _initialize_corelow; not initialized (i.e., bss) so that
685 the target can initialize it (i.e., data) if appropriate.
686 This needs to be set at compile time because we don't know
687 for sure whether the target's initialize routine is called
688 before us or after us. */
689int coreops_suppress_target;
690
691void
fba45db2 692_initialize_corelow (void)
c906108c
SS
693{
694 init_core_ops ();
695
696 if (!coreops_suppress_target)
697 add_target (&core_ops);
698}
This page took 0.59799 seconds and 4 git commands to generate.