PR gas/13624
[deliverable/binutils-gdb.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
0b302171
JB
3 Copyright (C) 1986-1987, 1989, 1991-2001, 2003-2012 Free Software
4 Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
0e24ac5d 22#include "arch-utils.h"
c906108c
SS
23#include "gdb_string.h"
24#include <errno.h>
25#include <signal.h>
26#include <fcntl.h>
fc24370e
MS
27#ifdef HAVE_SYS_FILE_H
28#include <sys/file.h> /* needed for F_OK and friends */
29#endif
c5aa993b 30#include "frame.h" /* required by inferior.h */
c906108c
SS
31#include "inferior.h"
32#include "symtab.h"
33#include "command.h"
34#include "bfd.h"
35#include "target.h"
36#include "gdbcore.h"
37#include "gdbthread.h"
4e052eda 38#include "regcache.h"
0e24ac5d 39#include "regset.h"
990f9fe3 40#include "symfile.h"
4646aa9d 41#include "exec.h"
dbda9972 42#include "readline/readline.h"
0e24ac5d 43#include "gdb_assert.h"
60250e8b 44#include "exceptions.h"
a77053c2 45#include "solib.h"
f90c07ac 46#include "filenames.h"
6c95b8df 47#include "progspace.h"
516ba659 48#include "objfiles.h"
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
aff410f1
MS
60/* The core_fns for a core file handler that is prepared to read the
61 core file currently open on core_bfd. */
2acceee2
JM
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
07b82ea5
PA
70/* Per-core data. Currently, only the section table. Note that these
71 target sections are *not* mapped in the current address spaces' set
72 of target sections --- those should come only from pure executable
73 or shared library bfds. The core bfd sections are an
74 implementation detail of the core target, just like ptrace is for
75 unix child targets. */
76static struct target_section_table *core_data;
77
3cdd9356
PA
78/* True if we needed to fake the pid of the loaded core inferior. */
79static int core_has_fake_pid = 0;
80
a14ed312 81static void core_files_info (struct target_ops *);
c906108c 82
a14ed312 83static struct core_fns *sniff_core_bfd (bfd *);
2acceee2 84
020cc13c 85static int gdb_check_format (bfd *);
2acceee2 86
a14ed312 87static void core_open (char *, int);
c906108c 88
136d6dae 89static void core_detach (struct target_ops *ops, char *, int);
c906108c 90
a14ed312 91static void core_close (int);
c906108c 92
74b7792f
AC
93static void core_close_cleanup (void *ignore);
94
4efb68b1 95static void add_to_thread_list (bfd *, asection *, void *);
c906108c 96
a14ed312 97static void init_core_ops (void);
c906108c 98
a14ed312 99void _initialize_corelow (void);
c906108c 100
c0edd9ed 101static struct target_ops core_ops;
c906108c 102
7f9f62ba
PA
103/* An arbitrary identifier for the core inferior. */
104#define CORELOW_PID 1
105
aff410f1
MS
106/* Link a new core_fns into the global core_file_fns list. Called on
107 gdb startup by the _initialize routine in each core file register
b021a221 108 reader, to register information about each format the reader is
aff410f1 109 prepared to handle. */
c906108c
SS
110
111void
00e32a35 112deprecated_add_core_fns (struct core_fns *cf)
c906108c 113{
c5aa993b 114 cf->next = core_file_fns;
c906108c
SS
115 core_file_fns = cf;
116}
117
2acceee2
JM
118/* The default function that core file handlers can use to examine a
119 core file BFD and decide whether or not to accept the job of
aff410f1 120 reading the core file. */
2acceee2
JM
121
122int
fba45db2 123default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
2acceee2
JM
124{
125 int result;
126
127 result = (bfd_get_flavour (abfd) == our_fns -> core_flavour);
128 return (result);
129}
130
131/* Walk through the list of core functions to find a set that can
06b9f45f 132 handle the core file open on ABFD. Returns pointer to set that is
aff410f1 133 selected. */
2acceee2
JM
134
135static struct core_fns *
fba45db2 136sniff_core_bfd (bfd *abfd)
2acceee2
JM
137{
138 struct core_fns *cf;
139 struct core_fns *yummy = NULL;
140 int matches = 0;;
141
aff410f1
MS
142 /* Don't sniff if we have support for register sets in
143 CORE_GDBARCH. */
0e24ac5d
MK
144 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
145 return NULL;
146
2acceee2
JM
147 for (cf = core_file_fns; cf != NULL; cf = cf->next)
148 {
149 if (cf->core_sniffer (cf, abfd))
150 {
151 yummy = cf;
152 matches++;
153 }
154 }
155 if (matches > 1)
156 {
8a3fe4f8 157 warning (_("\"%s\": ambiguous core format, %d handlers match"),
2acceee2
JM
158 bfd_get_filename (abfd), matches);
159 }
160 else if (matches == 0)
06b9f45f
JK
161 error (_("\"%s\": no core file handler recognizes format"),
162 bfd_get_filename (abfd));
163
2acceee2
JM
164 return (yummy);
165}
166
167/* The default is to reject every core file format we see. Either
168 BFD has to recognize it, or we have to provide a function in the
aff410f1 169 core file handler that recognizes it. */
2acceee2
JM
170
171int
fba45db2 172default_check_format (bfd *abfd)
2acceee2
JM
173{
174 return (0);
175}
176
aff410f1 177/* Attempt to recognize core file formats that BFD rejects. */
2acceee2 178
020cc13c 179static int
fba45db2 180gdb_check_format (bfd *abfd)
2acceee2
JM
181{
182 struct core_fns *cf;
183
184 for (cf = core_file_fns; cf != NULL; cf = cf->next)
185 {
186 if (cf->check_format (abfd))
187 {
81a9a963 188 return (1);
2acceee2
JM
189 }
190 }
81a9a963 191 return (0);
2acceee2 192}
c906108c 193
aff410f1
MS
194/* Discard all vestiges of any previous core file and mark data and
195 stack spaces as empty. */
c906108c 196
c906108c 197static void
fba45db2 198core_close (int quitting)
c906108c
SS
199{
200 char *name;
201
202 if (core_bfd)
203 {
959b8724 204 int pid = ptid_get_pid (inferior_ptid);
aff410f1
MS
205 inferior_ptid = null_ptid; /* Avoid confusion from thread
206 stuff. */
06b9f45f
JK
207 if (pid != 0)
208 exit_inferior_silent (pid);
c906108c 209
aff410f1
MS
210 /* Clear out solib state while the bfd is still open. See
211 comments in clear_solib in solib.c. */
a77053c2 212 clear_solib ();
7a292a7a 213
06b9f45f
JK
214 if (core_data)
215 {
216 xfree (core_data->sections);
217 xfree (core_data);
218 core_data = NULL;
219 }
3cdd9356 220 core_has_fake_pid = 0;
07b82ea5 221
c906108c 222 name = bfd_get_filename (core_bfd);
516ba659 223 gdb_bfd_close_or_warn (core_bfd);
b8c9b27d 224 xfree (name);
c906108c 225 core_bfd = NULL;
c906108c 226 }
2acceee2 227 core_vec = NULL;
0e24ac5d 228 core_gdbarch = NULL;
c906108c
SS
229}
230
74b7792f
AC
231static void
232core_close_cleanup (void *ignore)
233{
234 core_close (0/*ignored*/);
235}
236
aff410f1
MS
237/* Look for sections whose names start with `.reg/' so that we can
238 extract the list of threads in a core file. */
c906108c
SS
239
240static void
4efb68b1 241add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c 242{
0de3b513 243 ptid_t ptid;
3cdd9356
PA
244 int core_tid;
245 int pid, lwpid;
c906108c
SS
246 asection *reg_sect = (asection *) reg_sect_arg;
247
248 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
249 return;
250
3cdd9356 251 core_tid = atoi (bfd_section_name (abfd, asect) + 5);
c906108c 252
261b8d08
PA
253 pid = bfd_core_file_pid (core_bfd);
254 if (pid == 0)
3cdd9356
PA
255 {
256 core_has_fake_pid = 1;
257 pid = CORELOW_PID;
3cdd9356 258 }
0de3b513 259
261b8d08
PA
260 lwpid = core_tid;
261
6c95b8df
PA
262 if (current_inferior ()->pid == 0)
263 inferior_appeared (current_inferior (), pid);
3cdd9356
PA
264
265 ptid = ptid_build (pid, lwpid, 0);
266
267 add_thread (ptid);
c906108c
SS
268
269/* Warning, Will Robinson, looking at BFD private data! */
270
271 if (reg_sect != NULL
aff410f1
MS
272 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
273 inferior_ptid = ptid; /* Yes, make it current. */
c906108c
SS
274}
275
276/* This routine opens and sets up the core file bfd. */
277
278static void
fba45db2 279core_open (char *filename, int from_tty)
c906108c
SS
280{
281 const char *p;
282 int siggy;
283 struct cleanup *old_chain;
284 char *temp;
285 bfd *temp_bfd;
c906108c 286 int scratch_chan;
ee28ca0f 287 int flags;
8e7b59a5 288 volatile struct gdb_exception except;
c906108c
SS
289
290 target_preopen (from_tty);
291 if (!filename)
292 {
8a3fe4f8 293 if (core_bfd)
3e43a32a
MS
294 error (_("No core file specified. (Use `detach' "
295 "to stop debugging a core file.)"));
8a3fe4f8
AC
296 else
297 error (_("No core file specified."));
c906108c
SS
298 }
299
300 filename = tilde_expand (filename);
aff410f1 301 if (!IS_ABSOLUTE_PATH (filename))
c906108c 302 {
aff410f1
MS
303 temp = concat (current_directory, "/",
304 filename, (char *) NULL);
b8c9b27d 305 xfree (filename);
c906108c
SS
306 filename = temp;
307 }
308
b8c9b27d 309 old_chain = make_cleanup (xfree, filename);
c906108c 310
ee28ca0f
AC
311 flags = O_BINARY | O_LARGEFILE;
312 if (write_files)
313 flags |= O_RDWR;
314 else
315 flags |= O_RDONLY;
316 scratch_chan = open (filename, flags, 0);
c906108c
SS
317 if (scratch_chan < 0)
318 perror_with_name (filename);
319
9f76c2cd
MM
320 temp_bfd = bfd_fopen (filename, gnutarget,
321 write_files ? FOPEN_RUB : FOPEN_RB,
322 scratch_chan);
c906108c
SS
323 if (temp_bfd == NULL)
324 perror_with_name (filename);
325
5aafa1cc
PM
326 if (!bfd_check_format (temp_bfd, bfd_core)
327 && !gdb_check_format (temp_bfd))
c906108c
SS
328 {
329 /* Do it after the err msg */
aff410f1
MS
330 /* FIXME: should be checking for errors from bfd_close (for one
331 thing, on error it does not free all the storage associated
332 with the bfd). */
5c65bbb6 333 make_cleanup_bfd_close (temp_bfd);
8a3fe4f8 334 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
335 filename, bfd_errmsg (bfd_get_error ()));
336 }
337
aff410f1
MS
338 /* Looks semi-reasonable. Toss the old core file and work on the
339 new. */
c906108c 340
c5aa993b 341 discard_cleanups (old_chain); /* Don't free filename any more */
c906108c
SS
342 unpush_target (&core_ops);
343 core_bfd = temp_bfd;
74b7792f 344 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 345
0e24ac5d
MK
346 /* FIXME: kettenis/20031023: This is very dangerous. The
347 CORE_GDBARCH that results from this call may very well be
348 different from CURRENT_GDBARCH. However, its methods may only
349 work if it is selected as the current architecture, because they
350 rely on swapped data (see gdbarch.c). We should get rid of that
351 swapped data. */
352 core_gdbarch = gdbarch_from_bfd (core_bfd);
353
2acceee2
JM
354 /* Find a suitable core file handler to munch on core_bfd */
355 core_vec = sniff_core_bfd (core_bfd);
356
c906108c
SS
357 validate_files ();
358
07b82ea5
PA
359 core_data = XZALLOC (struct target_section_table);
360
c906108c 361 /* Find the data section */
07b82ea5 362 if (build_section_table (core_bfd,
aff410f1
MS
363 &core_data->sections,
364 &core_data->sections_end))
8a3fe4f8 365 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
366 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
367
2f1b5984
MK
368 /* If we have no exec file, try to set the architecture from the
369 core file. We don't do this unconditionally since an exec file
370 typically contains more information that helps us determine the
371 architecture than a core file. */
372 if (!exec_bfd)
373 set_gdbarch_from_file (core_bfd);
cbda0a99 374
87ab71f0 375 push_target (&core_ops);
c906108c
SS
376 discard_cleanups (old_chain);
377
0de3b513
PA
378 /* Do this before acknowledging the inferior, so if
379 post_create_inferior throws (can happen easilly if you're loading
380 a core file with the wrong exec), we aren't left with threads
381 from the previous inferior. */
382 init_thread_list ();
383
3cdd9356
PA
384 inferior_ptid = null_ptid;
385 core_has_fake_pid = 0;
0de3b513 386
739fc47a
PA
387 /* Need to flush the register cache (and the frame cache) from a
388 previous debug session. If inferior_ptid ends up the same as the
389 last debug session --- e.g., b foo; run; gcore core1; step; gcore
390 core2; core core1; core core2 --- then there's potential for
391 get_current_regcache to return the cached regcache of the
392 previous session, and the frame cache being stale. */
393 registers_changed ();
394
0de3b513
PA
395 /* Build up thread list from BFD sections, and possibly set the
396 current thread to the .reg/NN section matching the .reg
aff410f1 397 section. */
0de3b513
PA
398 bfd_map_over_sections (core_bfd, add_to_thread_list,
399 bfd_get_section_by_name (core_bfd, ".reg"));
400
3cdd9356
PA
401 if (ptid_equal (inferior_ptid, null_ptid))
402 {
403 /* Either we found no .reg/NN section, and hence we have a
404 non-threaded core (single-threaded, from gdb's perspective),
405 or for some reason add_to_thread_list couldn't determine
406 which was the "main" thread. The latter case shouldn't
407 usually happen, but we're dealing with input here, which can
408 always be broken in different ways. */
409 struct thread_info *thread = first_thread_of_process (-1);
c5504eaf 410
3cdd9356
PA
411 if (thread == NULL)
412 {
c45ceae0 413 inferior_appeared (current_inferior (), CORELOW_PID);
3cdd9356
PA
414 inferior_ptid = pid_to_ptid (CORELOW_PID);
415 add_thread_silent (inferior_ptid);
416 }
417 else
418 switch_to_thread (thread->ptid);
419 }
420
959b8724
PA
421 post_create_inferior (&core_ops, from_tty);
422
0de3b513
PA
423 /* Now go through the target stack looking for threads since there
424 may be a thread_stratum target loaded on top of target core by
425 now. The layer above should claim threads found in the BFD
426 sections. */
8e7b59a5
KS
427 TRY_CATCH (except, RETURN_MASK_ERROR)
428 {
429 target_find_new_threads ();
430 }
431
432 if (except.reason < 0)
433 exception_print (gdb_stderr, except);
0de3b513 434
c906108c
SS
435 p = bfd_core_file_failing_command (core_bfd);
436 if (p)
a3f17187 437 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
438
439 siggy = bfd_core_file_failing_signal (core_bfd);
440 if (siggy > 0)
423ec54c 441 {
aff410f1
MS
442 /* NOTE: target_signal_from_host() converts a target signal
443 value into gdb's internal signal value. Unfortunately gdb's
444 internal value is called ``target_signal'' and this function
445 got the name ..._from_host(). */
423ec54c 446 enum target_signal sig = (core_gdbarch != NULL
aff410f1
MS
447 ? gdbarch_target_signal_from_host (core_gdbarch,
448 siggy)
423ec54c
JK
449 : target_signal_from_host (siggy));
450
aff410f1
MS
451 printf_filtered (_("Program terminated with signal %d, %s.\n"),
452 siggy, target_signal_to_string (sig));
423ec54c 453 }
c906108c 454
87ab71f0
PA
455 /* Fetch all registers from core file. */
456 target_fetch_registers (get_current_regcache (), -1);
c906108c 457
87ab71f0
PA
458 /* Now, set up the frame cache, and print the top of stack. */
459 reinit_frame_cache ();
460 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
461}
462
463static void
136d6dae 464core_detach (struct target_ops *ops, char *args, int from_tty)
c906108c
SS
465{
466 if (args)
8a3fe4f8 467 error (_("Too many arguments"));
136d6dae 468 unpush_target (ops);
c906108c
SS
469 reinit_frame_cache ();
470 if (from_tty)
a3f17187 471 printf_filtered (_("No core file now.\n"));
c906108c
SS
472}
473
07b82ea5
PA
474#ifdef DEPRECATED_IBM6000_TARGET
475
476/* Resize the core memory's section table, by NUM_ADDED. Returns a
477 pointer into the first new slot. This will not be necessary when
478 the rs6000 target is converted to use the standard solib
479 framework. */
480
481struct target_section *
482deprecated_core_resize_section_table (int num_added)
483{
484 int old_count;
485
486 old_count = resize_section_table (core_data, num_added);
487 return core_data->sections + old_count;
488}
489
490#endif
de57eccd
JM
491
492/* Try to retrieve registers from a section in core_bfd, and supply
493 them to core_vec->core_read_registers, as the register set numbered
494 WHICH.
495
0de3b513
PA
496 If inferior_ptid's lwp member is zero, do the single-threaded
497 thing: look for a section named NAME. If inferior_ptid's lwp
498 member is non-zero, do the multi-threaded thing: look for a section
499 named "NAME/LWP", where LWP is the shortest ASCII decimal
500 representation of inferior_ptid's lwp member.
de57eccd
JM
501
502 HUMAN_NAME is a human-readable name for the kind of registers the
503 NAME section contains, for use in error messages.
504
505 If REQUIRED is non-zero, print an error if the core file doesn't
aff410f1
MS
506 have a section by the appropriate name. Otherwise, just do
507 nothing. */
de57eccd
JM
508
509static void
9eefc95f 510get_core_register_section (struct regcache *regcache,
1b1818e4 511 const char *name,
de57eccd 512 int which,
1b1818e4 513 const char *human_name,
de57eccd
JM
514 int required)
515{
3ecda457 516 static char *section_name = NULL;
7be0c536 517 struct bfd_section *section;
de57eccd
JM
518 bfd_size_type size;
519 char *contents;
520
3ecda457 521 xfree (section_name);
959b8724 522
261b8d08 523 if (ptid_get_lwp (inferior_ptid))
aff410f1
MS
524 section_name = xstrprintf ("%s/%ld", name,
525 ptid_get_lwp (inferior_ptid));
de57eccd 526 else
3ecda457 527 section_name = xstrdup (name);
de57eccd
JM
528
529 section = bfd_get_section_by_name (core_bfd, section_name);
530 if (! section)
531 {
532 if (required)
aff410f1
MS
533 warning (_("Couldn't find %s registers in core file."),
534 human_name);
de57eccd
JM
535 return;
536 }
537
538 size = bfd_section_size (core_bfd, section);
539 contents = alloca (size);
540 if (! bfd_get_section_contents (core_bfd, section, contents,
541 (file_ptr) 0, size))
542 {
8a3fe4f8 543 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
544 human_name, name);
545 return;
546 }
547
0e24ac5d
MK
548 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
549 {
550 const struct regset *regset;
551
aff410f1
MS
552 regset = gdbarch_regset_from_core_section (core_gdbarch,
553 name, size);
0e24ac5d
MK
554 if (regset == NULL)
555 {
556 if (required)
8a3fe4f8 557 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
558 human_name);
559 return;
560 }
561
9eefc95f 562 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
563 return;
564 }
565
566 gdb_assert (core_vec);
9eefc95f 567 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
568 ((CORE_ADDR)
569 bfd_section_vma (core_bfd, section)));
570}
571
572
c906108c
SS
573/* Get the registers out of a core file. This is the machine-
574 independent part. Fetch_core_registers is the machine-dependent
aff410f1
MS
575 part, typically implemented in the xm-file for each
576 architecture. */
c906108c
SS
577
578/* We just get all the registers, so we don't use regno. */
579
c906108c 580static void
28439f5e
PA
581get_core_registers (struct target_ops *ops,
582 struct regcache *regcache, int regno)
c906108c 583{
1b1818e4 584 struct core_regset_section *sect_list;
9c5ea4d9 585 int i;
c906108c 586
0e24ac5d
MK
587 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
588 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
589 {
590 fprintf_filtered (gdb_stderr,
c5aa993b 591 "Can't fetch registers from this type of core file\n");
c906108c
SS
592 return;
593 }
594
1b1818e4
UW
595 sect_list = gdbarch_core_regset_sections (get_regcache_arch (regcache));
596 if (sect_list)
597 while (sect_list->sect_name != NULL)
598 {
599 if (strcmp (sect_list->sect_name, ".reg") == 0)
600 get_core_register_section (regcache, sect_list->sect_name,
601 0, sect_list->human_name, 1);
602 else if (strcmp (sect_list->sect_name, ".reg2") == 0)
603 get_core_register_section (regcache, sect_list->sect_name,
604 2, sect_list->human_name, 0);
605 else
606 get_core_register_section (regcache, sect_list->sect_name,
607 3, sect_list->human_name, 0);
608
609 sect_list++;
610 }
611
612 else
613 {
614 get_core_register_section (regcache,
615 ".reg", 0, "general-purpose", 1);
616 get_core_register_section (regcache,
617 ".reg2", 2, "floating-point", 0);
618 }
c906108c 619
ee99023e 620 /* Mark all registers not found in the core as unavailable. */
13b8769f 621 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
ee99023e 622 if (regcache_register_status (regcache, i) == REG_UNKNOWN)
9c5ea4d9 623 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
624}
625
c906108c 626static void
fba45db2 627core_files_info (struct target_ops *t)
c906108c 628{
07b82ea5 629 print_section_info (core_data, core_bfd);
c906108c 630}
e2544d02 631\f
efcbbd14
UW
632struct spuid_list
633{
634 gdb_byte *buf;
635 ULONGEST offset;
636 LONGEST len;
637 ULONGEST pos;
638 ULONGEST written;
639};
640
641static void
642add_to_spuid_list (bfd *abfd, asection *asect, void *list_p)
643{
644 struct spuid_list *list = list_p;
645 enum bfd_endian byte_order
aff410f1 646 = bfd_big_endian (abfd) ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
efcbbd14
UW
647 int fd, pos = 0;
648
649 sscanf (bfd_section_name (abfd, asect), "SPU/%d/regs%n", &fd, &pos);
650 if (pos == 0)
651 return;
652
653 if (list->pos >= list->offset && list->pos + 4 <= list->offset + list->len)
654 {
655 store_unsigned_integer (list->buf + list->pos - list->offset,
656 4, byte_order, fd);
657 list->written += 4;
658 }
659 list->pos += 4;
660}
661
e2544d02
RM
662static LONGEST
663core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5 664 const char *annex, gdb_byte *readbuf,
aff410f1
MS
665 const gdb_byte *writebuf, ULONGEST offset,
666 LONGEST len)
e2544d02
RM
667{
668 switch (object)
669 {
670 case TARGET_OBJECT_MEMORY:
07b82ea5
PA
671 return section_table_xfer_memory_partial (readbuf, writebuf,
672 offset, len,
673 core_data->sections,
674 core_data->sections_end,
675 NULL);
e2544d02
RM
676
677 case TARGET_OBJECT_AUXV:
678 if (readbuf)
679 {
680 /* When the aux vector is stored in core file, BFD
681 represents this with a fake section called ".auxv". */
682
c4c5b7ba 683 struct bfd_section *section;
e2544d02 684 bfd_size_type size;
e2544d02
RM
685
686 section = bfd_get_section_by_name (core_bfd, ".auxv");
687 if (section == NULL)
688 return -1;
689
690 size = bfd_section_size (core_bfd, section);
691 if (offset >= size)
692 return 0;
693 size -= offset;
694 if (size > len)
695 size = len;
403e1656
MK
696 if (size > 0
697 && !bfd_get_section_contents (core_bfd, section, readbuf,
698 (file_ptr) offset, size))
e2544d02 699 {
8a3fe4f8 700 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
701 return -1;
702 }
703
704 return size;
705 }
706 return -1;
707
403e1656
MK
708 case TARGET_OBJECT_WCOOKIE:
709 if (readbuf)
710 {
711 /* When the StackGhost cookie is stored in core file, BFD
aff410f1
MS
712 represents this with a fake section called
713 ".wcookie". */
403e1656
MK
714
715 struct bfd_section *section;
716 bfd_size_type size;
403e1656
MK
717
718 section = bfd_get_section_by_name (core_bfd, ".wcookie");
719 if (section == NULL)
720 return -1;
721
722 size = bfd_section_size (core_bfd, section);
723 if (offset >= size)
724 return 0;
725 size -= offset;
726 if (size > len)
727 size = len;
728 if (size > 0
729 && !bfd_get_section_contents (core_bfd, section, readbuf,
730 (file_ptr) offset, size))
731 {
8a3fe4f8 732 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
733 return -1;
734 }
735
736 return size;
737 }
738 return -1;
739
de584861
PA
740 case TARGET_OBJECT_LIBRARIES:
741 if (core_gdbarch
742 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
743 {
744 if (writebuf)
745 return -1;
746 return
747 gdbarch_core_xfer_shared_libraries (core_gdbarch,
748 readbuf, offset, len);
749 }
750 /* FALL THROUGH */
751
efcbbd14
UW
752 case TARGET_OBJECT_SPU:
753 if (readbuf && annex)
754 {
755 /* When the SPU contexts are stored in a core file, BFD
aff410f1
MS
756 represents this with a fake section called
757 "SPU/<annex>". */
efcbbd14
UW
758
759 struct bfd_section *section;
760 bfd_size_type size;
efcbbd14 761 char sectionstr[100];
c5504eaf 762
efcbbd14
UW
763 xsnprintf (sectionstr, sizeof sectionstr, "SPU/%s", annex);
764
765 section = bfd_get_section_by_name (core_bfd, sectionstr);
766 if (section == NULL)
767 return -1;
768
769 size = bfd_section_size (core_bfd, section);
770 if (offset >= size)
771 return 0;
772 size -= offset;
773 if (size > len)
774 size = len;
775 if (size > 0
776 && !bfd_get_section_contents (core_bfd, section, readbuf,
777 (file_ptr) offset, size))
778 {
779 warning (_("Couldn't read SPU section in core file."));
780 return -1;
781 }
782
783 return size;
784 }
785 else if (readbuf)
786 {
787 /* NULL annex requests list of all present spuids. */
788 struct spuid_list list;
c5504eaf 789
efcbbd14
UW
790 list.buf = readbuf;
791 list.offset = offset;
792 list.len = len;
793 list.pos = 0;
794 list.written = 0;
795 bfd_map_over_sections (core_bfd, add_to_spuid_list, &list);
796 return list.written;
797 }
798 return -1;
799
e2544d02
RM
800 default:
801 if (ops->beneath != NULL)
aff410f1
MS
802 return ops->beneath->to_xfer_partial (ops->beneath, object,
803 annex, readbuf,
804 writebuf, offset, len);
e2544d02
RM
805 return -1;
806 }
807}
808
c906108c
SS
809\f
810/* If mourn is being called in all the right places, this could be say
aff410f1
MS
811 `gdb internal error' (since generic_mourn calls
812 breakpoint_init_inferior). */
c906108c
SS
813
814static int
a6d9a66e 815ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
c906108c
SS
816{
817 return 0;
818}
819
820
821/* Okay, let's be honest: threads gleaned from a core file aren't
822 exactly lively, are they? On the other hand, if we don't claim
823 that each & every one is alive, then we don't get any of them
824 to appear in an "info thread" command, which is quite a useful
825 behaviour.
c5aa993b 826 */
c906108c 827static int
28439f5e 828core_thread_alive (struct target_ops *ops, ptid_t ptid)
c906108c
SS
829{
830 return 1;
831}
832
4eb0ad19
DJ
833/* Ask the current architecture what it knows about this core file.
834 That will be used, in turn, to pick a better architecture. This
835 wrapper could be avoided if targets got a chance to specialize
836 core_ops. */
837
838static const struct target_desc *
839core_read_description (struct target_ops *target)
840{
a78c2d62 841 if (core_gdbarch && gdbarch_core_read_description_p (core_gdbarch))
aff410f1
MS
842 return gdbarch_core_read_description (core_gdbarch,
843 target, core_bfd);
4eb0ad19
DJ
844
845 return NULL;
846}
847
0de3b513 848static char *
117de6a9 849core_pid_to_str (struct target_ops *ops, ptid_t ptid)
0de3b513
PA
850{
851 static char buf[64];
a5ee0f0c 852 int pid;
0de3b513 853
a5ee0f0c
PA
854 /* The preferred way is to have a gdbarch/OS specific
855 implementation. */
28439f5e
PA
856 if (core_gdbarch
857 && gdbarch_core_pid_to_str_p (core_gdbarch))
a5ee0f0c 858 return gdbarch_core_pid_to_str (core_gdbarch, ptid);
c5504eaf 859
a5ee0f0c
PA
860 /* Otherwise, if we don't have one, we'll just fallback to
861 "process", with normal_pid_to_str. */
28439f5e 862
a5ee0f0c
PA
863 /* Try the LWPID field first. */
864 pid = ptid_get_lwp (ptid);
865 if (pid != 0)
866 return normal_pid_to_str (pid_to_ptid (pid));
867
868 /* Otherwise, this isn't a "threaded" core -- use the PID field, but
869 only if it isn't a fake PID. */
870 if (!core_has_fake_pid)
871 return normal_pid_to_str (ptid);
0de3b513 872
a5ee0f0c
PA
873 /* No luck. We simply don't have a valid PID to print. */
874 xsnprintf (buf, sizeof buf, "<main task>");
0de3b513
PA
875 return buf;
876}
877
c35b1492
PA
878static int
879core_has_memory (struct target_ops *ops)
880{
881 return (core_bfd != NULL);
882}
883
884static int
885core_has_stack (struct target_ops *ops)
886{
887 return (core_bfd != NULL);
888}
889
890static int
891core_has_registers (struct target_ops *ops)
892{
893 return (core_bfd != NULL);
894}
895
c906108c
SS
896/* Fill in core_ops with its defined operations and properties. */
897
898static void
fba45db2 899init_core_ops (void)
c906108c
SS
900{
901 core_ops.to_shortname = "core";
902 core_ops.to_longname = "Local core dump file";
903 core_ops.to_doc =
904 "Use a core file as a target. Specify the filename of the core file.";
905 core_ops.to_open = core_open;
906 core_ops.to_close = core_close;
907 core_ops.to_attach = find_default_attach;
c906108c 908 core_ops.to_detach = core_detach;
c906108c 909 core_ops.to_fetch_registers = get_core_registers;
e2544d02 910 core_ops.to_xfer_partial = core_xfer_partial;
c906108c
SS
911 core_ops.to_files_info = core_files_info;
912 core_ops.to_insert_breakpoint = ignore;
913 core_ops.to_remove_breakpoint = ignore;
914 core_ops.to_create_inferior = find_default_create_inferior;
28439f5e 915 core_ops.to_thread_alive = core_thread_alive;
4eb0ad19 916 core_ops.to_read_description = core_read_description;
0de3b513 917 core_ops.to_pid_to_str = core_pid_to_str;
c0edd9ed 918 core_ops.to_stratum = process_stratum;
c35b1492
PA
919 core_ops.to_has_memory = core_has_memory;
920 core_ops.to_has_stack = core_has_stack;
921 core_ops.to_has_registers = core_has_registers;
c5aa993b 922 core_ops.to_magic = OPS_MAGIC;
c0edd9ed
JK
923
924 if (core_target)
925 internal_error (__FILE__, __LINE__,
926 _("init_core_ops: core target already exists (\"%s\")."),
927 core_target->to_longname);
928 core_target = &core_ops;
c906108c
SS
929}
930
c906108c 931void
fba45db2 932_initialize_corelow (void)
c906108c
SS
933{
934 init_core_ops ();
935
28439f5e 936 add_target (&core_ops);
c906108c 937}
This page took 0.790776 seconds and 4 git commands to generate.