615d5c097ed20e4116a9628077e0dae2299d09c6
[platform/upstream/binutils.git] / gdb / exec.c
1 /* Work with executable files, for GDB. 
2
3    Copyright (C) 1988-2003, 2007-2012 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "frame.h"
22 #include "inferior.h"
23 #include "target.h"
24 #include "gdbcmd.h"
25 #include "language.h"
26 #include "filenames.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29 #include "completer.h"
30 #include "value.h"
31 #include "exec.h"
32 #include "observer.h"
33 #include "arch-utils.h"
34 #include "gdbthread.h"
35 #include "progspace.h"
36 #include "gdb_bfd.h"
37
38 #include <fcntl.h>
39 #include "readline/readline.h"
40 #include "gdb_string.h"
41
42 #include "gdbcore.h"
43
44 #include <ctype.h>
45 #include "gdb_stat.h"
46
47 #include "xcoffsolib.h"
48
49 struct vmap *map_vmap (bfd *, bfd *);
50
51 void (*deprecated_file_changed_hook) (char *);
52
53 /* Prototypes for local functions */
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 /* True if the exec target is pushed on the stack.  */
70 static int using_exec_ops;
71
72 /* Whether to open exec and core files read-only or read-write.  */
73
74 int write_files = 0;
75 static void
76 show_write_files (struct ui_file *file, int from_tty,
77                   struct cmd_list_element *c, const char *value)
78 {
79   fprintf_filtered (file, _("Writing into executable and core files is %s.\n"),
80                     value);
81 }
82
83
84 struct vmap *vmap;
85
86 static void
87 exec_open (char *args, int from_tty)
88 {
89   target_preopen (from_tty);
90   exec_file_attach (args, from_tty);
91 }
92
93 /* Close and clear exec_bfd.  If we end up with no target sections to
94    read memory from, this unpushes the exec_ops target.  */
95
96 void
97 exec_close (void)
98 {
99   if (exec_bfd)
100     {
101       bfd *abfd = exec_bfd;
102
103       gdb_bfd_unref (abfd);
104
105       /* Removing target sections may close the exec_ops target.
106          Clear exec_bfd before doing so to prevent recursion.  */
107       exec_bfd = NULL;
108       exec_bfd_mtime = 0;
109
110       remove_target_sections (&exec_bfd, abfd);
111     }
112 }
113
114 /* This is the target_close implementation.  Clears all target
115    sections and closes all executable bfds from all program spaces.  */
116
117 static void
118 exec_close_1 (int quitting)
119 {
120   int need_symtab_cleanup = 0;
121   struct vmap *vp, *nxt;
122
123   using_exec_ops = 0;
124
125   for (nxt = vmap; nxt != NULL;)
126     {
127       vp = nxt;
128       nxt = vp->nxt;
129
130       if (vp->objfile)
131         {
132           free_objfile (vp->objfile);
133           need_symtab_cleanup = 1;
134         }
135
136       gdb_bfd_unref (vp->bfd);
137
138       xfree (vp);
139     }
140
141   vmap = NULL;
142
143   {
144     struct program_space *ss;
145     struct cleanup *old_chain;
146
147     old_chain = save_current_program_space ();
148     ALL_PSPACES (ss)
149     {
150       set_current_program_space (ss);
151
152       /* Delete all target sections.  */
153       resize_section_table
154         (current_target_sections,
155          -resize_section_table (current_target_sections, 0));
156
157       exec_close ();
158     }
159
160     do_cleanups (old_chain);
161   }
162 }
163
164 void
165 exec_file_clear (int from_tty)
166 {
167   /* Remove exec file.  */
168   exec_close ();
169
170   if (from_tty)
171     printf_unfiltered (_("No executable file now.\n"));
172 }
173
174 /* Set FILENAME as the new exec file.
175
176    This function is intended to be behave essentially the same
177    as exec_file_command, except that the latter will detect when
178    a target is being debugged, and will ask the user whether it
179    should be shut down first.  (If the answer is "no", then the
180    new file is ignored.)
181
182    This file is used by exec_file_command, to do the work of opening
183    and processing the exec file after any prompting has happened.
184
185    And, it is used by child_attach, when the attach command was
186    given a pid but not a exec pathname, and the attach command could
187    figure out the pathname from the pid.  (In this case, we shouldn't
188    ask the user whether the current target should be shut down --
189    we're supplying the exec pathname late for good reason.)  */
190
191 void
192 exec_file_attach (char *filename, int from_tty)
193 {
194   /* Remove any previous exec file.  */
195   exec_close ();
196
197   /* Now open and digest the file the user requested, if any.  */
198
199   if (!filename)
200     {
201       if (from_tty)
202         printf_unfiltered (_("No executable file now.\n"));
203
204       set_gdbarch_from_file (NULL);
205     }
206   else
207     {
208       struct cleanup *cleanups;
209       char *scratch_pathname;
210       int scratch_chan;
211       struct target_section *sections = NULL, *sections_end = NULL;
212       char **matching;
213
214       scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
215                    write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
216                             &scratch_pathname);
217 #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
218       if (scratch_chan < 0)
219         {
220           char *exename = alloca (strlen (filename) + 5);
221
222           strcat (strcpy (exename, filename), ".exe");
223           scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename,
224              write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
225              &scratch_pathname);
226         }
227 #endif
228
229       cleanups = make_cleanup (xfree, scratch_pathname);
230
231       if (scratch_chan < 0)
232         perror_with_name (filename);
233       if (write_files)
234         exec_bfd = gdb_bfd_fopen (scratch_pathname, gnutarget,
235                                   FOPEN_RUB, scratch_chan);
236       else
237         exec_bfd = gdb_bfd_open (scratch_pathname, gnutarget, scratch_chan);
238
239       if (!exec_bfd)
240         {
241           error (_("\"%s\": could not open as an executable file: %s"),
242                  scratch_pathname, bfd_errmsg (bfd_get_error ()));
243         }
244
245       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
246         {
247           /* Make sure to close exec_bfd, or else "run" might try to use
248              it.  */
249           exec_close ();
250           error (_("\"%s\": not in executable format: %s"),
251                  scratch_pathname,
252                  gdb_bfd_errmsg (bfd_get_error (), matching));
253         }
254
255       /* FIXME - This should only be run for RS6000, but the ifdef is a poor
256          way to accomplish.  */
257 #ifdef DEPRECATED_IBM6000_TARGET
258       /* Setup initial vmap.  */
259
260       map_vmap (exec_bfd, 0);
261       if (vmap == NULL)
262         {
263           /* Make sure to close exec_bfd, or else "run" might try to use
264              it.  */
265           exec_close ();
266           error (_("\"%s\": can't find the file sections: %s"),
267                  scratch_pathname, bfd_errmsg (bfd_get_error ()));
268         }
269 #endif /* DEPRECATED_IBM6000_TARGET */
270
271       if (build_section_table (exec_bfd, &sections, &sections_end))
272         {
273           /* Make sure to close exec_bfd, or else "run" might try to use
274              it.  */
275           exec_close ();
276           error (_("\"%s\": can't find the file sections: %s"),
277                  scratch_pathname, bfd_errmsg (bfd_get_error ()));
278         }
279
280       exec_bfd_mtime = bfd_get_mtime (exec_bfd);
281
282       validate_files ();
283
284       set_gdbarch_from_file (exec_bfd);
285
286       /* Add the executable's sections to the current address spaces'
287          list of sections.  This possibly pushes the exec_ops
288          target.  */
289       add_target_sections (&exec_bfd, sections, sections_end);
290       xfree (sections);
291
292       /* Tell display code (if any) about the changed file name.  */
293       if (deprecated_exec_file_display_hook)
294         (*deprecated_exec_file_display_hook) (filename);
295
296       do_cleanups (cleanups);
297     }
298   bfd_cache_close_all ();
299   observer_notify_executable_changed ();
300 }
301
302 /*  Process the first arg in ARGS as the new exec file.
303
304    Note that we have to explicitly ignore additional args, since we can
305    be called from file_command(), which also calls symbol_file_command()
306    which can take multiple args.
307    
308    If ARGS is NULL, we just want to close the exec file.  */
309
310 static void
311 exec_file_command (char *args, int from_tty)
312 {
313   char **argv;
314   char *filename;
315
316   if (from_tty && target_has_execution
317       && !query (_("A program is being debugged already.\n"
318                    "Are you sure you want to change the file? ")))
319     error (_("File not changed."));
320
321   if (args)
322     {
323       struct cleanup *cleanups;
324
325       /* Scan through the args and pick up the first non option arg
326          as the filename.  */
327
328       argv = gdb_buildargv (args);
329       cleanups = make_cleanup_freeargv (argv);
330
331       for (; (*argv != NULL) && (**argv == '-'); argv++)
332         {;
333         }
334       if (*argv == NULL)
335         error (_("No executable file name was specified"));
336
337       filename = tilde_expand (*argv);
338       make_cleanup (xfree, filename);
339       exec_file_attach (filename, from_tty);
340
341       do_cleanups (cleanups);
342     }
343   else
344     exec_file_attach (NULL, from_tty);
345 }
346
347 /* Set both the exec file and the symbol file, in one command.
348    What a novelty.  Why did GDB go through four major releases before this
349    command was added?  */
350
351 static void
352 file_command (char *arg, int from_tty)
353 {
354   /* FIXME, if we lose on reading the symbol file, we should revert
355      the exec file, but that's rough.  */
356   exec_file_command (arg, from_tty);
357   symbol_file_command (arg, from_tty);
358   if (deprecated_file_changed_hook)
359     deprecated_file_changed_hook (arg);
360 }
361 \f
362
363 /* Locate all mappable sections of a BFD file.
364    table_pp_char is a char * to get it through bfd_map_over_sections;
365    we cast it back to its proper type.  */
366
367 static void
368 add_to_section_table (bfd *abfd, struct bfd_section *asect,
369                       void *table_pp_char)
370 {
371   struct target_section **table_pp = (struct target_section **) table_pp_char;
372   flagword aflag;
373
374   /* Check the section flags, but do not discard zero-length sections, since
375      some symbols may still be attached to this section.  For instance, we
376      encountered on sparc-solaris 2.10 a shared library with an empty .bss
377      section to which a symbol named "_end" was attached.  The address
378      of this symbol still needs to be relocated.  */
379   aflag = bfd_get_section_flags (abfd, asect);
380   if (!(aflag & SEC_ALLOC))
381     return;
382
383   (*table_pp)->key = NULL;
384   (*table_pp)->bfd = abfd;
385   (*table_pp)->the_bfd_section = asect;
386   (*table_pp)->addr = bfd_section_vma (abfd, asect);
387   (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
388   (*table_pp)++;
389 }
390
391 int
392 resize_section_table (struct target_section_table *table, int num_added)
393 {
394   struct target_section *old_value;
395   int old_count;
396   int new_count;
397
398   old_value = table->sections;
399   old_count = table->sections_end - table->sections;
400
401   new_count = num_added + old_count;
402
403   if (new_count)
404     {
405       table->sections = xrealloc (table->sections,
406                                   sizeof (struct target_section) * new_count);
407       table->sections_end = table->sections + new_count;
408     }
409   else
410     {
411       xfree (table->sections);
412       table->sections = table->sections_end = NULL;
413     }
414
415   return old_count;
416 }
417
418 /* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
419    Returns 0 if OK, 1 on error.  */
420
421 int
422 build_section_table (struct bfd *some_bfd, struct target_section **start,
423                      struct target_section **end)
424 {
425   unsigned count;
426
427   count = bfd_count_sections (some_bfd);
428   if (*start)
429     xfree (* start);
430   *start = (struct target_section *) xmalloc (count * sizeof (**start));
431   *end = *start;
432   bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
433   if (*end > *start + count)
434     internal_error (__FILE__, __LINE__,
435                     _("failed internal consistency check"));
436   /* We could realloc the table, but it probably loses for most files.  */
437   return 0;
438 }
439
440 /* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
441    current set of target sections.  */
442
443 void
444 add_target_sections (void *key,
445                      struct target_section *sections,
446                      struct target_section *sections_end)
447 {
448   int count;
449   struct target_section_table *table = current_target_sections;
450
451   count = sections_end - sections;
452
453   if (count > 0)
454     {
455       int space = resize_section_table (table, count);
456       int i;
457
458       for (i = 0; i < count; ++i)
459         {
460           table->sections[space + i] = sections[i];
461           table->sections[space + i].key = key;
462         }
463
464       /* If these are the first file sections we can provide memory
465          from, push the file_stratum target.  */
466       if (!using_exec_ops)
467         {
468           using_exec_ops = 1;
469           push_target (&exec_ops);
470         }
471     }
472 }
473
474 /* Remove all target sections taken from ABFD.  */
475
476 void
477 remove_target_sections (void *key, bfd *abfd)
478 {
479   struct target_section *src, *dest;
480   struct target_section_table *table = current_target_sections;
481
482   dest = table->sections;
483   for (src = table->sections; src < table->sections_end; src++)
484     if (src->key != key || src->bfd != abfd)
485       {
486         /* Keep this section.  */
487         if (dest < src)
488           *dest = *src;
489         dest++;
490       }
491
492   /* If we've dropped any sections, resize the section table.  */
493   if (dest < src)
494     {
495       int old_count;
496
497       old_count = resize_section_table (table, dest - src);
498
499       /* If we don't have any more sections to read memory from,
500          remove the file_stratum target from the stack.  */
501       if (old_count + (dest - src) == 0)
502         {
503           struct program_space *pspace;
504
505           ALL_PSPACES (pspace)
506             if (pspace->target_sections.sections
507                 != pspace->target_sections.sections_end)
508               return;
509
510           unpush_target (&exec_ops);
511         }
512     }
513 }
514
515 \f
516 static void
517 bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3)
518 {
519   struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
520   struct vmap *vp;
521
522   vp = vmap_bfd->pvmap;
523
524   if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
525     return;
526
527   if (strcmp (bfd_section_name (abfd, sect), ".text") == 0)
528     {
529       vp->tstart = bfd_section_vma (abfd, sect);
530       vp->tend = vp->tstart + bfd_section_size (abfd, sect);
531       vp->tvma = bfd_section_vma (abfd, sect);
532       vp->toffs = sect->filepos;
533     }
534   else if (strcmp (bfd_section_name (abfd, sect), ".data") == 0)
535     {
536       vp->dstart = bfd_section_vma (abfd, sect);
537       vp->dend = vp->dstart + bfd_section_size (abfd, sect);
538       vp->dvma = bfd_section_vma (abfd, sect);
539     }
540   /* Silently ignore other types of sections.  (FIXME?)  */
541 }
542
543 /* Make a vmap for ABFD which might be a member of the archive ARCH.
544    Return the new vmap.  */
545
546 struct vmap *
547 map_vmap (bfd *abfd, bfd *arch)
548 {
549   struct vmap_and_bfd vmap_bfd;
550   struct vmap *vp, **vpp;
551
552   vp = (struct vmap *) xmalloc (sizeof (*vp));
553   memset ((char *) vp, '\0', sizeof (*vp));
554   vp->nxt = 0;
555   vp->bfd = abfd;
556   gdb_bfd_ref (abfd);
557   vp->name = bfd_get_filename (arch ? arch : abfd);
558   vp->member = arch ? bfd_get_filename (abfd) : "";
559
560   vmap_bfd.pbfd = arch;
561   vmap_bfd.pvmap = vp;
562   bfd_map_over_sections (abfd, bfdsec_to_vmap, &vmap_bfd);
563
564   /* Find the end of the list and append.  */
565   for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt)
566     ;
567   *vpp = vp;
568
569   return vp;
570 }
571 \f
572
573 VEC(mem_range_s) *
574 section_table_available_memory (VEC(mem_range_s) *memory,
575                                 CORE_ADDR memaddr, ULONGEST len,
576                                 struct target_section *sections,
577                                 struct target_section *sections_end)
578 {
579   struct target_section *p;
580
581   for (p = sections; p < sections_end; p++)
582     {
583       if ((bfd_get_section_flags (p->bfd, p->the_bfd_section)
584            & SEC_READONLY) == 0)
585         continue;
586
587       /* Copy the meta-data, adjusted.  */
588       if (mem_ranges_overlap (p->addr, p->endaddr - p->addr, memaddr, len))
589         {
590           ULONGEST lo1, hi1, lo2, hi2;
591           struct mem_range *r;
592
593           lo1 = memaddr;
594           hi1 = memaddr + len;
595
596           lo2 = p->addr;
597           hi2 = p->endaddr;
598
599           r = VEC_safe_push (mem_range_s, memory, NULL);
600
601           r->start = max (lo1, lo2);
602           r->length = min (hi1, hi2) - r->start;
603         }
604     }
605
606   return memory;
607 }
608
609 int
610 section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
611                                    ULONGEST offset, LONGEST len,
612                                    struct target_section *sections,
613                                    struct target_section *sections_end,
614                                    const char *section_name)
615 {
616   int res;
617   struct target_section *p;
618   ULONGEST memaddr = offset;
619   ULONGEST memend = memaddr + len;
620
621   if (len <= 0)
622     internal_error (__FILE__, __LINE__,
623                     _("failed internal consistency check"));
624
625   for (p = sections; p < sections_end; p++)
626     {
627       if (section_name && strcmp (section_name, p->the_bfd_section->name) != 0)
628         continue;               /* not the section we need.  */
629       if (memaddr >= p->addr)
630         {
631           if (memend <= p->endaddr)
632             {
633               /* Entire transfer is within this section.  */
634               if (writebuf)
635                 res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
636                                                 writebuf, memaddr - p->addr,
637                                                 len);
638               else
639                 res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
640                                                 readbuf, memaddr - p->addr,
641                                                 len);
642               return (res != 0) ? len : 0;
643             }
644           else if (memaddr >= p->endaddr)
645             {
646               /* This section ends before the transfer starts.  */
647               continue;
648             }
649           else
650             {
651               /* This section overlaps the transfer.  Just do half.  */
652               len = p->endaddr - memaddr;
653               if (writebuf)
654                 res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
655                                                 writebuf, memaddr - p->addr,
656                                                 len);
657               else
658                 res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
659                                                 readbuf, memaddr - p->addr,
660                                                 len);
661               return (res != 0) ? len : 0;
662             }
663         }
664     }
665
666   return 0;                     /* We can't help.  */
667 }
668
669 static struct target_section_table *
670 exec_get_section_table (struct target_ops *ops)
671 {
672   return current_target_sections;
673 }
674
675 static LONGEST
676 exec_xfer_partial (struct target_ops *ops, enum target_object object,
677                    const char *annex, gdb_byte *readbuf,
678                    const gdb_byte *writebuf,
679                    ULONGEST offset, LONGEST len)
680 {
681   struct target_section_table *table = target_get_section_table (ops);
682
683   if (object == TARGET_OBJECT_MEMORY)
684     return section_table_xfer_memory_partial (readbuf, writebuf,
685                                               offset, len,
686                                               table->sections,
687                                               table->sections_end,
688                                               NULL);
689   else
690     return -1;
691 }
692 \f
693
694 void
695 print_section_info (struct target_section_table *t, bfd *abfd)
696 {
697   struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
698   struct target_section *p;
699   /* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64.  */
700   int wid = gdbarch_addr_bit (gdbarch) <= 32 ? 8 : 16;
701
702   printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
703   wrap_here ("        ");
704   printf_filtered (_("file type %s.\n"), bfd_get_target (abfd));
705   if (abfd == exec_bfd)
706     {
707       /* gcc-3.4 does not like the initialization in
708          <p == t->sections_end>.  */
709       bfd_vma displacement = 0;
710       bfd_vma entry_point;
711
712       for (p = t->sections; p < t->sections_end; p++)
713         {
714           asection *asect = p->the_bfd_section;
715
716           if ((bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD))
717               != (SEC_ALLOC | SEC_LOAD))
718             continue;
719
720           if (bfd_get_section_vma (abfd, asect) <= abfd->start_address
721               && abfd->start_address < (bfd_get_section_vma (abfd, asect)
722                                         + bfd_get_section_size (asect)))
723             {
724               displacement = p->addr - bfd_get_section_vma (abfd, asect);
725               break;
726             }
727         }
728       if (p == t->sections_end)
729         warning (_("Cannot find section for the entry point of %s."),
730                  bfd_get_filename (abfd));
731
732       entry_point = gdbarch_addr_bits_remove (gdbarch, 
733                                               bfd_get_start_address (abfd) 
734                                                 + displacement);
735       printf_filtered (_("\tEntry point: %s\n"),
736                        paddress (gdbarch, entry_point));
737     }
738   for (p = t->sections; p < t->sections_end; p++)
739     {
740       printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
741       printf_filtered (" - %s", hex_string_custom (p->endaddr, wid));
742
743       /* FIXME: A format of "08l" is not wide enough for file offsets
744          larger than 4GB.  OTOH, making it "016l" isn't desirable either
745          since most output will then be much wider than necessary.  It
746          may make sense to test the size of the file and choose the
747          format string accordingly.  */
748       /* FIXME: i18n: Need to rewrite this sentence.  */
749       if (info_verbose)
750         printf_filtered (" @ %s",
751                          hex_string_custom (p->the_bfd_section->filepos, 8));
752       printf_filtered (" is %s", bfd_section_name (p->bfd,
753                                                    p->the_bfd_section));
754       if (p->bfd != abfd)
755         printf_filtered (" in %s", bfd_get_filename (p->bfd));
756       printf_filtered ("\n");
757     }
758 }
759
760 static void
761 exec_files_info (struct target_ops *t)
762 {
763   if (exec_bfd)
764     print_section_info (current_target_sections, exec_bfd);
765   else
766     puts_filtered (_("\t<no file loaded>\n"));
767
768   if (vmap)
769     {
770       int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8;
771       struct vmap *vp;
772
773       printf_unfiltered (_("\tMapping info for file `%s'.\n"), vmap->name);
774       printf_unfiltered ("\t  %*s   %*s   %*s   %*s %8.8s %s\n",
775                          addr_size * 2, "tstart",
776                          addr_size * 2, "tend",
777                          addr_size * 2, "dstart",
778                          addr_size * 2, "dend",
779                          "section",
780                          "file(member)");
781
782       for (vp = vmap; vp; vp = vp->nxt)
783         printf_unfiltered ("\t0x%s 0x%s 0x%s 0x%s %s%s%s%s\n",
784                            phex (vp->tstart, addr_size),
785                            phex (vp->tend, addr_size),
786                            phex (vp->dstart, addr_size),
787                            phex (vp->dend, addr_size),
788                            vp->name,
789                            *vp->member ? "(" : "", vp->member,
790                            *vp->member ? ")" : "");
791     }
792 }
793
794 static void
795 set_section_command (char *args, int from_tty)
796 {
797   struct target_section *p;
798   char *secname;
799   unsigned seclen;
800   unsigned long secaddr;
801   char secprint[100];
802   long offset;
803   struct target_section_table *table;
804
805   if (args == 0)
806     error (_("Must specify section name and its virtual address"));
807
808   /* Parse out section name.  */
809   for (secname = args; !isspace (*args); args++);
810   seclen = args - secname;
811
812   /* Parse out new virtual address.  */
813   secaddr = parse_and_eval_address (args);
814
815   table = current_target_sections;
816   for (p = table->sections; p < table->sections_end; p++)
817     {
818       if (!strncmp (secname, bfd_section_name (p->bfd,
819                                                p->the_bfd_section), seclen)
820           && bfd_section_name (p->bfd, p->the_bfd_section)[seclen] == '\0')
821         {
822           offset = secaddr - p->addr;
823           p->addr += offset;
824           p->endaddr += offset;
825           if (from_tty)
826             exec_files_info (&exec_ops);
827           return;
828         }
829     }
830   if (seclen >= sizeof (secprint))
831     seclen = sizeof (secprint) - 1;
832   strncpy (secprint, secname, seclen);
833   secprint[seclen] = '\0';
834   error (_("Section %s not found"), secprint);
835 }
836
837 /* If we can find a section in FILENAME with BFD index INDEX, adjust
838    it to ADDRESS.  */
839
840 void
841 exec_set_section_address (const char *filename, int index, CORE_ADDR address)
842 {
843   struct target_section *p;
844   struct target_section_table *table;
845
846   table = current_target_sections;
847   for (p = table->sections; p < table->sections_end; p++)
848     {
849       if (filename_cmp (filename, p->bfd->filename) == 0
850           && index == p->the_bfd_section->index)
851         {
852           p->endaddr += address - p->addr;
853           p->addr = address;
854         }
855     }
856 }
857
858 /* If mourn is being called in all the right places, this could be say
859    `gdb internal error' (since generic_mourn calls
860    breakpoint_init_inferior).  */
861
862 static int
863 ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
864 {
865   return 0;
866 }
867
868 static int
869 exec_has_memory (struct target_ops *ops)
870 {
871   /* We can provide memory if we have any file/target sections to read
872      from.  */
873   return (current_target_sections->sections
874           != current_target_sections->sections_end);
875 }
876
877 /* Find mapped memory.  */
878
879 extern void
880 exec_set_find_memory_regions (int (*func) (find_memory_region_ftype, void *))
881 {
882   exec_ops.to_find_memory_regions = func;
883 }
884
885 static char *exec_make_note_section (bfd *, int *);
886
887 /* Fill in the exec file target vector.  Very few entries need to be
888    defined.  */
889
890 static void
891 init_exec_ops (void)
892 {
893   exec_ops.to_shortname = "exec";
894   exec_ops.to_longname = "Local exec file";
895   exec_ops.to_doc = "Use an executable file as a target.\n\
896 Specify the filename of the executable file.";
897   exec_ops.to_open = exec_open;
898   exec_ops.to_close = exec_close_1;
899   exec_ops.to_attach = find_default_attach;
900   exec_ops.to_xfer_partial = exec_xfer_partial;
901   exec_ops.to_get_section_table = exec_get_section_table;
902   exec_ops.to_files_info = exec_files_info;
903   exec_ops.to_insert_breakpoint = ignore;
904   exec_ops.to_remove_breakpoint = ignore;
905   exec_ops.to_create_inferior = find_default_create_inferior;
906   exec_ops.to_stratum = file_stratum;
907   exec_ops.to_has_memory = exec_has_memory;
908   exec_ops.to_make_corefile_notes = exec_make_note_section;
909   exec_ops.to_magic = OPS_MAGIC;
910 }
911
912 void
913 _initialize_exec (void)
914 {
915   struct cmd_list_element *c;
916
917   init_exec_ops ();
918
919   if (!dbx_commands)
920     {
921       c = add_cmd ("file", class_files, file_command, _("\
922 Use FILE as program to be debugged.\n\
923 It is read for its symbols, for getting the contents of pure memory,\n\
924 and it is the program executed when you use the `run' command.\n\
925 If FILE cannot be found as specified, your execution directory path\n\
926 ($PATH) is searched for a command of that name.\n\
927 No arg means to have no executable file and no symbols."), &cmdlist);
928       set_cmd_completer (c, filename_completer);
929     }
930
931   c = add_cmd ("exec-file", class_files, exec_file_command, _("\
932 Use FILE as program for getting contents of pure memory.\n\
933 If FILE cannot be found as specified, your execution directory path\n\
934 is searched for a command of that name.\n\
935 No arg means have no executable file."), &cmdlist);
936   set_cmd_completer (c, filename_completer);
937
938   add_com ("section", class_files, set_section_command, _("\
939 Change the base address of section SECTION of the exec file to ADDR.\n\
940 This can be used if the exec file does not contain section addresses,\n\
941 (such as in the a.out format), or when the addresses specified in the\n\
942 file itself are wrong.  Each section must be changed separately.  The\n\
943 ``info files'' command lists all the sections and their addresses."));
944
945   add_setshow_boolean_cmd ("write", class_support, &write_files, _("\
946 Set writing into executable and core files."), _("\
947 Show writing into executable and core files."), NULL,
948                            NULL,
949                            show_write_files,
950                            &setlist, &showlist);
951
952   add_target (&exec_ops);
953 }
954
955 static char *
956 exec_make_note_section (bfd *obfd, int *note_size)
957 {
958   error (_("Can't create a corefile"));
959 }