1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / corefile.c
CommitLineData
8afd6ca5 1/* Core dump and executable file functions above target vector, for GDB.
ba47c66a
PS
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
dd3b648e
RP
4
5This file is part of GDB.
6
99a7de40 7This program is free software; you can redistribute it and/or modify
dd3b648e 8it under the terms of the GNU General Public License as published by
99a7de40
JG
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
dd3b648e 11
99a7de40 12This program is distributed in the hope that it will be useful,
dd3b648e
RP
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
99a7de40 18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
dd3b648e 20
d747e0af 21#include "defs.h"
2b576293 22#include "gdb_string.h"
dd3b648e
RP
23#include <errno.h>
24#include <signal.h>
bdbd5f50 25#include <fcntl.h>
dd3b648e
RP
26#include "frame.h" /* required by inferior.h */
27#include "inferior.h"
28#include "symtab.h"
29#include "command.h"
df0f0dcc 30#include "gdbcmd.h"
dd3b648e
RP
31#include "bfd.h"
32#include "target.h"
33#include "gdbcore.h"
5d0734a7 34#include "dis-asm.h"
100f92e2 35#include "language.h"
091d7302 36#include "gdb_stat.h"
65b07ddc
DT
37#include "symfile.h"
38#include "objfiles.h"
dd3b648e 39
dd3b648e
RP
40extern char registers[];
41
f9fedc48 42/* Local function declarations. */
dd3b648e 43
f9fedc48
MA
44static void call_extra_exec_file_hooks PARAMS ((char *filename));
45
46/* You can have any number of hooks for `exec_file_command' command to call.
47 If there's only one hook, it is set in exec_file_display hook.
48 If there are two or more hooks, they are set in exec_file_extra_hooks[],
49 and exec_file_display_hook is set to a function that calls all of them.
50 This extra complexity is needed to preserve compatibility with
51 old code that assumed that only one hook could be set, and which called
52 exec_file_display_hook directly. */
53
54typedef void (*hook_type) PARAMS ((char *));
55
56hook_type exec_file_display_hook; /* the original hook */
57static hook_type *exec_file_extra_hooks; /* array of additional hooks */
58static int exec_file_hook_count = 0; /* size of array */
dd3b648e 59
dd3b648e
RP
60/* Binary file diddling handle for the core file. */
61
62bfd *core_bfd = NULL;
63
dd3b648e 64\f
dd3b648e
RP
65/* Backward compatability with old way of specifying core files. */
66
67void
68core_file_command (filename, from_tty)
69 char *filename;
70 int from_tty;
71{
df9b3bfc 72 struct target_ops *t;
327f7197 73
3f2e006b 74 dont_repeat (); /* Either way, seems bogus. */
8afd6ca5 75
df9b3bfc
RP
76 t = find_core_target ();
77 if (t != NULL)
78 if (!filename)
79 (t->to_detach) (filename, from_tty);
80 else
65b07ddc
DT
81 {
82 /* Yes, we were given the path of a core file. Do we already
83 have a symbol file? If not, can we determine it from the
84 core file? If we can, do so.
85 */
86#ifdef HPUXHPPA
87 if (symfile_objfile == NULL)
88 {
89 char * symfile;
90 symfile = t->to_core_file_to_sym_file (filename);
91 if (symfile)
92 {
93 char * symfile_copy = strdup (symfile);
94
95 make_cleanup (free, symfile_copy);
96 symbol_file_command (symfile_copy, from_tty);
97 }
98 else
99 warning ("Unknown symbols for '%s'; use the 'symbol-file' command.", filename);
100 }
101#endif
102 (t->to_open) (filename, from_tty);
103 }
dd3b648e 104 else
327f7197 105 error ("GDB can't read core files on this machine.");
dd3b648e
RP
106}
107
108\f
f9fedc48
MA
109/* If there are two or more functions that wish to hook into exec_file_command,
110 * this function will call all of the hook functions. */
111
112static void
113call_extra_exec_file_hooks (filename)
114 char *filename;
115{
116 int i;
117
118 for (i = 0; i < exec_file_hook_count; i++)
119 (*exec_file_extra_hooks[i])(filename);
120}
121
dd3b648e
RP
122/* Call this to specify the hook for exec_file_command to call back.
123 This is called from the x-window display code. */
124
125void
126specify_exec_file_hook (hook)
7ed0f002 127 void (*hook) PARAMS ((char *));
dd3b648e 128{
f9fedc48
MA
129 hook_type *new_array;
130
131 if (exec_file_display_hook != NULL)
132 {
133 /* There's already a hook installed. Arrange to have both it
134 * and the subsequent hooks called. */
135 if (exec_file_hook_count == 0)
136 {
137 /* If this is the first extra hook, initialize the hook array. */
138 exec_file_extra_hooks = (hook_type *) xmalloc (sizeof(hook_type));
139 exec_file_extra_hooks[0] = exec_file_display_hook;
140 exec_file_display_hook = call_extra_exec_file_hooks;
141 exec_file_hook_count = 1;
142 }
143
144 /* Grow the hook array by one and add the new hook to the end.
145 Yes, it's inefficient to grow it by one each time but since
146 this is hardly ever called it's not a big deal. */
147 exec_file_hook_count++;
148 new_array =
149 (hook_type *) xrealloc (exec_file_extra_hooks,
150 exec_file_hook_count * sizeof(hook_type));
151 exec_file_extra_hooks = new_array;
152 exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
153 }
154 else
155 exec_file_display_hook = hook;
dd3b648e
RP
156}
157
158/* The exec file must be closed before running an inferior.
159 If it is needed again after the inferior dies, it must
160 be reopened. */
161
162void
163close_exec_file ()
164{
28444bf3 165#if 0 /* FIXME */
dd3b648e
RP
166 if (exec_bfd)
167 bfd_tempclose (exec_bfd);
168#endif
169}
170
171void
172reopen_exec_file ()
173{
28444bf3 174#if 0 /* FIXME */
dd3b648e
RP
175 if (exec_bfd)
176 bfd_reopen (exec_bfd);
091d7302
MA
177#else
178 char *filename;
179 int res;
180 struct stat st;
181 long mtime;
182
183 /* Don't do anything if the current target isn't exec. */
184 if (exec_bfd == NULL || strcmp (target_shortname, "exec") != 0)
185 return;
186
187 /* If the timestamp of the exec file has changed, reopen it. */
188 filename = strdup (bfd_get_filename (exec_bfd));
189 make_cleanup (free, filename);
190 mtime = bfd_get_mtime(exec_bfd);
191 res = stat (filename, &st);
192
193 if (mtime && mtime != st.st_mtime)
194 exec_file_command (filename, 0);
dd3b648e
RP
195#endif
196}
197\f
198/* If we have both a core file and an exec file,
c561ca5d 199 print a warning if they don't go together. */
dd3b648e
RP
200
201void
202validate_files ()
203{
204 if (exec_bfd && core_bfd)
205 {
bdbd5f50 206 if (!core_file_matches_executable_p (core_bfd, exec_bfd))
c8094777 207 warning ("core file may not match specified executable file.");
dd3b648e 208 else if (bfd_get_mtime(exec_bfd) > bfd_get_mtime(core_bfd))
c8094777 209 warning ("exec file is newer than core file.");
dd3b648e
RP
210 }
211}
212
213/* Return the name of the executable file as a string.
214 ERR nonzero means get error if there is none specified;
215 otherwise return 0 in that case. */
216
217char *
218get_exec_file (err)
219 int err;
220{
221 if (exec_bfd) return bfd_get_filename(exec_bfd);
222 if (!err) return NULL;
223
224 error ("No executable file specified.\n\
225Use the \"file\" or \"exec-file\" command.");
226 return NULL;
227}
228
dd3b648e 229\f
7ed0f002
JG
230/* Report a memory error with error(). */
231
dd3b648e
RP
232void
233memory_error (status, memaddr)
234 int status;
235 CORE_ADDR memaddr;
236{
dd3b648e
RP
237 if (status == EIO)
238 {
239 /* Actually, address between memaddr and memaddr + len
240 was out of bounds. */
a0cf4681 241 error_begin ();
e16b9023 242 printf_filtered ("Cannot access memory at address ");
d24c0599 243 print_address_numeric (memaddr, 1, gdb_stdout);
e16b9023 244 printf_filtered (".\n");
a0cf4681 245 return_to_top_level (RETURN_ERROR);
dd3b648e
RP
246 }
247 else
248 {
a0cf4681 249 error_begin ();
e16b9023 250 printf_filtered ("Error accessing memory address ");
d24c0599 251 print_address_numeric (memaddr, 1, gdb_stdout);
e16b9023 252 printf_filtered (": %s.\n",
a0cf4681
JK
253 safe_strerror (status));
254 return_to_top_level (RETURN_ERROR);
dd3b648e
RP
255 }
256}
257
258/* Same as target_read_memory, but report an error if can't read. */
259void
260read_memory (memaddr, myaddr, len)
261 CORE_ADDR memaddr;
262 char *myaddr;
263 int len;
264{
265 int status;
266 status = target_read_memory (memaddr, myaddr, len);
267 if (status != 0)
268 memory_error (status, memaddr);
269}
270
6c310da8
SG
271void
272read_memory_section (memaddr, myaddr, len, bfd_section)
273 CORE_ADDR memaddr;
274 char *myaddr;
275 int len;
276 asection *bfd_section;
277{
278 int status;
279 status = target_read_memory_section (memaddr, myaddr, len, bfd_section);
280 if (status != 0)
281 memory_error (status, memaddr);
282}
283
720b3aed 284/* Like target_read_memory, but slightly different parameters. */
bf097a0b 285
5d0734a7 286int
a6cead71 287dis_asm_read_memory (memaddr, myaddr, len, info)
5d0734a7
JK
288 bfd_vma memaddr;
289 bfd_byte *myaddr;
290 int len;
a6cead71 291 disassemble_info *info;
5d0734a7 292{
34b70237 293 return target_read_memory (memaddr, (char *) myaddr, len);
5d0734a7
JK
294}
295
296/* Like memory_error with slightly different parameters. */
297void
298dis_asm_memory_error (status, memaddr, info)
299 int status;
300 bfd_vma memaddr;
301 disassemble_info *info;
302{
303 memory_error (status, memaddr);
304}
305
720b3aed
JK
306/* Like print_address with slightly different parameters. */
307void
308dis_asm_print_address (addr, info)
309 bfd_vma addr;
310 struct disassemble_info *info;
311{
312 print_address (addr, info->stream);
313}
314
dd3b648e
RP
315/* Same as target_write_memory, but report an error if can't write. */
316void
317write_memory (memaddr, myaddr, len)
318 CORE_ADDR memaddr;
319 char *myaddr;
320 int len;
321{
322 int status;
323
324 status = target_write_memory (memaddr, myaddr, len);
325 if (status != 0)
326 memory_error (status, memaddr);
327}
328
329/* Read an integer from debugged memory, given address and number of bytes. */
330
34df79fc 331LONGEST
dd3b648e
RP
332read_memory_integer (memaddr, len)
333 CORE_ADDR memaddr;
334 int len;
335{
58e49e21 336 char buf[sizeof (LONGEST)];
dd3b648e 337
34df79fc
JK
338 read_memory (memaddr, buf, len);
339 return extract_signed_integer (buf, len);
dd3b648e 340}
86a5593e 341
119dfbb7 342ULONGEST
86a5593e
SC
343read_memory_unsigned_integer (memaddr, len)
344 CORE_ADDR memaddr;
345 int len;
346{
119dfbb7 347 char buf[sizeof (ULONGEST)];
86a5593e 348
34df79fc
JK
349 read_memory (memaddr, buf, len);
350 return extract_unsigned_integer (buf, len);
86a5593e 351}
4ef1f467
DT
352
353void
354read_memory_string (memaddr, buffer, max_len)
355 CORE_ADDR memaddr;
356 char * buffer;
357 int max_len;
358{
359 register char * cp;
360 register int i;
361 int cnt;
362
363 cp = buffer;
364 while (1)
365 {
366 if (cp - buffer >= max_len)
367 {
368 buffer[max_len - 1] = '\0';
369 break;
370 }
371 cnt = max_len - (cp - buffer);
372 if (cnt > 8)
373 cnt = 8;
374 read_memory (memaddr + (int) (cp - buffer), cp, cnt);
375 for (i = 0; i < cnt && *cp; i++, cp++)
376 ; /* null body */
377
378 if (i < cnt && !*cp)
379 break;
380 }
381}
382
dd3b648e 383\f
63dcc380
JK
384#if 0
385/* Enable after 4.12. It is not tested. */
386
387/* Search code. Targets can just make this their search function, or
388 if the protocol has a less general search function, they can call this
389 in the cases it can't handle. */
390void
391generic_search (len, data, mask, startaddr, increment, lorange, hirange
392 addr_found, data_found)
393 int len;
394 char *data;
395 char *mask;
396 CORE_ADDR startaddr;
397 int increment;
398 CORE_ADDR lorange;
399 CORE_ADDR hirange;
400 CORE_ADDR *addr_found;
401 char *data_found;
402{
403 int i;
404 CORE_ADDR curaddr = startaddr;
405
406 while (curaddr >= lorange && curaddr < hirange)
407 {
408 read_memory (curaddr, data_found, len);
409 for (i = 0; i < len; ++i)
410 if ((data_found[i] & mask[i]) != data[i])
411 goto try_again;
412 /* It matches. */
413 *addr_found = curaddr;
414 return;
415
416 try_again:
417 curaddr += increment;
418 }
419 *addr_found = (CORE_ADDR)0;
420 return;
421}
422#endif /* 0 */
423\f
0685d95f
JK
424/* The current default bfd target. Points to storage allocated for
425 gnutarget_string. */
426char *gnutarget;
427
428/* Same thing, except it is "auto" not NULL for the default case. */
429static char *gnutarget_string;
430
431static void set_gnutarget_command
432 PARAMS ((char *, int, struct cmd_list_element *));
433
434static void
435set_gnutarget_command (ignore, from_tty, c)
436 char *ignore;
437 int from_tty;
438 struct cmd_list_element *c;
439{
440 if (STREQ (gnutarget_string, "auto"))
441 gnutarget = NULL;
442 else
443 gnutarget = gnutarget_string;
444}
445
446/* Set the gnutarget. */
447void
448set_gnutarget (newtarget)
449 char *newtarget;
450{
451 if (gnutarget_string != NULL)
452 free (gnutarget_string);
453 gnutarget_string = savestring (newtarget, strlen (newtarget));
454 set_gnutarget_command (NULL, 0, NULL);
455}
456
dd3b648e
RP
457void
458_initialize_core()
459{
df0f0dcc
JK
460 struct cmd_list_element *c;
461 c = add_cmd ("core-file", class_files, core_file_command,
462 "Use FILE as core dump for examining memory and registers.\n\
dd3b648e 463No arg means have no core file. This command has been superseded by the\n\
df0f0dcc
JK
464`target core' and `detach' commands.", &cmdlist);
465 c->completer = filename_completer;
0685d95f
JK
466
467 c = add_set_cmd ("gnutarget", class_files, var_string_noescape,
468 (char *) &gnutarget_string,
469 "Set the current BFD target.\n\
470Use `set gnutarget auto' to specify automatic detection.",
471 &setlist);
472 c->function.sfunc = set_gnutarget_command;
473 add_show_from_set (c, &showlist);
474
475 if (getenv ("GNUTARGET"))
476 set_gnutarget (getenv ("GNUTARGET"));
477 else
478 set_gnutarget ("auto");
dd3b648e 479}
This page took 0.452652 seconds and 4 git commands to generate.