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