1/* Work with executable files, for GDB.
2
3   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4   1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
5   Inc.
6
7   This file is part of GDB.
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with this program; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place - Suite 330,
22   Boston, MA 02111-1307, USA.  */
23
24#include "defs.h"
25#include "frame.h"
26#include "inferior.h"
27#include "target.h"
28#include "gdbcmd.h"
29#include "language.h"
30#include "symfile.h"
31#include "objfiles.h"
32#include "completer.h"
33#include "value.h"
34#include "exec.h"
35
36#ifdef USG
37#include <sys/types.h>
38#endif
39
40#include <fcntl.h>
41#include "readline/readline.h"
42#include "gdb_string.h"
43
44#include "gdbcore.h"
45
46#include <ctype.h>
47#include "gdb_stat.h"
48#ifndef O_BINARY
49#define O_BINARY 0
50#endif
51
52#include "xcoffsolib.h"
53
54struct vmap *map_vmap (bfd *, bfd *);
55
56void (*file_changed_hook) (char *);
57
58/* Prototypes for local functions */
59
60static void exec_close (int);
61
62static void file_command (char *, int);
63
64static void set_section_command (char *, int);
65
66static void exec_files_info (struct target_ops *);
67
68static int ignore (CORE_ADDR, char *);
69
70static void init_exec_ops (void);
71
72void _initialize_exec (void);
73
74/* The target vector for executable files.  */
75
76struct target_ops exec_ops;
77
78/* The Binary File Descriptor handle for the executable file.  */
79
80bfd *exec_bfd = NULL;
81
82/* Whether to open exec and core files read-only or read-write.  */
83
84int write_files = 0;
85
86struct vmap *vmap;
87
88void
89exec_open (char *args, int from_tty)
90{
91  target_preopen (from_tty);
92  exec_file_attach (args, from_tty);
93}
94
95static void
96exec_close (int quitting)
97{
98  int need_symtab_cleanup = 0;
99  struct vmap *vp, *nxt;
100
101  for (nxt = vmap; nxt != NULL;)
102    {
103      vp = nxt;
104      nxt = vp->nxt;
105
106      /* if there is an objfile associated with this bfd,
107         free_objfile() will do proper cleanup of objfile *and* bfd. */
108
109      if (vp->objfile)
110	{
111	  free_objfile (vp->objfile);
112	  need_symtab_cleanup = 1;
113	}
114      else if (vp->bfd != exec_bfd)
115	/* FIXME-leak: We should be freeing vp->name too, I think.  */
116	if (!bfd_close (vp->bfd))
117	  warning ("cannot close \"%s\": %s",
118		   vp->name, bfd_errmsg (bfd_get_error ()));
119
120      /* FIXME: This routine is #if 0'd in symfile.c.  What should we
121         be doing here?  Should we just free everything in
122         vp->objfile->symtabs?  Should free_objfile do that?
123         FIXME-as-well: free_objfile already free'd vp->name, so it isn't
124         valid here.  */
125      free_named_symtabs (vp->name);
126      xfree (vp);
127    }
128
129  vmap = NULL;
130
131  if (exec_bfd)
132    {
133      char *name = bfd_get_filename (exec_bfd);
134
135      if (!bfd_close (exec_bfd))
136	warning ("cannot close \"%s\": %s",
137		 name, bfd_errmsg (bfd_get_error ()));
138      xfree (name);
139      exec_bfd = NULL;
140    }
141
142  if (exec_ops.to_sections)
143    {
144      xfree (exec_ops.to_sections);
145      exec_ops.to_sections = NULL;
146      exec_ops.to_sections_end = NULL;
147    }
148}
149
150void
151exec_file_clear (int from_tty)
152{
153  /* Remove exec file.  */
154  unpush_target (&exec_ops);
155
156  if (from_tty)
157    printf_unfiltered ("No executable file now.\n");
158}
159
160/*  Process the first arg in ARGS as the new exec file.
161
162   This function is intended to be behave essentially the same
163   as exec_file_command, except that the latter will detect when
164   a target is being debugged, and will ask the user whether it
165   should be shut down first.  (If the answer is "no", then the
166   new file is ignored.)
167
168   This file is used by exec_file_command, to do the work of opening
169   and processing the exec file after any prompting has happened.
170
171   And, it is used by child_attach, when the attach command was
172   given a pid but not a exec pathname, and the attach command could
173   figure out the pathname from the pid.  (In this case, we shouldn't
174   ask the user whether the current target should be shut down --
175   we're supplying the exec pathname late for good reason.)
176
177   ARGS is assumed to be the filename. */
178
179void
180exec_file_attach (char *filename, int from_tty)
181{
182  /* Remove any previous exec file.  */
183  unpush_target (&exec_ops);
184
185  /* Now open and digest the file the user requested, if any.  */
186
187  if (!filename)
188    {
189      if (from_tty)
190        printf_unfiltered ("No executable file now.\n");
191    }
192  else
193    {
194      char *scratch_pathname;
195      int scratch_chan;
196
197      scratch_chan = openp (getenv ("PATH"), 1, filename,
198		   write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0,
199			    &scratch_pathname);
200#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
201      if (scratch_chan < 0)
202	{
203	  char *exename = alloca (strlen (filename) + 5);
204	  strcat (strcpy (exename, filename), ".exe");
205	  scratch_chan = openp (getenv ("PATH"), 1, exename, write_files ?
206	     O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, &scratch_pathname);
207	}
208#endif
209      if (scratch_chan < 0)
210	perror_with_name (filename);
211      exec_bfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
212
213      if (!exec_bfd)
214	error ("\"%s\": could not open as an executable file: %s",
215	       scratch_pathname, bfd_errmsg (bfd_get_error ()));
216
217      /* At this point, scratch_pathname and exec_bfd->name both point to the
218         same malloc'd string.  However exec_close() will attempt to free it
219         via the exec_bfd->name pointer, so we need to make another copy and
220         leave exec_bfd as the new owner of the original copy. */
221      scratch_pathname = xstrdup (scratch_pathname);
222      make_cleanup (xfree, scratch_pathname);
223
224      if (!bfd_check_format (exec_bfd, bfd_object))
225	{
226	  /* Make sure to close exec_bfd, or else "run" might try to use
227	     it.  */
228	  exec_close (0);
229	  error ("\"%s\": not in executable format: %s",
230		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
231	}
232
233      /* FIXME - This should only be run for RS6000, but the ifdef is a poor
234         way to accomplish.  */
235#ifdef DEPRECATED_IBM6000_TARGET
236      /* Setup initial vmap. */
237
238      map_vmap (exec_bfd, 0);
239      if (vmap == NULL)
240	{
241	  /* Make sure to close exec_bfd, or else "run" might try to use
242	     it.  */
243	  exec_close (0);
244	  error ("\"%s\": can't find the file sections: %s",
245		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
246	}
247#endif /* DEPRECATED_IBM6000_TARGET */
248
249      if (build_section_table (exec_bfd, &exec_ops.to_sections,
250			       &exec_ops.to_sections_end))
251	{
252	  /* Make sure to close exec_bfd, or else "run" might try to use
253	     it.  */
254	  exec_close (0);
255	  error ("\"%s\": can't find the file sections: %s",
256		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
257	}
258
259#ifdef DEPRECATED_HPUX_TEXT_END
260      DEPRECATED_HPUX_TEXT_END (&exec_ops);
261#endif
262
263      validate_files ();
264
265      set_gdbarch_from_file (exec_bfd);
266
267      push_target (&exec_ops);
268
269      /* Tell display code (if any) about the changed file name.  */
270      if (exec_file_display_hook)
271	(*exec_file_display_hook) (filename);
272    }
273}
274
275/*  Process the first arg in ARGS as the new exec file.
276
277   Note that we have to explicitly ignore additional args, since we can
278   be called from file_command(), which also calls symbol_file_command()
279   which can take multiple args.
280
281   If ARGS is NULL, we just want to close the exec file. */
282
283static void
284exec_file_command (char *args, int from_tty)
285{
286  char **argv;
287  char *filename;
288
289  target_preopen (from_tty);
290
291  if (args)
292    {
293      /* Scan through the args and pick up the first non option arg
294         as the filename.  */
295
296      argv = buildargv (args);
297      if (argv == NULL)
298        nomem (0);
299
300      make_cleanup_freeargv (argv);
301
302      for (; (*argv != NULL) && (**argv == '-'); argv++)
303        {;
304        }
305      if (*argv == NULL)
306        error ("No executable file name was specified");
307
308      filename = tilde_expand (*argv);
309      make_cleanup (xfree, filename);
310      exec_file_attach (filename, from_tty);
311    }
312  else
313    exec_file_attach (NULL, from_tty);
314}
315
316/* Set both the exec file and the symbol file, in one command.
317   What a novelty.  Why did GDB go through four major releases before this
318   command was added?  */
319
320static void
321file_command (char *arg, int from_tty)
322{
323  /* FIXME, if we lose on reading the symbol file, we should revert
324     the exec file, but that's rough.  */
325  exec_file_command (arg, from_tty);
326  symbol_file_command (arg, from_tty);
327  if (file_changed_hook)
328    file_changed_hook (arg);
329}
330
331
332/* Locate all mappable sections of a BFD file.
333   table_pp_char is a char * to get it through bfd_map_over_sections;
334   we cast it back to its proper type.  */
335
336static void
337add_to_section_table (bfd *abfd, struct bfd_section *asect,
338		      void *table_pp_char)
339{
340  struct section_table **table_pp = (struct section_table **) table_pp_char;
341  flagword aflag;
342
343  aflag = bfd_get_section_flags (abfd, asect);
344  if (!(aflag & SEC_ALLOC))
345    return;
346  if (0 == bfd_section_size (abfd, asect))
347    return;
348  (*table_pp)->bfd = abfd;
349  (*table_pp)->the_bfd_section = asect;
350  (*table_pp)->addr = bfd_section_vma (abfd, asect);
351  (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
352  (*table_pp)++;
353}
354
355/* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
356   Returns 0 if OK, 1 on error.  */
357
358int
359build_section_table (struct bfd *some_bfd, struct section_table **start,
360		     struct section_table **end)
361{
362  unsigned count;
363
364  count = bfd_count_sections (some_bfd);
365  if (*start)
366    xfree (* start);
367  *start = (struct section_table *) xmalloc (count * sizeof (**start));
368  *end = *start;
369  bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
370  if (*end > *start + count)
371    internal_error (__FILE__, __LINE__, "failed internal consistency check");
372  /* We could realloc the table, but it probably loses for most files.  */
373  return 0;
374}
375
376static void
377bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3)
378{
379  struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
380  struct vmap *vp;
381
382  vp = vmap_bfd->pvmap;
383
384  if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
385    return;
386
387  if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".text"))
388    {
389      vp->tstart = bfd_section_vma (abfd, sect);
390      vp->tend = vp->tstart + bfd_section_size (abfd, sect);
391      vp->tvma = bfd_section_vma (abfd, sect);
392      vp->toffs = sect->filepos;
393    }
394  else if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".data"))
395    {
396      vp->dstart = bfd_section_vma (abfd, sect);
397      vp->dend = vp->dstart + bfd_section_size (abfd, sect);
398      vp->dvma = bfd_section_vma (abfd, sect);
399    }
400  /* Silently ignore other types of sections. (FIXME?)  */
401}
402
403/* Make a vmap for ABFD which might be a member of the archive ARCH.
404   Return the new vmap.  */
405
406struct vmap *
407map_vmap (bfd *abfd, bfd *arch)
408{
409  struct vmap_and_bfd vmap_bfd;
410  struct vmap *vp, **vpp;
411
412  vp = (struct vmap *) xmalloc (sizeof (*vp));
413  memset ((char *) vp, '\0', sizeof (*vp));
414  vp->nxt = 0;
415  vp->bfd = abfd;
416  vp->name = bfd_get_filename (arch ? arch : abfd);
417  vp->member = arch ? bfd_get_filename (abfd) : "";
418
419  vmap_bfd.pbfd = arch;
420  vmap_bfd.pvmap = vp;
421  bfd_map_over_sections (abfd, bfdsec_to_vmap, &vmap_bfd);
422
423  /* Find the end of the list and append. */
424  for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
425    ;
426  *vpp = vp;
427
428  return vp;
429}
430
431/* Read or write the exec file.
432
433   Args are address within a BFD file, address within gdb address-space,
434   length, and a flag indicating whether to read or write.
435
436   Result is a length:
437
438   0:    We cannot handle this address and length.
439   > 0:  We have handled N bytes starting at this address.
440   (If N == length, we did it all.)  We might be able
441   to handle more bytes beyond this length, but no
442   promises.
443   < 0:  We cannot handle this address, but if somebody
444   else handles (-N) bytes, we can start from there.
445
446   The same routine is used to handle both core and exec files;
447   we just tail-call it with more arguments to select between them.  */
448
449int
450xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
451	     struct mem_attrib *attrib,
452	     struct target_ops *target)
453{
454  int res;
455  struct section_table *p;
456  CORE_ADDR nextsectaddr, memend;
457  asection *section = NULL;
458
459  if (len <= 0)
460    internal_error (__FILE__, __LINE__, "failed internal consistency check");
461
462  if (overlay_debugging)
463    {
464      section = find_pc_overlay (memaddr);
465      if (pc_in_unmapped_range (memaddr, section))
466	memaddr = overlay_mapped_address (memaddr, section);
467    }
468
469  memend = memaddr + len;
470  nextsectaddr = memend;
471
472  for (p = target->to_sections; p < target->to_sections_end; p++)
473    {
474      if (overlay_debugging && section && p->the_bfd_section &&
475	  strcmp (section->name, p->the_bfd_section->name) != 0)
476	continue;		/* not the section we need */
477      if (memaddr >= p->addr)
478        {
479	  if (memend <= p->endaddr)
480	    {
481	      /* Entire transfer is within this section.  */
482	      if (write)
483		res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
484						myaddr, memaddr - p->addr,
485						len);
486	      else
487		res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
488						myaddr, memaddr - p->addr,
489						len);
490	      return (res != 0) ? len : 0;
491	    }
492	  else if (memaddr >= p->endaddr)
493	    {
494	      /* This section ends before the transfer starts.  */
495	      continue;
496	    }
497	  else
498	    {
499	      /* This section overlaps the transfer.  Just do half.  */
500	      len = p->endaddr - memaddr;
501	      if (write)
502		res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
503						myaddr, memaddr - p->addr,
504						len);
505	      else
506		res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
507						myaddr, memaddr - p->addr,
508						len);
509	      return (res != 0) ? len : 0;
510	    }
511        }
512      else
513	nextsectaddr = min (nextsectaddr, p->addr);
514    }
515
516  if (nextsectaddr >= memend)
517    return 0;			/* We can't help */
518  else
519    return -(nextsectaddr - memaddr);	/* Next boundary where we can help */
520}
521
522
523void
524print_section_info (struct target_ops *t, bfd *abfd)
525{
526  struct section_table *p;
527  /* FIXME: "016l" is not wide enough when TARGET_ADDR_BIT > 64.  */
528  char *fmt = TARGET_ADDR_BIT <= 32 ? "08l" : "016l";
529
530  printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
531  wrap_here ("        ");
532  printf_filtered ("file type %s.\n", bfd_get_target (abfd));
533  if (abfd == exec_bfd)
534    {
535      printf_filtered ("\tEntry point: ");
536      print_address_numeric (bfd_get_start_address (abfd), 1, gdb_stdout);
537      printf_filtered ("\n");
538    }
539  for (p = t->to_sections; p < t->to_sections_end; p++)
540    {
541      printf_filtered ("\t%s", local_hex_string_custom (p->addr, fmt));
542      printf_filtered (" - %s", local_hex_string_custom (p->endaddr, fmt));
543
544      /* FIXME: A format of "08l" is not wide enough for file offsets
545	 larger than 4GB.  OTOH, making it "016l" isn't desirable either
546	 since most output will then be much wider than necessary.  It
547	 may make sense to test the size of the file and choose the
548	 format string accordingly.  */
549      if (info_verbose)
550	printf_filtered (" @ %s",
551			 local_hex_string_custom (p->the_bfd_section->filepos, "08l"));
552      printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
553      if (p->bfd != abfd)
554	{
555	  printf_filtered (" in %s", bfd_get_filename (p->bfd));
556	}
557      printf_filtered ("\n");
558    }
559}
560
561static void
562exec_files_info (struct target_ops *t)
563{
564  print_section_info (t, exec_bfd);
565
566  if (vmap)
567    {
568      struct vmap *vp;
569
570      printf_unfiltered ("\tMapping info for file `%s'.\n", vmap->name);
571      printf_unfiltered ("\t  %*s   %*s   %*s   %*s %8.8s %s\n",
572			 strlen_paddr (), "tstart",
573			 strlen_paddr (), "tend",
574			 strlen_paddr (), "dstart",
575			 strlen_paddr (), "dend",
576			 "section",
577			 "file(member)");
578
579      for (vp = vmap; vp; vp = vp->nxt)
580	printf_unfiltered ("\t0x%s 0x%s 0x%s 0x%s %s%s%s%s\n",
581			   paddr (vp->tstart),
582			   paddr (vp->tend),
583			   paddr (vp->dstart),
584			   paddr (vp->dend),
585			   vp->name,
586			   *vp->member ? "(" : "", vp->member,
587			   *vp->member ? ")" : "");
588    }
589}
590
591/* msnyder 5/21/99:
592   exec_set_section_offsets sets the offsets of all the sections
593   in the exec objfile.  */
594
595void
596exec_set_section_offsets (bfd_signed_vma text_off, bfd_signed_vma data_off,
597			  bfd_signed_vma bss_off)
598{
599  struct section_table *sect;
600
601  for (sect = exec_ops.to_sections;
602       sect < exec_ops.to_sections_end;
603       sect++)
604    {
605      flagword flags;
606
607      flags = bfd_get_section_flags (exec_bfd, sect->the_bfd_section);
608
609      if (flags & SEC_CODE)
610	{
611	  sect->addr += text_off;
612	  sect->endaddr += text_off;
613	}
614      else if (flags & (SEC_DATA | SEC_LOAD))
615	{
616	  sect->addr += data_off;
617	  sect->endaddr += data_off;
618	}
619      else if (flags & SEC_ALLOC)
620	{
621	  sect->addr += bss_off;
622	  sect->endaddr += bss_off;
623	}
624    }
625}
626
627static void
628set_section_command (char *args, int from_tty)
629{
630  struct section_table *p;
631  char *secname;
632  unsigned seclen;
633  unsigned long secaddr;
634  char secprint[100];
635  long offset;
636
637  if (args == 0)
638    error ("Must specify section name and its virtual address");
639
640  /* Parse out section name */
641  for (secname = args; !isspace (*args); args++);
642  seclen = args - secname;
643
644  /* Parse out new virtual address */
645  secaddr = parse_and_eval_address (args);
646
647  for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
648    {
649      if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen)
650	  && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0')
651	{
652	  offset = secaddr - p->addr;
653	  p->addr += offset;
654	  p->endaddr += offset;
655	  if (from_tty)
656	    exec_files_info (&exec_ops);
657	  return;
658	}
659    }
660  if (seclen >= sizeof (secprint))
661    seclen = sizeof (secprint) - 1;
662  strncpy (secprint, secname, seclen);
663  secprint[seclen] = '\0';
664  error ("Section %s not found", secprint);
665}
666
667/* If mourn is being called in all the right places, this could be say
668   `gdb internal error' (since generic_mourn calls
669   breakpoint_init_inferior).  */
670
671static int
672ignore (CORE_ADDR addr, char *contents)
673{
674  return 0;
675}
676
677/* Find mapped memory. */
678
679extern void
680exec_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
681						    unsigned long,
682						    int, int, int,
683						    void *),
684					   void *))
685{
686  exec_ops.to_find_memory_regions = func;
687}
688
689static char *exec_make_note_section (bfd *, int *);
690
691/* Fill in the exec file target vector.  Very few entries need to be
692   defined.  */
693
694static void
695init_exec_ops (void)
696{
697  exec_ops.to_shortname = "exec";
698  exec_ops.to_longname = "Local exec file";
699  exec_ops.to_doc = "Use an executable file as a target.\n\
700Specify the filename of the executable file.";
701  exec_ops.to_open = exec_open;
702  exec_ops.to_close = exec_close;
703  exec_ops.to_attach = find_default_attach;
704  exec_ops.to_xfer_memory = xfer_memory;
705  exec_ops.to_files_info = exec_files_info;
706  exec_ops.to_insert_breakpoint = ignore;
707  exec_ops.to_remove_breakpoint = ignore;
708  exec_ops.to_create_inferior = find_default_create_inferior;
709  exec_ops.to_stratum = file_stratum;
710  exec_ops.to_has_memory = 1;
711  exec_ops.to_make_corefile_notes = exec_make_note_section;
712  exec_ops.to_magic = OPS_MAGIC;
713}
714
715void
716_initialize_exec (void)
717{
718  struct cmd_list_element *c;
719
720  init_exec_ops ();
721
722  if (!dbx_commands)
723    {
724      c = add_cmd ("file", class_files, file_command,
725		   "Use FILE as program to be debugged.\n\
726It is read for its symbols, for getting the contents of pure memory,\n\
727and it is the program executed when you use the `run' command.\n\
728If FILE cannot be found as specified, your execution directory path\n\
729($PATH) is searched for a command of that name.\n\
730No arg means to have no executable file and no symbols.", &cmdlist);
731      set_cmd_completer (c, filename_completer);
732    }
733
734  c = add_cmd ("exec-file", class_files, exec_file_command,
735	       "Use FILE as program for getting contents of pure memory.\n\
736If FILE cannot be found as specified, your execution directory path\n\
737is searched for a command of that name.\n\
738No arg means have no executable file.", &cmdlist);
739  set_cmd_completer (c, filename_completer);
740
741  add_com ("section", class_files, set_section_command,
742	   "Change the base address of section SECTION of the exec file to ADDR.\n\
743This can be used if the exec file does not contain section addresses,\n\
744(such as in the a.out format), or when the addresses specified in the\n\
745file itself are wrong.  Each section must be changed separately.  The\n\
746``info files'' command lists all the sections and their addresses.");
747
748  add_show_from_set
749    (add_set_cmd ("write", class_support, var_boolean, (char *) &write_files,
750		  "Set writing into executable and core files.",
751		  &setlist),
752     &showlist);
753
754  add_target (&exec_ops);
755}
756
757static char *
758exec_make_note_section (bfd *obfd, int *note_size)
759{
760  error ("Can't create a corefile");
761}
762