]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/corelow.c
* inflow.h (our_process_group): Remove declaration.
[thirdparty/binutils-gdb.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
6aba47ca 3 Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
0fb0cc75 4 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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"
f90c07ac 47#include "filenames.h"
0e24ac5d 48
8e860359 49
ee28ca0f
AC
50#ifndef O_LARGEFILE
51#define O_LARGEFILE 0
52#endif
53
00e32a35
AC
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. */
c906108c
SS
57
58static struct core_fns *core_file_fns = NULL;
59
2acceee2
JM
60/* The core_fns for a core file handler that is prepared to read the core
61 file currently open on core_bfd. */
62
63static struct core_fns *core_vec = NULL;
64
0e24ac5d
MK
65/* FIXME: kettenis/20031023: Eventually this variable should
66 disappear. */
67
68struct gdbarch *core_gdbarch = NULL;
69
a14ed312 70static void core_files_info (struct target_ops *);
c906108c 71
a14ed312 72static struct core_fns *sniff_core_bfd (bfd *);
2acceee2 73
020cc13c 74static int gdb_check_format (bfd *);
2acceee2 75
a14ed312 76static void core_open (char *, int);
c906108c 77
136d6dae 78static void core_detach (struct target_ops *ops, char *, int);
c906108c 79
a14ed312 80static void core_close (int);
c906108c 81
74b7792f
AC
82static void core_close_cleanup (void *ignore);
83
4efb68b1 84static void add_to_thread_list (bfd *, asection *, void *);
c906108c 85
a14ed312 86static void init_core_ops (void);
c906108c 87
a14ed312 88void _initialize_corelow (void);
c906108c
SS
89
90struct target_ops core_ops;
91
7f9f62ba
PA
92/* An arbitrary identifier for the core inferior. */
93#define CORELOW_PID 1
94
c906108c
SS
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 {
959b8724 198 int pid = ptid_get_pid (inferior_ptid);
39f77062 199 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */
959b8724 200 delete_inferior_silent (pid);
c906108c 201
7a292a7a 202 /* Clear out solib state while the bfd is still open. See
c5aa993b 203 comments in clear_solib in solib.c. */
a77053c2 204 clear_solib ();
7a292a7a 205
c906108c
SS
206 name = bfd_get_filename (core_bfd);
207 if (!bfd_close (core_bfd))
8a3fe4f8 208 warning (_("cannot close \"%s\": %s"),
c906108c 209 name, bfd_errmsg (bfd_get_error ()));
b8c9b27d 210 xfree (name);
c906108c 211 core_bfd = NULL;
c906108c
SS
212 if (core_ops.to_sections)
213 {
b8c9b27d 214 xfree (core_ops.to_sections);
c906108c
SS
215 core_ops.to_sections = NULL;
216 core_ops.to_sections_end = NULL;
217 }
218 }
2acceee2 219 core_vec = NULL;
0e24ac5d 220 core_gdbarch = NULL;
c906108c
SS
221}
222
74b7792f
AC
223static void
224core_close_cleanup (void *ignore)
225{
226 core_close (0/*ignored*/);
227}
228
c906108c
SS
229/* Look for sections whose names start with `.reg/' so that we can extract the
230 list of threads in a core file. */
231
232static void
4efb68b1 233add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c 234{
0de3b513 235 ptid_t ptid;
c906108c
SS
236 int thread_id;
237 asection *reg_sect = (asection *) reg_sect_arg;
238
239 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
240 return;
241
242 thread_id = atoi (bfd_section_name (abfd, asect) + 5);
243
959b8724
PA
244 if (core_gdbarch
245 && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
246 {
247 uint32_t merged_pid = thread_id;
248 ptid = ptid_build (merged_pid & 0xffff,
249 merged_pid >> 16, 0);
250 }
251 else
252 ptid = ptid_build (ptid_get_pid (inferior_ptid), thread_id, 0);
0de3b513
PA
253
254 if (ptid_get_lwp (inferior_ptid) == 0)
255 /* The main thread has already been added before getting here, and
256 this is the first time we hear about a thread id. Assume this
257 is the main thread. */
258 thread_change_ptid (inferior_ptid, ptid);
259 else
260 /* Nope, really a new thread. */
261 add_thread (ptid);
c906108c
SS
262
263/* Warning, Will Robinson, looking at BFD private data! */
264
265 if (reg_sect != NULL
c5aa993b 266 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
0de3b513 267 inferior_ptid = ptid; /* Yes, make it current */
c906108c
SS
268}
269
270/* This routine opens and sets up the core file bfd. */
271
272static void
fba45db2 273core_open (char *filename, int from_tty)
c906108c
SS
274{
275 const char *p;
276 int siggy;
277 struct cleanup *old_chain;
278 char *temp;
279 bfd *temp_bfd;
c906108c 280 int scratch_chan;
ee28ca0f 281 int flags;
7f9f62ba 282 int corelow_pid = CORELOW_PID;
c906108c
SS
283
284 target_preopen (from_tty);
285 if (!filename)
286 {
8a3fe4f8
AC
287 if (core_bfd)
288 error (_("No core file specified. (Use `detach' to stop debugging a core file.)"));
289 else
290 error (_("No core file specified."));
c906108c
SS
291 }
292
293 filename = tilde_expand (filename);
f90c07ac 294 if (!IS_ABSOLUTE_PATH(filename))
c906108c 295 {
1754f103 296 temp = concat (current_directory, "/", filename, (char *)NULL);
b8c9b27d 297 xfree (filename);
c906108c
SS
298 filename = temp;
299 }
300
b8c9b27d 301 old_chain = make_cleanup (xfree, filename);
c906108c 302
ee28ca0f
AC
303 flags = O_BINARY | O_LARGEFILE;
304 if (write_files)
305 flags |= O_RDWR;
306 else
307 flags |= O_RDONLY;
308 scratch_chan = open (filename, flags, 0);
c906108c
SS
309 if (scratch_chan < 0)
310 perror_with_name (filename);
311
9f76c2cd
MM
312 temp_bfd = bfd_fopen (filename, gnutarget,
313 write_files ? FOPEN_RUB : FOPEN_RB,
314 scratch_chan);
c906108c
SS
315 if (temp_bfd == NULL)
316 perror_with_name (filename);
317
2acceee2
JM
318 if (!bfd_check_format (temp_bfd, bfd_core) &&
319 !gdb_check_format (temp_bfd))
c906108c
SS
320 {
321 /* Do it after the err msg */
322 /* FIXME: should be checking for errors from bfd_close (for one thing,
c5aa993b
JM
323 on error it does not free all the storage associated with the
324 bfd). */
5c65bbb6 325 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 326 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
327 filename, bfd_errmsg (bfd_get_error ()));
328 }
329
330 /* Looks semi-reasonable. Toss the old core file and work on the new. */
331
c5aa993b 332 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
333 unpush_target (&core_ops);
334 core_bfd = temp_bfd;
74b7792f 335 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 336
0e24ac5d
MK
337 /* FIXME: kettenis/20031023: This is very dangerous. The
338 CORE_GDBARCH that results from this call may very well be
339 different from CURRENT_GDBARCH. However, its methods may only
340 work if it is selected as the current architecture, because they
341 rely on swapped data (see gdbarch.c). We should get rid of that
342 swapped data. */
343 core_gdbarch = gdbarch_from_bfd (core_bfd);
344
2acceee2
JM
345 /* Find a suitable core file handler to munch on core_bfd */
346 core_vec = sniff_core_bfd (core_bfd);
347
c906108c
SS
348 validate_files ();
349
350 /* Find the data section */
351 if (build_section_table (core_bfd, &core_ops.to_sections,
352 &core_ops.to_sections_end))
8a3fe4f8 353 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
354 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
355
2f1b5984
MK
356 /* If we have no exec file, try to set the architecture from the
357 core file. We don't do this unconditionally since an exec file
358 typically contains more information that helps us determine the
359 architecture than a core file. */
360 if (!exec_bfd)
361 set_gdbarch_from_file (core_bfd);
cbda0a99 362
87ab71f0 363 push_target (&core_ops);
c906108c
SS
364 discard_cleanups (old_chain);
365
7f9f62ba
PA
366 add_inferior_silent (corelow_pid);
367
0de3b513
PA
368 /* Do this before acknowledging the inferior, so if
369 post_create_inferior throws (can happen easilly if you're loading
370 a core file with the wrong exec), we aren't left with threads
371 from the previous inferior. */
372 init_thread_list ();
373
374 /* Set INFERIOR_PTID early, so an upper layer can rely on it being
375 set while in the target_find_new_threads call below. */
376 inferior_ptid = pid_to_ptid (corelow_pid);
377
378 /* Assume ST --- Add a main task. We'll later detect when we go
379 from ST to MT. */
380 add_thread_silent (inferior_ptid);
381
0de3b513
PA
382 /* Build up thread list from BFD sections, and possibly set the
383 current thread to the .reg/NN section matching the .reg
384 section. */
385 bfd_map_over_sections (core_bfd, add_to_thread_list,
386 bfd_get_section_by_name (core_bfd, ".reg"));
387
959b8724
PA
388 post_create_inferior (&core_ops, from_tty);
389
0de3b513
PA
390 /* Now go through the target stack looking for threads since there
391 may be a thread_stratum target loaded on top of target core by
392 now. The layer above should claim threads found in the BFD
393 sections. */
394 target_find_new_threads ();
395
c906108c
SS
396 p = bfd_core_file_failing_command (core_bfd);
397 if (p)
a3f17187 398 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
399
400 siggy = bfd_core_file_failing_signal (core_bfd);
401 if (siggy > 0)
8e6a3c35 402 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 403 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
404 value is called ``target_signal'' and this function got the
405 name ..._from_host(). */
a3f17187 406 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
1cded358
AR
407 target_signal_to_string (
408 gdbarch_target_signal_from_host (core_gdbarch, siggy)));
c906108c 409
87ab71f0
PA
410 /* Fetch all registers from core file. */
411 target_fetch_registers (get_current_regcache (), -1);
c906108c 412
87ab71f0
PA
413 /* Now, set up the frame cache, and print the top of stack. */
414 reinit_frame_cache ();
415 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
416}
417
418static void
136d6dae 419core_detach (struct target_ops *ops, char *args, int from_tty)
c906108c
SS
420{
421 if (args)
8a3fe4f8 422 error (_("Too many arguments"));
136d6dae 423 unpush_target (ops);
c906108c
SS
424 reinit_frame_cache ();
425 if (from_tty)
a3f17187 426 printf_filtered (_("No core file now.\n"));
c906108c
SS
427}
428
de57eccd
JM
429
430/* Try to retrieve registers from a section in core_bfd, and supply
431 them to core_vec->core_read_registers, as the register set numbered
432 WHICH.
433
0de3b513
PA
434 If inferior_ptid's lwp member is zero, do the single-threaded
435 thing: look for a section named NAME. If inferior_ptid's lwp
436 member is non-zero, do the multi-threaded thing: look for a section
437 named "NAME/LWP", where LWP is the shortest ASCII decimal
438 representation of inferior_ptid's lwp member.
de57eccd
JM
439
440 HUMAN_NAME is a human-readable name for the kind of registers the
441 NAME section contains, for use in error messages.
442
443 If REQUIRED is non-zero, print an error if the core file doesn't
444 have a section by the appropriate name. Otherwise, just do nothing. */
445
446static void
9eefc95f
UW
447get_core_register_section (struct regcache *regcache,
448 char *name,
de57eccd
JM
449 int which,
450 char *human_name,
451 int required)
452{
3ecda457 453 static char *section_name = NULL;
7be0c536 454 struct bfd_section *section;
de57eccd
JM
455 bfd_size_type size;
456 char *contents;
457
3ecda457 458 xfree (section_name);
959b8724
PA
459
460 if (core_gdbarch
461 && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
462 {
463 uint32_t merged_pid;
464
465 merged_pid = ptid_get_lwp (inferior_ptid);
466 merged_pid = merged_pid << 16 | ptid_get_pid (inferior_ptid);
467
468 section_name = xstrprintf ("%s/%s", name, plongest (merged_pid));
469 }
470 else if (ptid_get_lwp (inferior_ptid))
0de3b513 471 section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
de57eccd 472 else
3ecda457 473 section_name = xstrdup (name);
de57eccd
JM
474
475 section = bfd_get_section_by_name (core_bfd, section_name);
476 if (! section)
477 {
478 if (required)
8a3fe4f8 479 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
480 return;
481 }
482
483 size = bfd_section_size (core_bfd, section);
484 contents = alloca (size);
485 if (! bfd_get_section_contents (core_bfd, section, contents,
486 (file_ptr) 0, size))
487 {
8a3fe4f8 488 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
489 human_name, name);
490 return;
491 }
492
0e24ac5d
MK
493 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
494 {
495 const struct regset *regset;
496
497 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
498 if (regset == NULL)
499 {
500 if (required)
8a3fe4f8 501 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
502 human_name);
503 return;
504 }
505
9eefc95f 506 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
507 return;
508 }
509
510 gdb_assert (core_vec);
9eefc95f 511 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
512 ((CORE_ADDR)
513 bfd_section_vma (core_bfd, section)));
514}
515
516
c906108c
SS
517/* Get the registers out of a core file. This is the machine-
518 independent part. Fetch_core_registers is the machine-dependent
519 part, typically implemented in the xm-file for each architecture. */
520
521/* We just get all the registers, so we don't use regno. */
522
c906108c 523static void
28439f5e
PA
524get_core_registers (struct target_ops *ops,
525 struct regcache *regcache, int regno)
c906108c 526{
9c5ea4d9 527 int i;
c906108c 528
0e24ac5d
MK
529 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
530 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
531 {
532 fprintf_filtered (gdb_stderr,
c5aa993b 533 "Can't fetch registers from this type of core file\n");
c906108c
SS
534 return;
535 }
536
56be3814 537 get_core_register_section (regcache,
9eefc95f 538 ".reg", 0, "general-purpose", 1);
56be3814 539 get_core_register_section (regcache,
9eefc95f 540 ".reg2", 2, "floating-point", 0);
56be3814 541 get_core_register_section (regcache,
9eefc95f 542 ".reg-xfp", 3, "extended floating-point", 0);
06caf7d2
CES
543 get_core_register_section (regcache,
544 ".reg-ppc-vmx", 3, "ppc Altivec", 0);
604c2f83
LM
545 get_core_register_section (regcache,
546 ".reg-ppc-vsx", 4, "POWER7 VSX", 0);
c906108c 547
9c5ea4d9 548 /* Supply dummy value for all registers not found in the core. */
13b8769f 549 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
9c5ea4d9
UW
550 if (!regcache_valid_p (regcache, i))
551 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
552}
553
c906108c 554static void
fba45db2 555core_files_info (struct target_ops *t)
c906108c
SS
556{
557 print_section_info (t, core_bfd);
558}
e2544d02
RM
559\f
560static LONGEST
561core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
562 const char *annex, gdb_byte *readbuf,
563 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
564{
565 switch (object)
566 {
567 case TARGET_OBJECT_MEMORY:
568 if (readbuf)
7160c4c3 569 return (*ops->deprecated_xfer_memory) (offset, readbuf,
662fb31b 570 len, 0/*read*/, NULL, ops);
e2544d02 571 if (writebuf)
7160c4c3
PA
572 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
573 len, 1/*write*/, NULL, ops);
e2544d02
RM
574 return -1;
575
576 case TARGET_OBJECT_AUXV:
577 if (readbuf)
578 {
579 /* When the aux vector is stored in core file, BFD
580 represents this with a fake section called ".auxv". */
581
c4c5b7ba 582 struct bfd_section *section;
e2544d02
RM
583 bfd_size_type size;
584 char *contents;
585
586 section = bfd_get_section_by_name (core_bfd, ".auxv");
587 if (section == NULL)
588 return -1;
589
590 size = bfd_section_size (core_bfd, section);
591 if (offset >= size)
592 return 0;
593 size -= offset;
594 if (size > len)
595 size = len;
403e1656
MK
596 if (size > 0
597 && !bfd_get_section_contents (core_bfd, section, readbuf,
598 (file_ptr) offset, size))
e2544d02 599 {
8a3fe4f8 600 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
601 return -1;
602 }
603
604 return size;
605 }
606 return -1;
607
403e1656
MK
608 case TARGET_OBJECT_WCOOKIE:
609 if (readbuf)
610 {
611 /* When the StackGhost cookie is stored in core file, BFD
612 represents this with a fake section called ".wcookie". */
613
614 struct bfd_section *section;
615 bfd_size_type size;
616 char *contents;
617
618 section = bfd_get_section_by_name (core_bfd, ".wcookie");
619 if (section == NULL)
620 return -1;
621
622 size = bfd_section_size (core_bfd, section);
623 if (offset >= size)
624 return 0;
625 size -= offset;
626 if (size > len)
627 size = len;
628 if (size > 0
629 && !bfd_get_section_contents (core_bfd, section, readbuf,
630 (file_ptr) offset, size))
631 {
8a3fe4f8 632 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
633 return -1;
634 }
635
636 return size;
637 }
638 return -1;
639
de584861
PA
640 case TARGET_OBJECT_LIBRARIES:
641 if (core_gdbarch
642 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
643 {
644 if (writebuf)
645 return -1;
646 return
647 gdbarch_core_xfer_shared_libraries (core_gdbarch,
648 readbuf, offset, len);
649 }
650 /* FALL THROUGH */
651
e2544d02
RM
652 default:
653 if (ops->beneath != NULL)
654 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
655 readbuf, writebuf, offset, len);
656 return -1;
657 }
658}
659
c906108c
SS
660\f
661/* If mourn is being called in all the right places, this could be say
662 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
663
664static int
8181d85f 665ignore (struct bp_target_info *bp_tgt)
c906108c
SS
666{
667 return 0;
668}
669
670
671/* Okay, let's be honest: threads gleaned from a core file aren't
672 exactly lively, are they? On the other hand, if we don't claim
673 that each & every one is alive, then we don't get any of them
674 to appear in an "info thread" command, which is quite a useful
675 behaviour.
c5aa993b 676 */
c906108c 677static int
28439f5e 678core_thread_alive (struct target_ops *ops, ptid_t ptid)
c906108c
SS
679{
680 return 1;
681}
682
4eb0ad19
DJ
683/* Ask the current architecture what it knows about this core file.
684 That will be used, in turn, to pick a better architecture. This
685 wrapper could be avoided if targets got a chance to specialize
686 core_ops. */
687
688static const struct target_desc *
689core_read_description (struct target_ops *target)
690{
691 if (gdbarch_core_read_description_p (current_gdbarch))
692 return gdbarch_core_read_description (current_gdbarch, target, core_bfd);
693
694 return NULL;
695}
696
0de3b513 697static char *
117de6a9 698core_pid_to_str (struct target_ops *ops, ptid_t ptid)
0de3b513
PA
699{
700 static char buf[64];
701
28439f5e
PA
702 if (core_gdbarch
703 && gdbarch_core_pid_to_str_p (core_gdbarch))
704 {
705 char *ret = gdbarch_core_pid_to_str (core_gdbarch, ptid);
706 if (ret != NULL)
707 return ret;
708 }
709
0de3b513
PA
710 if (ptid_get_lwp (ptid) == 0)
711 xsnprintf (buf, sizeof buf, "<main task>");
712 else
713 xsnprintf (buf, sizeof buf, "Thread %ld", ptid_get_lwp (ptid));
714
715 return buf;
716}
717
c906108c
SS
718/* Fill in core_ops with its defined operations and properties. */
719
720static void
fba45db2 721init_core_ops (void)
c906108c
SS
722{
723 core_ops.to_shortname = "core";
724 core_ops.to_longname = "Local core dump file";
725 core_ops.to_doc =
726 "Use a core file as a target. Specify the filename of the core file.";
727 core_ops.to_open = core_open;
728 core_ops.to_close = core_close;
729 core_ops.to_attach = find_default_attach;
c906108c 730 core_ops.to_detach = core_detach;
c906108c 731 core_ops.to_fetch_registers = get_core_registers;
e2544d02 732 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 733 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
734 core_ops.to_files_info = core_files_info;
735 core_ops.to_insert_breakpoint = ignore;
736 core_ops.to_remove_breakpoint = ignore;
737 core_ops.to_create_inferior = find_default_create_inferior;
28439f5e 738 core_ops.to_thread_alive = core_thread_alive;
4eb0ad19 739 core_ops.to_read_description = core_read_description;
0de3b513 740 core_ops.to_pid_to_str = core_pid_to_str;
c906108c
SS
741 core_ops.to_stratum = core_stratum;
742 core_ops.to_has_memory = 1;
743 core_ops.to_has_stack = 1;
744 core_ops.to_has_registers = 1;
c5aa993b 745 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
746}
747
c906108c 748void
fba45db2 749_initialize_corelow (void)
c906108c
SS
750{
751 init_core_ops ();
752
28439f5e 753 add_target (&core_ops);
c906108c 754}