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