OSDN Git Service

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