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