1 /* Core dump and executable file functions below target vector, for GDB.
2 Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "gdb_string.h"
26 #include "frame.h" /* required by inferior.h */
33 #include "gdbthread.h"
35 /* List of all available core_fns. On gdb startup, each core file register
36 reader calls add_core_fns() to register information on each core format it
37 is prepared to read. */
39 static struct core_fns
*core_file_fns
= NULL
;
41 static void core_files_info
PARAMS ((struct target_ops
*));
44 static int solib_add_stub
PARAMS ((char *));
47 static void core_open
PARAMS ((char *, int));
49 static void core_detach
PARAMS ((char *, int));
51 static void core_close
PARAMS ((int));
53 static void get_core_registers
PARAMS ((int));
55 static void add_to_thread_list
PARAMS ((bfd
*, asection
*, PTR
));
57 static int ignore
PARAMS ((CORE_ADDR
, char *));
59 void _initialize_corelow
PARAMS ((void));
61 /* Link a new core_fns into the global core_file_fns list. Called on gdb
62 startup by the _initialize routine in each core file register reader, to
63 register information about each format the the reader is prepared to
70 cf
-> next
= core_file_fns
;
75 /* Discard all vestiges of any previous core file and mark data and stack
87 inferior_pid
= 0; /* Avoid confusion from thread stuff */
89 name
= bfd_get_filename (core_bfd
);
90 if (!bfd_close (core_bfd
))
91 warning ("cannot close \"%s\": %s",
92 name
, bfd_errmsg (bfd_get_error ()));
98 if (core_ops
.to_sections
)
100 free ((PTR
)core_ops
.to_sections
);
101 core_ops
.to_sections
= NULL
;
102 core_ops
.to_sections_end
= NULL
;
108 /* Stub function for catch_errors around shared library hacking. FROM_TTYP
109 is really an int * which points to from_tty. */
112 solib_add_stub (from_ttyp
)
115 SOLIB_ADD (NULL
, *(int *)from_ttyp
, ¤t_target
);
116 re_enable_breakpoints_in_shlibs ();
119 #endif /* SOLIB_ADD */
121 /* Look for sections whose names start with `.reg/' so that we can extract the
122 list of threads in a core file. */
125 add_to_thread_list (abfd
, asect
, reg_sect_arg
)
131 asection
*reg_sect
= (asection
*) reg_sect_arg
;
133 if (strncmp (bfd_section_name (abfd
, asect
), ".reg/", 5) != 0)
136 thread_id
= atoi (bfd_section_name (abfd
, asect
) + 5);
138 add_thread (thread_id
);
140 /* Warning, Will Robinson, looking at BFD private data! */
143 && asect
->filepos
== reg_sect
->filepos
) /* Did we find .reg? */
144 inferior_pid
= thread_id
; /* Yes, make it current */
147 /* This routine opens and sets up the core file bfd. */
150 core_open (filename
, from_tty
)
156 struct cleanup
*old_chain
;
162 target_preopen (from_tty
);
166 "No core file specified. (Use `detach' to stop debugging a core file.)"
167 : "No core file specified.");
170 filename
= tilde_expand (filename
);
171 if (filename
[0] != '/')
173 temp
= concat (current_directory
, "/", filename
, NULL
);
178 old_chain
= make_cleanup (free
, filename
);
180 scratch_chan
= open (filename
, write_files
? O_RDWR
: O_RDONLY
, 0);
181 if (scratch_chan
< 0)
182 perror_with_name (filename
);
184 temp_bfd
= bfd_fdopenr (filename
, gnutarget
, scratch_chan
);
185 if (temp_bfd
== NULL
)
186 perror_with_name (filename
);
188 if (!bfd_check_format (temp_bfd
, bfd_core
))
190 /* Do it after the err msg */
191 /* FIXME: should be checking for errors from bfd_close (for one thing,
192 on error it does not free all the storage associated with the
194 make_cleanup ((make_cleanup_func
) bfd_close
, temp_bfd
);
195 error ("\"%s\" is not a core dump: %s",
196 filename
, bfd_errmsg (bfd_get_error ()));
199 /* Looks semi-reasonable. Toss the old core file and work on the new. */
201 discard_cleanups (old_chain
); /* Don't free filename any more */
202 unpush_target (&core_ops
);
204 old_chain
= make_cleanup ((make_cleanup_func
) core_close
, core_bfd
);
208 /* Find the data section */
209 if (build_section_table (core_bfd
, &core_ops
.to_sections
,
210 &core_ops
.to_sections_end
))
211 error ("\"%s\": Can't find sections: %s",
212 bfd_get_filename (core_bfd
), bfd_errmsg (bfd_get_error ()));
214 ontop
= !push_target (&core_ops
);
215 discard_cleanups (old_chain
);
217 p
= bfd_core_file_failing_command (core_bfd
);
219 printf_filtered ("Core was generated by `%s'.\n", p
);
221 siggy
= bfd_core_file_failing_signal (core_bfd
);
223 printf_filtered ("Program terminated with signal %d, %s.\n", siggy
,
224 safe_strsignal (siggy
));
226 /* Build up thread list from BFD sections. */
229 bfd_map_over_sections (core_bfd
, add_to_thread_list
,
230 bfd_get_section_by_name (core_bfd
, ".reg"));
234 /* Fetch all registers from core file. */
235 target_fetch_registers (-1);
237 /* Add symbols and section mappings for any shared libraries. */
239 catch_errors (solib_add_stub
, &from_tty
, (char *)0,
243 /* Now, set up the frame cache, and print the top of stack. */
244 flush_cached_frames ();
245 select_frame (get_current_frame (), 0);
246 print_stack_frame (selected_frame
, selected_frame_level
, 1);
251 "you won't be able to access this core file until you terminate\n\
252 your %s; do ``info files''", target_longname
);
257 core_detach (args
, from_tty
)
262 error ("Too many arguments");
263 unpush_target (&core_ops
);
264 reinit_frame_cache ();
266 printf_filtered ("No core file now.\n");
269 /* Get the registers out of a core file. This is the machine-
270 independent part. Fetch_core_registers is the machine-dependent
271 part, typically implemented in the xm-file for each architecture. */
273 /* We just get all the registers, so we don't use regno. */
277 get_core_registers (regno
)
284 enum bfd_flavour our_flavour
= bfd_get_flavour (core_bfd
);
285 struct core_fns
*cf
= NULL
;
287 if (core_file_fns
== NULL
)
289 fprintf_filtered (gdb_stderr
,
290 "Can't fetch registers from this type of core file\n");
294 /* Thread support. If inferior_pid is non-zero, then we have found a core
295 file with threads (or multiple processes). In that case, we need to
296 use the appropriate register section, else we just use `.reg'. */
298 /* XXX - same thing needs to be done for floating-point (.reg2) sections. */
301 sprintf (secname
, ".reg/%d", inferior_pid
);
303 strcpy (secname
, ".reg");
305 reg_sec
= bfd_get_section_by_name (core_bfd
, secname
);
308 size
= bfd_section_size (core_bfd
, reg_sec
);
309 the_regs
= alloca (size
);
310 /* Look for the core functions that match this flavor. Default to the
311 first one if nothing matches. */
312 for (cf
= core_file_fns
; cf
!= NULL
; cf
= cf
-> next
)
314 if (our_flavour
== cf
-> core_flavour
)
324 bfd_get_section_contents (core_bfd
, reg_sec
, the_regs
, (file_ptr
)0, size
) &&
325 cf
-> core_read_registers
!= NULL
)
327 (cf
-> core_read_registers (the_regs
, size
, 0,
328 (unsigned) bfd_section_vma (abfd
,reg_sec
)));
333 fprintf_filtered (gdb_stderr
,
334 "Couldn't fetch registers from core file: %s\n",
335 bfd_errmsg (bfd_get_error ()));
338 /* Now do it again for the float registers, if they exist. */
339 reg_sec
= bfd_get_section_by_name (core_bfd
, ".reg2");
342 size
= bfd_section_size (core_bfd
, reg_sec
);
343 the_regs
= alloca (size
);
345 bfd_get_section_contents (core_bfd
, reg_sec
, the_regs
, (file_ptr
)0, size
) &&
346 cf
-> core_read_registers
!= NULL
)
348 (cf
-> core_read_registers (the_regs
, size
, 2,
349 (unsigned) bfd_section_vma (abfd
,reg_sec
)));
353 fprintf_filtered (gdb_stderr
,
354 "Couldn't fetch register set 2 from core file: %s\n",
355 bfd_errmsg (bfd_get_error ()));
358 registers_fetched ();
363 struct target_ops
*t
;
365 print_section_info (t
, core_bfd
);
368 /* If mourn is being called in all the right places, this could be say
369 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
372 ignore (addr
, contents
)
379 struct target_ops core_ops
= {
380 "core", /* to_shortname */
381 "Local core dump file", /* to_longname */
382 "Use a core file as a target. Specify the filename of the core file.", /* to_doc */
383 core_open
, /* to_open */
384 core_close
, /* to_close */
385 find_default_attach
, /* to_attach */
386 core_detach
, /* to_detach */
389 get_core_registers
, /* to_fetch_registers */
390 0, /* to_store_registers */
391 0, /* to_prepare_to_store */
392 xfer_memory
, /* to_xfer_memory */
393 core_files_info
, /* to_files_info */
394 ignore
, /* to_insert_breakpoint */
395 ignore
, /* to_remove_breakpoint */
396 0, /* to_terminal_init */
397 0, /* to_terminal_inferior */
398 0, /* to_terminal_ours_for_output */
399 0, /* to_terminal_ours */
400 0, /* to_terminal_info */
403 0, /* to_lookup_symbol */
404 find_default_create_inferior
, /* to_create_inferior */
405 0, /* to_mourn_inferior */
407 0, /* to_notice_signals */
408 0, /* to_thread_alive */
410 core_stratum
, /* to_stratum */
412 0, /* to_has_all_memory */
413 1, /* to_has_memory */
414 1, /* to_has_stack */
415 1, /* to_has_registers */
416 0, /* to_has_execution */
418 0, /* to_sections_end */
419 OPS_MAGIC
, /* to_magic */
422 /* non-zero if we should not do the add_target call in
423 _initialize_corelow; not initialized (i.e., bss) so that
424 the target can initialize it (i.e., data) if appropriate.
425 This needs to be set at compile time because we don't know
426 for sure whether the target's initialize routine is called
427 before us or after us. */
428 int coreops_suppress_target
;
431 _initialize_corelow ()
433 if (!coreops_suppress_target
)
434 add_target (&core_ops
);