]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/corelow.c
*** empty log message ***
[thirdparty/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. */
a77053c2 202 clear_solib ();
7a292a7a 203
c906108c
SS
204 name = bfd_get_filename (core_bfd);
205 if (!bfd_close (core_bfd))
8a3fe4f8 206 warning (_("cannot close \"%s\": %s"),
c906108c 207 name, bfd_errmsg (bfd_get_error ()));
b8c9b27d 208 xfree (name);
c906108c 209 core_bfd = NULL;
c906108c
SS
210 if (core_ops.to_sections)
211 {
b8c9b27d 212 xfree (core_ops.to_sections);
c906108c
SS
213 core_ops.to_sections = NULL;
214 core_ops.to_sections_end = NULL;
215 }
216 }
2acceee2 217 core_vec = NULL;
0e24ac5d 218 core_gdbarch = NULL;
c906108c
SS
219}
220
74b7792f
AC
221static void
222core_close_cleanup (void *ignore)
223{
224 core_close (0/*ignored*/);
225}
226
c906108c
SS
227/* Look for sections whose names start with `.reg/' so that we can extract the
228 list of threads in a core file. */
229
230static void
4efb68b1 231add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c
SS
232{
233 int thread_id;
234 asection *reg_sect = (asection *) reg_sect_arg;
235
236 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
237 return;
238
239 thread_id = atoi (bfd_section_name (abfd, asect) + 5);
240
39f77062 241 add_thread (pid_to_ptid (thread_id));
c906108c
SS
242
243/* Warning, Will Robinson, looking at BFD private data! */
244
245 if (reg_sect != NULL
c5aa993b 246 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
39f77062 247 inferior_ptid = pid_to_ptid (thread_id); /* Yes, make it current */
c906108c
SS
248}
249
250/* This routine opens and sets up the core file bfd. */
251
252static void
fba45db2 253core_open (char *filename, int from_tty)
c906108c
SS
254{
255 const char *p;
256 int siggy;
257 struct cleanup *old_chain;
258 char *temp;
259 bfd *temp_bfd;
260 int ontop;
261 int scratch_chan;
ee28ca0f 262 int flags;
c906108c
SS
263
264 target_preopen (from_tty);
265 if (!filename)
266 {
8a3fe4f8
AC
267 if (core_bfd)
268 error (_("No core file specified. (Use `detach' to stop debugging a core file.)"));
269 else
270 error (_("No core file specified."));
c906108c
SS
271 }
272
273 filename = tilde_expand (filename);
274 if (filename[0] != '/')
275 {
1754f103 276 temp = concat (current_directory, "/", filename, (char *)NULL);
b8c9b27d 277 xfree (filename);
c906108c
SS
278 filename = temp;
279 }
280
b8c9b27d 281 old_chain = make_cleanup (xfree, filename);
c906108c 282
ee28ca0f
AC
283 flags = O_BINARY | O_LARGEFILE;
284 if (write_files)
285 flags |= O_RDWR;
286 else
287 flags |= O_RDONLY;
288 scratch_chan = open (filename, flags, 0);
c906108c
SS
289 if (scratch_chan < 0)
290 perror_with_name (filename);
291
9f76c2cd
MM
292 temp_bfd = bfd_fopen (filename, gnutarget,
293 write_files ? FOPEN_RUB : FOPEN_RB,
294 scratch_chan);
c906108c
SS
295 if (temp_bfd == NULL)
296 perror_with_name (filename);
297
2acceee2
JM
298 if (!bfd_check_format (temp_bfd, bfd_core) &&
299 !gdb_check_format (temp_bfd))
c906108c
SS
300 {
301 /* Do it after the err msg */
302 /* FIXME: should be checking for errors from bfd_close (for one thing,
c5aa993b
JM
303 on error it does not free all the storage associated with the
304 bfd). */
5c65bbb6 305 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 306 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
307 filename, bfd_errmsg (bfd_get_error ()));
308 }
309
310 /* Looks semi-reasonable. Toss the old core file and work on the new. */
311
c5aa993b 312 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
313 unpush_target (&core_ops);
314 core_bfd = temp_bfd;
74b7792f 315 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 316
0e24ac5d
MK
317 /* FIXME: kettenis/20031023: This is very dangerous. The
318 CORE_GDBARCH that results from this call may very well be
319 different from CURRENT_GDBARCH. However, its methods may only
320 work if it is selected as the current architecture, because they
321 rely on swapped data (see gdbarch.c). We should get rid of that
322 swapped data. */
323 core_gdbarch = gdbarch_from_bfd (core_bfd);
324
2acceee2
JM
325 /* Find a suitable core file handler to munch on core_bfd */
326 core_vec = sniff_core_bfd (core_bfd);
327
c906108c
SS
328 validate_files ();
329
330 /* Find the data section */
331 if (build_section_table (core_bfd, &core_ops.to_sections,
332 &core_ops.to_sections_end))
8a3fe4f8 333 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
334 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
335
2f1b5984
MK
336 /* If we have no exec file, try to set the architecture from the
337 core file. We don't do this unconditionally since an exec file
338 typically contains more information that helps us determine the
339 architecture than a core file. */
340 if (!exec_bfd)
341 set_gdbarch_from_file (core_bfd);
cbda0a99 342
c906108c
SS
343 ontop = !push_target (&core_ops);
344 discard_cleanups (old_chain);
345
20d2ca3e
AC
346 /* This is done first, before anything has a chance to query the
347 inferior for information such as symbols. */
9353355f 348 post_create_inferior (&core_ops, from_tty);
20d2ca3e 349
c906108c
SS
350 p = bfd_core_file_failing_command (core_bfd);
351 if (p)
a3f17187 352 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
353
354 siggy = bfd_core_file_failing_signal (core_bfd);
355 if (siggy > 0)
8e6a3c35 356 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 357 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
358 value is called ``target_signal'' and this function got the
359 name ..._from_host(). */
a3f17187 360 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
8e6a3c35 361 target_signal_to_string (target_signal_from_host (siggy)));
c906108c
SS
362
363 /* Build up thread list from BFD sections. */
364
365 init_thread_list ();
366 bfd_map_over_sections (core_bfd, add_to_thread_list,
367 bfd_get_section_by_name (core_bfd, ".reg"));
368
369 if (ontop)
370 {
371 /* Fetch all registers from core file. */
594f7785 372 target_fetch_registers (get_current_regcache (), -1);
c906108c 373
c906108c 374 /* Now, set up the frame cache, and print the top of stack. */
35f196d9 375 reinit_frame_cache ();
b04f3ab4 376 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
377 }
378 else
379 {
380 warning (
c5aa993b 381 "you won't be able to access this core file until you terminate\n\
c906108c
SS
382your %s; do ``info files''", target_longname);
383 }
384}
385
386static void
fba45db2 387core_detach (char *args, int from_tty)
c906108c
SS
388{
389 if (args)
8a3fe4f8 390 error (_("Too many arguments"));
c906108c
SS
391 unpush_target (&core_ops);
392 reinit_frame_cache ();
393 if (from_tty)
a3f17187 394 printf_filtered (_("No core file now.\n"));
c906108c
SS
395}
396
de57eccd
JM
397
398/* Try to retrieve registers from a section in core_bfd, and supply
399 them to core_vec->core_read_registers, as the register set numbered
400 WHICH.
401
39f77062
KB
402 If inferior_ptid is zero, do the single-threaded thing: look for a
403 section named NAME. If inferior_ptid is non-zero, do the
de57eccd 404 multi-threaded thing: look for a section named "NAME/PID", where
39f77062 405 PID is the shortest ASCII decimal representation of inferior_ptid.
de57eccd
JM
406
407 HUMAN_NAME is a human-readable name for the kind of registers the
408 NAME section contains, for use in error messages.
409
410 If REQUIRED is non-zero, print an error if the core file doesn't
411 have a section by the appropriate name. Otherwise, just do nothing. */
412
413static void
9eefc95f
UW
414get_core_register_section (struct regcache *regcache,
415 char *name,
de57eccd
JM
416 int which,
417 char *human_name,
418 int required)
419{
3ecda457 420 static char *section_name = NULL;
7be0c536 421 struct bfd_section *section;
de57eccd
JM
422 bfd_size_type size;
423 char *contents;
424
3ecda457 425 xfree (section_name);
39f77062 426 if (PIDGET (inferior_ptid))
3ecda457 427 section_name = xstrprintf ("%s/%d", name, PIDGET (inferior_ptid));
de57eccd 428 else
3ecda457 429 section_name = xstrdup (name);
de57eccd
JM
430
431 section = bfd_get_section_by_name (core_bfd, section_name);
432 if (! section)
433 {
434 if (required)
8a3fe4f8 435 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
436 return;
437 }
438
439 size = bfd_section_size (core_bfd, section);
440 contents = alloca (size);
441 if (! bfd_get_section_contents (core_bfd, section, contents,
442 (file_ptr) 0, size))
443 {
8a3fe4f8 444 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
445 human_name, name);
446 return;
447 }
448
0e24ac5d
MK
449 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
450 {
451 const struct regset *regset;
452
453 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
454 if (regset == NULL)
455 {
456 if (required)
8a3fe4f8 457 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
458 human_name);
459 return;
460 }
461
9eefc95f 462 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
463 return;
464 }
465
466 gdb_assert (core_vec);
9eefc95f 467 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
468 ((CORE_ADDR)
469 bfd_section_vma (core_bfd, section)));
470}
471
472
c906108c
SS
473/* Get the registers out of a core file. This is the machine-
474 independent part. Fetch_core_registers is the machine-dependent
475 part, typically implemented in the xm-file for each architecture. */
476
477/* We just get all the registers, so we don't use regno. */
478
c906108c 479static void
56be3814 480get_core_registers (struct regcache *regcache, int regno)
c906108c 481{
9c5ea4d9 482 int i;
c906108c 483
0e24ac5d
MK
484 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
485 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
486 {
487 fprintf_filtered (gdb_stderr,
c5aa993b 488 "Can't fetch registers from this type of core file\n");
c906108c
SS
489 return;
490 }
491
56be3814 492 get_core_register_section (regcache,
9eefc95f 493 ".reg", 0, "general-purpose", 1);
56be3814 494 get_core_register_section (regcache,
9eefc95f 495 ".reg2", 2, "floating-point", 0);
56be3814 496 get_core_register_section (regcache,
9eefc95f 497 ".reg-xfp", 3, "extended floating-point", 0);
06caf7d2
CES
498 get_core_register_section (regcache,
499 ".reg-ppc-vmx", 3, "ppc Altivec", 0);
c906108c 500
9c5ea4d9 501 /* Supply dummy value for all registers not found in the core. */
13b8769f 502 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
9c5ea4d9
UW
503 if (!regcache_valid_p (regcache, i))
504 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
505}
506
c906108c 507static void
fba45db2 508core_files_info (struct target_ops *t)
c906108c
SS
509{
510 print_section_info (t, core_bfd);
511}
e2544d02
RM
512\f
513static LONGEST
514core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
515 const char *annex, gdb_byte *readbuf,
516 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
517{
518 switch (object)
519 {
520 case TARGET_OBJECT_MEMORY:
521 if (readbuf)
7160c4c3
PA
522 return (*ops->deprecated_xfer_memory) (offset, readbuf,
523 len, 0/*write*/, NULL, ops);
e2544d02 524 if (writebuf)
7160c4c3
PA
525 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
526 len, 1/*write*/, NULL, ops);
e2544d02
RM
527 return -1;
528
529 case TARGET_OBJECT_AUXV:
530 if (readbuf)
531 {
532 /* When the aux vector is stored in core file, BFD
533 represents this with a fake section called ".auxv". */
534
c4c5b7ba 535 struct bfd_section *section;
e2544d02
RM
536 bfd_size_type size;
537 char *contents;
538
539 section = bfd_get_section_by_name (core_bfd, ".auxv");
540 if (section == NULL)
541 return -1;
542
543 size = bfd_section_size (core_bfd, section);
544 if (offset >= size)
545 return 0;
546 size -= offset;
547 if (size > len)
548 size = len;
403e1656
MK
549 if (size > 0
550 && !bfd_get_section_contents (core_bfd, section, readbuf,
551 (file_ptr) offset, size))
e2544d02 552 {
8a3fe4f8 553 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
554 return -1;
555 }
556
557 return size;
558 }
559 return -1;
560
403e1656
MK
561 case TARGET_OBJECT_WCOOKIE:
562 if (readbuf)
563 {
564 /* When the StackGhost cookie is stored in core file, BFD
565 represents this with a fake section called ".wcookie". */
566
567 struct bfd_section *section;
568 bfd_size_type size;
569 char *contents;
570
571 section = bfd_get_section_by_name (core_bfd, ".wcookie");
572 if (section == NULL)
573 return -1;
574
575 size = bfd_section_size (core_bfd, section);
576 if (offset >= size)
577 return 0;
578 size -= offset;
579 if (size > len)
580 size = len;
581 if (size > 0
582 && !bfd_get_section_contents (core_bfd, section, readbuf,
583 (file_ptr) offset, size))
584 {
8a3fe4f8 585 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
586 return -1;
587 }
588
589 return size;
590 }
591 return -1;
592
de584861
PA
593 case TARGET_OBJECT_LIBRARIES:
594 if (core_gdbarch
595 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
596 {
597 if (writebuf)
598 return -1;
599 return
600 gdbarch_core_xfer_shared_libraries (core_gdbarch,
601 readbuf, offset, len);
602 }
603 /* FALL THROUGH */
604
e2544d02
RM
605 default:
606 if (ops->beneath != NULL)
607 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
608 readbuf, writebuf, offset, len);
609 return -1;
610 }
611}
612
c906108c
SS
613\f
614/* If mourn is being called in all the right places, this could be say
615 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
616
617static int
8181d85f 618ignore (struct bp_target_info *bp_tgt)
c906108c
SS
619{
620 return 0;
621}
622
623
624/* Okay, let's be honest: threads gleaned from a core file aren't
625 exactly lively, are they? On the other hand, if we don't claim
626 that each & every one is alive, then we don't get any of them
627 to appear in an "info thread" command, which is quite a useful
628 behaviour.
c5aa993b 629 */
c906108c 630static int
39f77062 631core_file_thread_alive (ptid_t tid)
c906108c
SS
632{
633 return 1;
634}
635
4eb0ad19
DJ
636/* Ask the current architecture what it knows about this core file.
637 That will be used, in turn, to pick a better architecture. This
638 wrapper could be avoided if targets got a chance to specialize
639 core_ops. */
640
641static const struct target_desc *
642core_read_description (struct target_ops *target)
643{
644 if (gdbarch_core_read_description_p (current_gdbarch))
645 return gdbarch_core_read_description (current_gdbarch, target, core_bfd);
646
647 return NULL;
648}
649
c906108c
SS
650/* Fill in core_ops with its defined operations and properties. */
651
652static void
fba45db2 653init_core_ops (void)
c906108c
SS
654{
655 core_ops.to_shortname = "core";
656 core_ops.to_longname = "Local core dump file";
657 core_ops.to_doc =
658 "Use a core file as a target. Specify the filename of the core file.";
659 core_ops.to_open = core_open;
660 core_ops.to_close = core_close;
661 core_ops.to_attach = find_default_attach;
c906108c 662 core_ops.to_detach = core_detach;
c906108c 663 core_ops.to_fetch_registers = get_core_registers;
e2544d02 664 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 665 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
666 core_ops.to_files_info = core_files_info;
667 core_ops.to_insert_breakpoint = ignore;
668 core_ops.to_remove_breakpoint = ignore;
669 core_ops.to_create_inferior = find_default_create_inferior;
c906108c 670 core_ops.to_thread_alive = core_file_thread_alive;
4eb0ad19 671 core_ops.to_read_description = core_read_description;
c906108c
SS
672 core_ops.to_stratum = core_stratum;
673 core_ops.to_has_memory = 1;
674 core_ops.to_has_stack = 1;
675 core_ops.to_has_registers = 1;
c5aa993b 676 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
677}
678
679/* non-zero if we should not do the add_target call in
680 _initialize_corelow; not initialized (i.e., bss) so that
681 the target can initialize it (i.e., data) if appropriate.
682 This needs to be set at compile time because we don't know
683 for sure whether the target's initialize routine is called
684 before us or after us. */
685int coreops_suppress_target;
686
687void
fba45db2 688_initialize_corelow (void)
c906108c
SS
689{
690 init_core_ops ();
691
692 if (!coreops_suppress_target)
693 add_target (&core_ops);
694}