]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/corelow.c
* breakpoint.c:
[thirdparty/binutils-gdb.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
197e01b6 3 Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
961cb7b5
MK
4 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
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
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
197e01b6
EZ
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, 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 {
1754f103 303 temp = concat (current_directory, "/", filename, (char *)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
9f76c2cd
MM
319 temp_bfd = bfd_fopen (filename, gnutarget,
320 write_files ? FOPEN_RUB : FOPEN_RB,
321 scratch_chan);
c906108c
SS
322 if (temp_bfd == NULL)
323 perror_with_name (filename);
324
2acceee2
JM
325 if (!bfd_check_format (temp_bfd, bfd_core) &&
326 !gdb_check_format (temp_bfd))
c906108c
SS
327 {
328 /* Do it after the err msg */
329 /* FIXME: should be checking for errors from bfd_close (for one thing,
c5aa993b
JM
330 on error it does not free all the storage associated with the
331 bfd). */
5c65bbb6 332 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 333 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
334 filename, bfd_errmsg (bfd_get_error ()));
335 }
336
337 /* Looks semi-reasonable. Toss the old core file and work on the new. */
338
c5aa993b 339 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
340 unpush_target (&core_ops);
341 core_bfd = temp_bfd;
74b7792f 342 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 343
0e24ac5d
MK
344 /* FIXME: kettenis/20031023: This is very dangerous. The
345 CORE_GDBARCH that results from this call may very well be
346 different from CURRENT_GDBARCH. However, its methods may only
347 work if it is selected as the current architecture, because they
348 rely on swapped data (see gdbarch.c). We should get rid of that
349 swapped data. */
350 core_gdbarch = gdbarch_from_bfd (core_bfd);
351
2acceee2
JM
352 /* Find a suitable core file handler to munch on core_bfd */
353 core_vec = sniff_core_bfd (core_bfd);
354
c906108c
SS
355 validate_files ();
356
357 /* Find the data section */
358 if (build_section_table (core_bfd, &core_ops.to_sections,
359 &core_ops.to_sections_end))
8a3fe4f8 360 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
361 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
362
2f1b5984
MK
363 /* If we have no exec file, try to set the architecture from the
364 core file. We don't do this unconditionally since an exec file
365 typically contains more information that helps us determine the
366 architecture than a core file. */
367 if (!exec_bfd)
368 set_gdbarch_from_file (core_bfd);
cbda0a99 369
c906108c
SS
370 ontop = !push_target (&core_ops);
371 discard_cleanups (old_chain);
372
20d2ca3e
AC
373 /* This is done first, before anything has a chance to query the
374 inferior for information such as symbols. */
375 observer_notify_inferior_created (&core_ops, from_tty);
376
c906108c
SS
377 p = bfd_core_file_failing_command (core_bfd);
378 if (p)
a3f17187 379 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
380
381 siggy = bfd_core_file_failing_signal (core_bfd);
382 if (siggy > 0)
8e6a3c35 383 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 384 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
385 value is called ``target_signal'' and this function got the
386 name ..._from_host(). */
a3f17187 387 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
8e6a3c35 388 target_signal_to_string (target_signal_from_host (siggy)));
c906108c
SS
389
390 /* Build up thread list from BFD sections. */
391
392 init_thread_list ();
393 bfd_map_over_sections (core_bfd, add_to_thread_list,
394 bfd_get_section_by_name (core_bfd, ".reg"));
395
396 if (ontop)
397 {
398 /* Fetch all registers from core file. */
399 target_fetch_registers (-1);
400
401 /* Add symbols and section mappings for any shared libraries. */
a77053c2 402 catch_errors (solib_add_stub, &from_tty, (char *) 0, RETURN_MASK_ALL);
c906108c
SS
403
404 /* Now, set up the frame cache, and print the top of stack. */
405 flush_cached_frames ();
0f7d239c 406 select_frame (get_current_frame ());
b04f3ab4 407 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
408 }
409 else
410 {
411 warning (
c5aa993b 412 "you won't be able to access this core file until you terminate\n\
c906108c
SS
413your %s; do ``info files''", target_longname);
414 }
415}
416
417static void
fba45db2 418core_detach (char *args, int from_tty)
c906108c
SS
419{
420 if (args)
8a3fe4f8 421 error (_("Too many arguments"));
c906108c
SS
422 unpush_target (&core_ops);
423 reinit_frame_cache ();
424 if (from_tty)
a3f17187 425 printf_filtered (_("No core file now.\n"));
c906108c
SS
426}
427
de57eccd
JM
428
429/* Try to retrieve registers from a section in core_bfd, and supply
430 them to core_vec->core_read_registers, as the register set numbered
431 WHICH.
432
39f77062
KB
433 If inferior_ptid is zero, do the single-threaded thing: look for a
434 section named NAME. If inferior_ptid is non-zero, do the
de57eccd 435 multi-threaded thing: look for a section named "NAME/PID", where
39f77062 436 PID is the shortest ASCII decimal representation of inferior_ptid.
de57eccd
JM
437
438 HUMAN_NAME is a human-readable name for the kind of registers the
439 NAME section contains, for use in error messages.
440
441 If REQUIRED is non-zero, print an error if the core file doesn't
442 have a section by the appropriate name. Otherwise, just do nothing. */
443
444static void
445get_core_register_section (char *name,
446 int which,
447 char *human_name,
448 int required)
449{
3ecda457 450 static char *section_name = NULL;
7be0c536 451 struct bfd_section *section;
de57eccd
JM
452 bfd_size_type size;
453 char *contents;
454
3ecda457 455 xfree (section_name);
39f77062 456 if (PIDGET (inferior_ptid))
3ecda457 457 section_name = xstrprintf ("%s/%d", name, PIDGET (inferior_ptid));
de57eccd 458 else
3ecda457 459 section_name = xstrdup (name);
de57eccd
JM
460
461 section = bfd_get_section_by_name (core_bfd, section_name);
462 if (! section)
463 {
464 if (required)
8a3fe4f8 465 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
466 return;
467 }
468
469 size = bfd_section_size (core_bfd, section);
470 contents = alloca (size);
471 if (! bfd_get_section_contents (core_bfd, section, contents,
472 (file_ptr) 0, size))
473 {
8a3fe4f8 474 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
475 human_name, name);
476 return;
477 }
478
0e24ac5d
MK
479 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
480 {
481 const struct regset *regset;
482
483 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
484 if (regset == NULL)
485 {
486 if (required)
8a3fe4f8 487 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
488 human_name);
489 return;
490 }
491
492 regset->supply_regset (regset, current_regcache, -1, contents, size);
493 return;
494 }
495
496 gdb_assert (core_vec);
e2544d02 497 core_vec->core_read_registers (contents, size, which,
de57eccd
JM
498 ((CORE_ADDR)
499 bfd_section_vma (core_bfd, section)));
500}
501
502
c906108c
SS
503/* Get the registers out of a core file. This is the machine-
504 independent part. Fetch_core_registers is the machine-dependent
505 part, typically implemented in the xm-file for each architecture. */
506
507/* We just get all the registers, so we don't use regno. */
508
c906108c 509static void
fba45db2 510get_core_registers (int regno)
c906108c 511{
de57eccd 512 int status;
c906108c 513
0e24ac5d
MK
514 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
515 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
516 {
517 fprintf_filtered (gdb_stderr,
c5aa993b 518 "Can't fetch registers from this type of core file\n");
c906108c
SS
519 return;
520 }
521
de57eccd
JM
522 get_core_register_section (".reg", 0, "general-purpose", 1);
523 get_core_register_section (".reg2", 2, "floating-point", 0);
524 get_core_register_section (".reg-xfp", 3, "extended floating-point", 0);
c906108c 525
2b9e5f3f 526 deprecated_registers_fetched ();
c906108c
SS
527}
528
c906108c 529static void
fba45db2 530core_files_info (struct target_ops *t)
c906108c
SS
531{
532 print_section_info (t, core_bfd);
533}
e2544d02
RM
534\f
535static LONGEST
536core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
537 const char *annex, gdb_byte *readbuf,
538 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
539{
540 switch (object)
541 {
542 case TARGET_OBJECT_MEMORY:
543 if (readbuf)
c8e73a31
AC
544 return (*ops->deprecated_xfer_memory) (offset, readbuf, len,
545 0/*write*/, NULL, ops);
e2544d02 546 if (writebuf)
c8e73a31
AC
547 return (*ops->deprecated_xfer_memory) (offset, readbuf, len,
548 1/*write*/, NULL, ops);
e2544d02
RM
549 return -1;
550
551 case TARGET_OBJECT_AUXV:
552 if (readbuf)
553 {
554 /* When the aux vector is stored in core file, BFD
555 represents this with a fake section called ".auxv". */
556
c4c5b7ba 557 struct bfd_section *section;
e2544d02
RM
558 bfd_size_type size;
559 char *contents;
560
561 section = bfd_get_section_by_name (core_bfd, ".auxv");
562 if (section == NULL)
563 return -1;
564
565 size = bfd_section_size (core_bfd, section);
566 if (offset >= size)
567 return 0;
568 size -= offset;
569 if (size > len)
570 size = len;
403e1656
MK
571 if (size > 0
572 && !bfd_get_section_contents (core_bfd, section, readbuf,
573 (file_ptr) offset, size))
e2544d02 574 {
8a3fe4f8 575 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
576 return -1;
577 }
578
579 return size;
580 }
581 return -1;
582
403e1656
MK
583 case TARGET_OBJECT_WCOOKIE:
584 if (readbuf)
585 {
586 /* When the StackGhost cookie is stored in core file, BFD
587 represents this with a fake section called ".wcookie". */
588
589 struct bfd_section *section;
590 bfd_size_type size;
591 char *contents;
592
593 section = bfd_get_section_by_name (core_bfd, ".wcookie");
594 if (section == NULL)
595 return -1;
596
597 size = bfd_section_size (core_bfd, section);
598 if (offset >= size)
599 return 0;
600 size -= offset;
601 if (size > len)
602 size = len;
603 if (size > 0
604 && !bfd_get_section_contents (core_bfd, section, readbuf,
605 (file_ptr) offset, size))
606 {
8a3fe4f8 607 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
608 return -1;
609 }
610
611 return size;
612 }
613 return -1;
614
e2544d02
RM
615 default:
616 if (ops->beneath != NULL)
617 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
618 readbuf, writebuf, offset, len);
619 return -1;
620 }
621}
622
c906108c
SS
623\f
624/* If mourn is being called in all the right places, this could be say
625 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
626
627static int
5a168c78 628ignore (CORE_ADDR addr, bfd_byte *contents)
c906108c
SS
629{
630 return 0;
631}
632
633
634/* Okay, let's be honest: threads gleaned from a core file aren't
635 exactly lively, are they? On the other hand, if we don't claim
636 that each & every one is alive, then we don't get any of them
637 to appear in an "info thread" command, which is quite a useful
638 behaviour.
c5aa993b 639 */
c906108c 640static int
39f77062 641core_file_thread_alive (ptid_t tid)
c906108c
SS
642{
643 return 1;
644}
645
646/* Fill in core_ops with its defined operations and properties. */
647
648static void
fba45db2 649init_core_ops (void)
c906108c
SS
650{
651 core_ops.to_shortname = "core";
652 core_ops.to_longname = "Local core dump file";
653 core_ops.to_doc =
654 "Use a core file as a target. Specify the filename of the core file.";
655 core_ops.to_open = core_open;
656 core_ops.to_close = core_close;
657 core_ops.to_attach = find_default_attach;
c906108c 658 core_ops.to_detach = core_detach;
c906108c 659 core_ops.to_fetch_registers = get_core_registers;
e2544d02 660 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 661 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
662 core_ops.to_files_info = core_files_info;
663 core_ops.to_insert_breakpoint = ignore;
664 core_ops.to_remove_breakpoint = ignore;
665 core_ops.to_create_inferior = find_default_create_inferior;
c906108c 666 core_ops.to_thread_alive = core_file_thread_alive;
c906108c
SS
667 core_ops.to_stratum = core_stratum;
668 core_ops.to_has_memory = 1;
669 core_ops.to_has_stack = 1;
670 core_ops.to_has_registers = 1;
c5aa993b 671 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
672}
673
674/* non-zero if we should not do the add_target call in
675 _initialize_corelow; not initialized (i.e., bss) so that
676 the target can initialize it (i.e., data) if appropriate.
677 This needs to be set at compile time because we don't know
678 for sure whether the target's initialize routine is called
679 before us or after us. */
680int coreops_suppress_target;
681
682void
fba45db2 683_initialize_corelow (void)
c906108c
SS
684{
685 init_core_ops ();
686
687 if (!coreops_suppress_target)
688 add_target (&core_ops);
689}