* README (`configure' options): Document GDB-specific options to
[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
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
739fc47a
PA
382 /* Need to flush the register cache (and the frame cache) from a
383 previous debug session. If inferior_ptid ends up the same as the
384 last debug session --- e.g., b foo; run; gcore core1; step; gcore
385 core2; core core1; core core2 --- then there's potential for
386 get_current_regcache to return the cached regcache of the
387 previous session, and the frame cache being stale. */
388 registers_changed ();
389
0de3b513
PA
390 /* Build up thread list from BFD sections, and possibly set the
391 current thread to the .reg/NN section matching the .reg
392 section. */
393 bfd_map_over_sections (core_bfd, add_to_thread_list,
394 bfd_get_section_by_name (core_bfd, ".reg"));
395
959b8724
PA
396 post_create_inferior (&core_ops, from_tty);
397
0de3b513
PA
398 /* Now go through the target stack looking for threads since there
399 may be a thread_stratum target loaded on top of target core by
400 now. The layer above should claim threads found in the BFD
401 sections. */
402 target_find_new_threads ();
403
c906108c
SS
404 p = bfd_core_file_failing_command (core_bfd);
405 if (p)
a3f17187 406 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
407
408 siggy = bfd_core_file_failing_signal (core_bfd);
409 if (siggy > 0)
8e6a3c35 410 /* NOTE: target_signal_from_host() converts a target signal value
e26cc349 411 into gdb's internal signal value. Unfortunately gdb's internal
8e6a3c35
AC
412 value is called ``target_signal'' and this function got the
413 name ..._from_host(). */
a3f17187 414 printf_filtered (_("Program terminated with signal %d, %s.\n"), siggy,
1cded358
AR
415 target_signal_to_string (
416 gdbarch_target_signal_from_host (core_gdbarch, siggy)));
c906108c 417
87ab71f0
PA
418 /* Fetch all registers from core file. */
419 target_fetch_registers (get_current_regcache (), -1);
c906108c 420
87ab71f0
PA
421 /* Now, set up the frame cache, and print the top of stack. */
422 reinit_frame_cache ();
423 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
424}
425
426static void
136d6dae 427core_detach (struct target_ops *ops, char *args, int from_tty)
c906108c
SS
428{
429 if (args)
8a3fe4f8 430 error (_("Too many arguments"));
136d6dae 431 unpush_target (ops);
c906108c
SS
432 reinit_frame_cache ();
433 if (from_tty)
a3f17187 434 printf_filtered (_("No core file now.\n"));
c906108c
SS
435}
436
de57eccd
JM
437
438/* Try to retrieve registers from a section in core_bfd, and supply
439 them to core_vec->core_read_registers, as the register set numbered
440 WHICH.
441
0de3b513
PA
442 If inferior_ptid's lwp member is zero, do the single-threaded
443 thing: look for a section named NAME. If inferior_ptid's lwp
444 member is non-zero, do the multi-threaded thing: look for a section
445 named "NAME/LWP", where LWP is the shortest ASCII decimal
446 representation of inferior_ptid's lwp member.
de57eccd
JM
447
448 HUMAN_NAME is a human-readable name for the kind of registers the
449 NAME section contains, for use in error messages.
450
451 If REQUIRED is non-zero, print an error if the core file doesn't
452 have a section by the appropriate name. Otherwise, just do nothing. */
453
454static void
9eefc95f
UW
455get_core_register_section (struct regcache *regcache,
456 char *name,
de57eccd
JM
457 int which,
458 char *human_name,
459 int required)
460{
3ecda457 461 static char *section_name = NULL;
7be0c536 462 struct bfd_section *section;
de57eccd
JM
463 bfd_size_type size;
464 char *contents;
465
3ecda457 466 xfree (section_name);
959b8724
PA
467
468 if (core_gdbarch
469 && gdbarch_core_reg_section_encodes_pid (core_gdbarch))
470 {
471 uint32_t merged_pid;
472
473 merged_pid = ptid_get_lwp (inferior_ptid);
474 merged_pid = merged_pid << 16 | ptid_get_pid (inferior_ptid);
475
476 section_name = xstrprintf ("%s/%s", name, plongest (merged_pid));
477 }
478 else if (ptid_get_lwp (inferior_ptid))
0de3b513 479 section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid));
de57eccd 480 else
3ecda457 481 section_name = xstrdup (name);
de57eccd
JM
482
483 section = bfd_get_section_by_name (core_bfd, section_name);
484 if (! section)
485 {
486 if (required)
8a3fe4f8 487 warning (_("Couldn't find %s registers in core file."), human_name);
de57eccd
JM
488 return;
489 }
490
491 size = bfd_section_size (core_bfd, section);
492 contents = alloca (size);
493 if (! bfd_get_section_contents (core_bfd, section, contents,
494 (file_ptr) 0, size))
495 {
8a3fe4f8 496 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
497 human_name, name);
498 return;
499 }
500
0e24ac5d
MK
501 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
502 {
503 const struct regset *regset;
504
505 regset = gdbarch_regset_from_core_section (core_gdbarch, name, size);
506 if (regset == NULL)
507 {
508 if (required)
8a3fe4f8 509 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
510 human_name);
511 return;
512 }
513
9eefc95f 514 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
515 return;
516 }
517
518 gdb_assert (core_vec);
9eefc95f 519 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
520 ((CORE_ADDR)
521 bfd_section_vma (core_bfd, section)));
522}
523
524
c906108c
SS
525/* Get the registers out of a core file. This is the machine-
526 independent part. Fetch_core_registers is the machine-dependent
527 part, typically implemented in the xm-file for each architecture. */
528
529/* We just get all the registers, so we don't use regno. */
530
c906108c 531static void
28439f5e
PA
532get_core_registers (struct target_ops *ops,
533 struct regcache *regcache, int regno)
c906108c 534{
9c5ea4d9 535 int i;
c906108c 536
0e24ac5d
MK
537 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
538 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
539 {
540 fprintf_filtered (gdb_stderr,
c5aa993b 541 "Can't fetch registers from this type of core file\n");
c906108c
SS
542 return;
543 }
544
56be3814 545 get_core_register_section (regcache,
9eefc95f 546 ".reg", 0, "general-purpose", 1);
56be3814 547 get_core_register_section (regcache,
9eefc95f 548 ".reg2", 2, "floating-point", 0);
56be3814 549 get_core_register_section (regcache,
9eefc95f 550 ".reg-xfp", 3, "extended floating-point", 0);
06caf7d2
CES
551 get_core_register_section (regcache,
552 ".reg-ppc-vmx", 3, "ppc Altivec", 0);
604c2f83
LM
553 get_core_register_section (regcache,
554 ".reg-ppc-vsx", 4, "POWER7 VSX", 0);
c906108c 555
9c5ea4d9 556 /* Supply dummy value for all registers not found in the core. */
13b8769f 557 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
9c5ea4d9
UW
558 if (!regcache_valid_p (regcache, i))
559 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
560}
561
c906108c 562static void
fba45db2 563core_files_info (struct target_ops *t)
c906108c
SS
564{
565 print_section_info (t, core_bfd);
566}
e2544d02
RM
567\f
568static LONGEST
569core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
570 const char *annex, gdb_byte *readbuf,
571 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
e2544d02
RM
572{
573 switch (object)
574 {
575 case TARGET_OBJECT_MEMORY:
576 if (readbuf)
7160c4c3 577 return (*ops->deprecated_xfer_memory) (offset, readbuf,
662fb31b 578 len, 0/*read*/, NULL, ops);
e2544d02 579 if (writebuf)
7160c4c3
PA
580 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
581 len, 1/*write*/, NULL, ops);
e2544d02
RM
582 return -1;
583
584 case TARGET_OBJECT_AUXV:
585 if (readbuf)
586 {
587 /* When the aux vector is stored in core file, BFD
588 represents this with a fake section called ".auxv". */
589
c4c5b7ba 590 struct bfd_section *section;
e2544d02
RM
591 bfd_size_type size;
592 char *contents;
593
594 section = bfd_get_section_by_name (core_bfd, ".auxv");
595 if (section == NULL)
596 return -1;
597
598 size = bfd_section_size (core_bfd, section);
599 if (offset >= size)
600 return 0;
601 size -= offset;
602 if (size > len)
603 size = len;
403e1656
MK
604 if (size > 0
605 && !bfd_get_section_contents (core_bfd, section, readbuf,
606 (file_ptr) offset, size))
e2544d02 607 {
8a3fe4f8 608 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
609 return -1;
610 }
611
612 return size;
613 }
614 return -1;
615
403e1656
MK
616 case TARGET_OBJECT_WCOOKIE:
617 if (readbuf)
618 {
619 /* When the StackGhost cookie is stored in core file, BFD
620 represents this with a fake section called ".wcookie". */
621
622 struct bfd_section *section;
623 bfd_size_type size;
624 char *contents;
625
626 section = bfd_get_section_by_name (core_bfd, ".wcookie");
627 if (section == NULL)
628 return -1;
629
630 size = bfd_section_size (core_bfd, section);
631 if (offset >= size)
632 return 0;
633 size -= offset;
634 if (size > len)
635 size = len;
636 if (size > 0
637 && !bfd_get_section_contents (core_bfd, section, readbuf,
638 (file_ptr) offset, size))
639 {
8a3fe4f8 640 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
641 return -1;
642 }
643
644 return size;
645 }
646 return -1;
647
de584861
PA
648 case TARGET_OBJECT_LIBRARIES:
649 if (core_gdbarch
650 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
651 {
652 if (writebuf)
653 return -1;
654 return
655 gdbarch_core_xfer_shared_libraries (core_gdbarch,
656 readbuf, offset, len);
657 }
658 /* FALL THROUGH */
659
e2544d02
RM
660 default:
661 if (ops->beneath != NULL)
662 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
663 readbuf, writebuf, offset, len);
664 return -1;
665 }
666}
667
c906108c
SS
668\f
669/* If mourn is being called in all the right places, this could be say
670 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
671
672static int
8181d85f 673ignore (struct bp_target_info *bp_tgt)
c906108c
SS
674{
675 return 0;
676}
677
678
679/* Okay, let's be honest: threads gleaned from a core file aren't
680 exactly lively, are they? On the other hand, if we don't claim
681 that each & every one is alive, then we don't get any of them
682 to appear in an "info thread" command, which is quite a useful
683 behaviour.
c5aa993b 684 */
c906108c 685static int
28439f5e 686core_thread_alive (struct target_ops *ops, ptid_t ptid)
c906108c
SS
687{
688 return 1;
689}
690
4eb0ad19
DJ
691/* Ask the current architecture what it knows about this core file.
692 That will be used, in turn, to pick a better architecture. This
693 wrapper could be avoided if targets got a chance to specialize
694 core_ops. */
695
696static const struct target_desc *
697core_read_description (struct target_ops *target)
698{
699 if (gdbarch_core_read_description_p (current_gdbarch))
700 return gdbarch_core_read_description (current_gdbarch, target, core_bfd);
701
702 return NULL;
703}
704
0de3b513 705static char *
117de6a9 706core_pid_to_str (struct target_ops *ops, ptid_t ptid)
0de3b513
PA
707{
708 static char buf[64];
709
28439f5e
PA
710 if (core_gdbarch
711 && gdbarch_core_pid_to_str_p (core_gdbarch))
712 {
713 char *ret = gdbarch_core_pid_to_str (core_gdbarch, ptid);
714 if (ret != NULL)
715 return ret;
716 }
717
0de3b513
PA
718 if (ptid_get_lwp (ptid) == 0)
719 xsnprintf (buf, sizeof buf, "<main task>");
720 else
721 xsnprintf (buf, sizeof buf, "Thread %ld", ptid_get_lwp (ptid));
722
723 return buf;
724}
725
c906108c
SS
726/* Fill in core_ops with its defined operations and properties. */
727
728static void
fba45db2 729init_core_ops (void)
c906108c
SS
730{
731 core_ops.to_shortname = "core";
732 core_ops.to_longname = "Local core dump file";
733 core_ops.to_doc =
734 "Use a core file as a target. Specify the filename of the core file.";
735 core_ops.to_open = core_open;
736 core_ops.to_close = core_close;
737 core_ops.to_attach = find_default_attach;
c906108c 738 core_ops.to_detach = core_detach;
c906108c 739 core_ops.to_fetch_registers = get_core_registers;
e2544d02 740 core_ops.to_xfer_partial = core_xfer_partial;
c8e73a31 741 core_ops.deprecated_xfer_memory = xfer_memory;
c906108c
SS
742 core_ops.to_files_info = core_files_info;
743 core_ops.to_insert_breakpoint = ignore;
744 core_ops.to_remove_breakpoint = ignore;
745 core_ops.to_create_inferior = find_default_create_inferior;
28439f5e 746 core_ops.to_thread_alive = core_thread_alive;
4eb0ad19 747 core_ops.to_read_description = core_read_description;
0de3b513 748 core_ops.to_pid_to_str = core_pid_to_str;
c906108c
SS
749 core_ops.to_stratum = core_stratum;
750 core_ops.to_has_memory = 1;
751 core_ops.to_has_stack = 1;
752 core_ops.to_has_registers = 1;
c5aa993b 753 core_ops.to_magic = OPS_MAGIC;
c906108c
SS
754}
755
c906108c 756void
fba45db2 757_initialize_corelow (void)
c906108c
SS
758{
759 init_core_ops ();
760
28439f5e 761 add_target (&core_ops);
c906108c 762}
This page took 0.622768 seconds and 4 git commands to generate.