2005-01-12 Andrew Cagney <cagney@gnu.org>
[external/binutils.git] / gdb / corefile.c
1 /* Core dump and executable file functions above target vector, for GDB.
2
3    Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1996, 1997,
4    1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
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
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
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.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 #include "defs.h"
24 #include "gdb_string.h"
25 #include <errno.h>
26 #include <signal.h>
27 #include <fcntl.h>
28 #include "inferior.h"
29 #include "symtab.h"
30 #include "command.h"
31 #include "gdbcmd.h"
32 #include "bfd.h"
33 #include "target.h"
34 #include "gdbcore.h"
35 #include "dis-asm.h"
36 #include "gdb_stat.h"
37 #include "completer.h"
38 #include "exceptions.h"
39
40 /* Local function declarations.  */
41
42 extern void _initialize_core (void);
43 static void call_extra_exec_file_hooks (char *filename);
44
45 /* You can have any number of hooks for `exec_file_command' command to
46    call.  If there's only one hook, it is set in exec_file_display
47    hook.  If there are two or more hooks, they are set in
48    exec_file_extra_hooks[], and deprecated_exec_file_display_hook is
49    set to a function that calls all of them.  This extra complexity is
50    needed to preserve compatibility with old code that assumed that
51    only one hook could be set, and which called
52    deprecated_exec_file_display_hook directly.  */
53
54 typedef void (*hook_type) (char *);
55
56 hook_type deprecated_exec_file_display_hook;    /* the original hook */
57 static hook_type *exec_file_extra_hooks;        /* array of additional hooks */
58 static int exec_file_hook_count = 0;    /* size of array */
59
60 /* Binary file diddling handle for the core file.  */
61
62 bfd *core_bfd = NULL;
63 \f
64
65 /* Backward compatability with old way of specifying core files.  */
66
67 void
68 core_file_command (char *filename, int from_tty)
69 {
70   struct target_ops *t;
71
72   dont_repeat ();               /* Either way, seems bogus. */
73
74   t = find_core_target ();
75   if (t == NULL)
76     error ("GDB can't read core files on this machine.");
77
78   if (!filename)
79     (t->to_detach) (filename, from_tty);
80   else
81     (t->to_open) (filename, from_tty);
82 }
83 \f
84
85 /* If there are two or more functions that wish to hook into exec_file_command,
86  * this function will call all of the hook functions. */
87
88 static void
89 call_extra_exec_file_hooks (char *filename)
90 {
91   int i;
92
93   for (i = 0; i < exec_file_hook_count; i++)
94     (*exec_file_extra_hooks[i]) (filename);
95 }
96
97 /* Call this to specify the hook for exec_file_command to call back.
98    This is called from the x-window display code.  */
99
100 void
101 specify_exec_file_hook (void (*hook) (char *))
102 {
103   hook_type *new_array;
104
105   if (deprecated_exec_file_display_hook != NULL)
106     {
107       /* There's already a hook installed.  Arrange to have both it
108        * and the subsequent hooks called. */
109       if (exec_file_hook_count == 0)
110         {
111           /* If this is the first extra hook, initialize the hook array. */
112           exec_file_extra_hooks = (hook_type *) xmalloc (sizeof (hook_type));
113           exec_file_extra_hooks[0] = deprecated_exec_file_display_hook;
114           deprecated_exec_file_display_hook = call_extra_exec_file_hooks;
115           exec_file_hook_count = 1;
116         }
117
118       /* Grow the hook array by one and add the new hook to the end.
119          Yes, it's inefficient to grow it by one each time but since
120          this is hardly ever called it's not a big deal.  */
121       exec_file_hook_count++;
122       new_array =
123         (hook_type *) xrealloc (exec_file_extra_hooks,
124                                 exec_file_hook_count * sizeof (hook_type));
125       exec_file_extra_hooks = new_array;
126       exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
127     }
128   else
129     deprecated_exec_file_display_hook = hook;
130 }
131
132 /* The exec file must be closed before running an inferior.
133    If it is needed again after the inferior dies, it must
134    be reopened.  */
135
136 void
137 close_exec_file (void)
138 {
139 #if 0                           /* FIXME */
140   if (exec_bfd)
141     bfd_tempclose (exec_bfd);
142 #endif
143 }
144
145 void
146 reopen_exec_file (void)
147 {
148 #if 0                           /* FIXME */
149   if (exec_bfd)
150     bfd_reopen (exec_bfd);
151 #else
152   char *filename;
153   int res;
154   struct stat st;
155   long mtime;
156
157   /* Don't do anything if the current target isn't exec. */
158   if (exec_bfd == NULL || strcmp (target_shortname, "exec") != 0)
159     return;
160
161   /* If the timestamp of the exec file has changed, reopen it. */
162   filename = xstrdup (bfd_get_filename (exec_bfd));
163   make_cleanup (xfree, filename);
164   mtime = bfd_get_mtime (exec_bfd);
165   res = stat (filename, &st);
166
167   if (mtime && mtime != st.st_mtime)
168     {
169       exec_open (filename, 0);
170     }
171 #endif
172 }
173 \f
174 /* If we have both a core file and an exec file,
175    print a warning if they don't go together.  */
176
177 void
178 validate_files (void)
179 {
180   if (exec_bfd && core_bfd)
181     {
182       if (!core_file_matches_executable_p (core_bfd, exec_bfd))
183         warning ("core file may not match specified executable file.");
184       else if (bfd_get_mtime (exec_bfd) > bfd_get_mtime (core_bfd))
185         warning ("exec file is newer than core file.");
186     }
187 }
188
189 /* Return the name of the executable file as a string.
190    ERR nonzero means get error if there is none specified;
191    otherwise return 0 in that case.  */
192
193 char *
194 get_exec_file (int err)
195 {
196   if (exec_bfd)
197     return bfd_get_filename (exec_bfd);
198   if (!err)
199     return NULL;
200
201   error ("No executable file specified.\n\
202 Use the \"file\" or \"exec-file\" command.");
203   return NULL;
204 }
205 \f
206
207 /* Report a memory error with error().  */
208
209 void
210 memory_error (int status, CORE_ADDR memaddr)
211 {
212   struct ui_file *tmp_stream = mem_fileopen ();
213   make_cleanup_ui_file_delete (tmp_stream);
214
215   if (status == EIO)
216     {
217       /* Actually, address between memaddr and memaddr + len
218          was out of bounds. */
219       fprintf_unfiltered (tmp_stream, "Cannot access memory at address ");
220       print_address_numeric (memaddr, 1, tmp_stream);
221     }
222   else
223     {
224       fprintf_filtered (tmp_stream, "Error accessing memory address ");
225       print_address_numeric (memaddr, 1, tmp_stream);
226       fprintf_filtered (tmp_stream, ": %s.",
227                        safe_strerror (status));
228     }
229
230   error_stream (tmp_stream);
231 }
232
233 /* Same as target_read_memory, but report an error if can't read.  */
234 void
235 read_memory (CORE_ADDR memaddr, char *myaddr, int len)
236 {
237   int status;
238   status = target_read_memory (memaddr, myaddr, len);
239   if (status != 0)
240     memory_error (status, memaddr);
241 }
242
243 /* Argument / return result struct for use with
244    do_captured_read_memory_integer().  MEMADDR and LEN are filled in
245    by gdb_read_memory_integer().  RESULT is the contents that were
246    successfully read from MEMADDR of length LEN.  */
247
248 struct captured_read_memory_integer_arguments
249 {
250   CORE_ADDR memaddr;
251   int len;
252   LONGEST result;
253 };
254
255 /* Helper function for gdb_read_memory_integer().  DATA must be a
256    pointer to a captured_read_memory_integer_arguments struct. 
257    Return 1 if successful.  Note that the catch_errors() interface
258    will return 0 if an error occurred while reading memory.  This
259    choice of return code is so that we can distinguish between
260    success and failure.  */
261
262 static int
263 do_captured_read_memory_integer (void *data)
264 {
265   struct captured_read_memory_integer_arguments *args = (struct captured_read_memory_integer_arguments*) data;
266   CORE_ADDR memaddr = args->memaddr;
267   int len = args->len;
268
269   args->result = read_memory_integer (memaddr, len);
270
271   return 1;
272 }
273
274 /* Read memory at MEMADDR of length LEN and put the contents in
275    RETURN_VALUE.  Return 0 if MEMADDR couldn't be read and non-zero
276    if successful.  */
277
278 int
279 safe_read_memory_integer (CORE_ADDR memaddr, int len, LONGEST *return_value)
280 {
281   int status;
282   struct captured_read_memory_integer_arguments args;
283   args.memaddr = memaddr;
284   args.len = len;
285
286   status = catch_errors (do_captured_read_memory_integer, &args,
287                         "", RETURN_MASK_ALL);
288   if (status)
289     *return_value = args.result;
290
291   return status;
292 }
293
294 LONGEST
295 read_memory_integer (CORE_ADDR memaddr, int len)
296 {
297   char buf[sizeof (LONGEST)];
298
299   read_memory (memaddr, buf, len);
300   return extract_signed_integer (buf, len);
301 }
302
303 ULONGEST
304 read_memory_unsigned_integer (CORE_ADDR memaddr, int len)
305 {
306   char buf[sizeof (ULONGEST)];
307
308   read_memory (memaddr, buf, len);
309   return extract_unsigned_integer (buf, len);
310 }
311
312 void
313 read_memory_string (CORE_ADDR memaddr, char *buffer, int max_len)
314 {
315   char *cp;
316   int i;
317   int cnt;
318
319   cp = buffer;
320   while (1)
321     {
322       if (cp - buffer >= max_len)
323         {
324           buffer[max_len - 1] = '\0';
325           break;
326         }
327       cnt = max_len - (cp - buffer);
328       if (cnt > 8)
329         cnt = 8;
330       read_memory (memaddr + (int) (cp - buffer), cp, cnt);
331       for (i = 0; i < cnt && *cp; i++, cp++)
332         ;                       /* null body */
333
334       if (i < cnt && !*cp)
335         break;
336     }
337 }
338
339 CORE_ADDR
340 read_memory_typed_address (CORE_ADDR addr, struct type *type)
341 {
342   char *buf = alloca (TYPE_LENGTH (type));
343   read_memory (addr, buf, TYPE_LENGTH (type));
344   return extract_typed_address (buf, type);
345 }
346
347 /* Same as target_write_memory, but report an error if can't write.  */
348 void
349 write_memory (CORE_ADDR memaddr, char *myaddr, int len)
350 {
351   int status;
352
353   status = target_write_memory (memaddr, myaddr, len);
354   if (status != 0)
355     memory_error (status, memaddr);
356 }
357
358 /* Store VALUE at ADDR in the inferior as a LEN-byte unsigned integer.  */
359 void
360 write_memory_unsigned_integer (CORE_ADDR addr, int len, ULONGEST value)
361 {
362   char *buf = alloca (len);
363   store_unsigned_integer (buf, len, value);
364   write_memory (addr, buf, len);
365 }
366
367 /* Store VALUE at ADDR in the inferior as a LEN-byte signed integer.  */
368 void
369 write_memory_signed_integer (CORE_ADDR addr, int len, LONGEST value)
370 {
371   char *buf = alloca (len);
372   store_signed_integer (buf, len, value);
373   write_memory (addr, buf, len);
374 }
375
376 \f
377
378 #if 0
379 /* Enable after 4.12.  It is not tested.  */
380
381 /* Search code.  Targets can just make this their search function, or
382    if the protocol has a less general search function, they can call this
383    in the cases it can't handle.  */
384 void
385 generic_search (int len, char *data, char *mask, CORE_ADDR startaddr,
386                 int increment, CORE_ADDR lorange, CORE_ADDR hirange,
387                 CORE_ADDR *addr_found, char *data_found)
388 {
389   int i;
390   CORE_ADDR curaddr = startaddr;
391
392   while (curaddr >= lorange && curaddr < hirange)
393     {
394       read_memory (curaddr, data_found, len);
395       for (i = 0; i < len; ++i)
396         if ((data_found[i] & mask[i]) != data[i])
397           goto try_again;
398       /* It matches.  */
399       *addr_found = curaddr;
400       return;
401
402     try_again:
403       curaddr += increment;
404     }
405   *addr_found = (CORE_ADDR) 0;
406   return;
407 }
408 #endif /* 0 */
409 \f
410 /* The current default bfd target.  Points to storage allocated for
411    gnutarget_string.  */
412 char *gnutarget;
413
414 /* Same thing, except it is "auto" not NULL for the default case.  */
415 static char *gnutarget_string;
416
417 static void set_gnutarget_command (char *, int, struct cmd_list_element *);
418
419 static void
420 set_gnutarget_command (char *ignore, int from_tty, struct cmd_list_element *c)
421 {
422   if (strcmp (gnutarget_string, "auto") == 0)
423     gnutarget = NULL;
424   else
425     gnutarget = gnutarget_string;
426 }
427
428 /* Set the gnutarget.  */
429 void
430 set_gnutarget (char *newtarget)
431 {
432   if (gnutarget_string != NULL)
433     xfree (gnutarget_string);
434   gnutarget_string = savestring (newtarget, strlen (newtarget));
435   set_gnutarget_command (NULL, 0, NULL);
436 }
437
438 void
439 _initialize_core (void)
440 {
441   struct cmd_list_element *c;
442   c = add_cmd ("core-file", class_files, core_file_command,
443                "Use FILE as core dump for examining memory and registers.\n\
444 No arg means have no core file.  This command has been superseded by the\n\
445 `target core' and `detach' commands.", &cmdlist);
446   set_cmd_completer (c, filename_completer);
447
448   c = add_set_cmd ("gnutarget", class_files, var_string_noescape,
449                    (char *) &gnutarget_string,
450                    "Set the current BFD target.\n\
451 Use `set gnutarget auto' to specify automatic detection.",
452                    &setlist);
453   set_cmd_sfunc (c, set_gnutarget_command);
454   deprecated_add_show_from_set (c, &showlist);
455
456   if (getenv ("GNUTARGET"))
457     set_gnutarget (getenv ("GNUTARGET"));
458   else
459     set_gnutarget ("auto");
460 }