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