ld/testsuite/
[external/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
37 #include <fcntl.h>
38 #include "readline/readline.h"
39 #include "gdb_string.h"
40
41 #include "gdbcore.h"
42
43 #include <ctype.h>
44 #include "gdb_stat.h"
45
46 #include "xcoffsolib.h"
47
48 struct vmap *map_vmap (bfd *, bfd *);
49
50 void (*deprecated_file_changed_hook) (char *);
51
52 /* Prototypes for local functions */
53
54 static void file_command (char *, int);
55
56 static void set_section_command (char *, int);
57
58 static void exec_files_info (struct target_ops *);
59
60 static void init_exec_ops (void);
61
62 void _initialize_exec (void);
63
64 /* The target vector for executable files.  */
65
66 struct target_ops exec_ops;
67
68 /* True if the exec target is pushed on the stack.  */
69 static int using_exec_ops;
70
71 /* Whether to open exec and core files read-only or read-write.  */
72
73 int write_files = 0;
74 static void
75 show_write_files (struct ui_file *file, int from_tty,
76                   struct cmd_list_element *c, const char *value)
77 {
78   fprintf_filtered (file, _("Writing into executable and core files is %s.\n"),
79                     value);
80 }
81
82
83 struct vmap *vmap;
84
85 static void
86 exec_open (char *args, int from_tty)
87 {
88   target_preopen (from_tty);
89   exec_file_attach (args, from_tty);
90 }
91
92 /* Close and clear exec_bfd.  If we end up with no target sections to
93    read memory from, this unpushes the exec_ops target.  */
94
95 void
96 exec_close (void)
97 {
98   if (exec_bfd)
99     {
100       bfd *abfd = exec_bfd;
101       char *name = bfd_get_filename (abfd);
102
103       gdb_bfd_close_or_warn (abfd);
104       xfree (name);
105
106       /* Removing target sections may close the exec_ops target.
107          Clear exec_bfd before doing so to prevent recursion.  */
108       exec_bfd = NULL;
109       exec_bfd_mtime = 0;
110
111       remove_target_sections (abfd);
112     }
113 }
114
115 /* This is the target_close implementation.  Clears all target
116    sections and closes all executable bfds from all program spaces.  */
117
118 static void
119 exec_close_1 (int quitting)
120 {
121   int need_symtab_cleanup = 0;
122   struct vmap *vp, *nxt;
123
124   using_exec_ops = 0;
125
126   for (nxt = vmap; nxt != NULL;)
127     {
128       vp = nxt;
129       nxt = vp->nxt;
130
131       /* if there is an objfile associated with this bfd,
132          free_objfile() will do proper cleanup of objfile *and* bfd.  */
133
134       if (vp->objfile)
135         {
136           free_objfile (vp->objfile);
137           need_symtab_cleanup = 1;
138         }
139       else if (vp->bfd != exec_bfd)
140         /* FIXME-leak: We should be freeing vp->name too, I think.  */
141         gdb_bfd_close_or_warn (vp->bfd);
142
143       xfree (vp);
144     }
145
146   vmap = NULL;
147
148   {
149     struct program_space *ss;
150     struct cleanup *old_chain;
151
152     old_chain = save_current_program_space ();
153     ALL_PSPACES (ss)
154     {
155       set_current_program_space (ss);
156
157       /* Delete all target sections.  */
158       resize_section_table
159         (current_target_sections,
160          -resize_section_table (current_target_sections, 0));
161
162       exec_close ();
163     }
164
165     do_cleanups (old_chain);
166   }
167 }
168
169 void
170 exec_file_clear (int from_tty)
171 {
172   /* Remove exec file.  */
173   exec_close ();
174
175   if (from_tty)
176     printf_unfiltered (_("No executable file now.\n"));
177 }
178
179 /* Set FILENAME as the new exec file.
180
181    This function is intended to be behave essentially the same
182    as exec_file_command, except that the latter will detect when
183    a target is being debugged, and will ask the user whether it
184    should be shut down first.  (If the answer is "no", then the
185    new file is ignored.)
186
187    This file is used by exec_file_command, to do the work of opening
188    and processing the exec file after any prompting has happened.
189
190    And, it is used by child_attach, when the attach command was
191    given a pid but not a exec pathname, and the attach command could
192    figure out the pathname from the pid.  (In this case, we shouldn't
193    ask the user whether the current target should be shut down --
194    we're supplying the exec pathname late for good reason.)  */
195
196 void
197 exec_file_attach (char *filename, int from_tty)
198 {
199   /* Remove any previous exec file.  */
200   exec_close ();
201
202   /* Now open and digest the file the user requested, if any.  */
203
204   if (!filename)
205     {
206       if (from_tty)
207         printf_unfiltered (_("No executable file now.\n"));
208
209       set_gdbarch_from_file (NULL);
210     }
211   else
212     {
213       struct cleanup *cleanups;
214       char *scratch_pathname;
215       int scratch_chan;
216       struct target_section *sections = NULL, *sections_end = NULL;
217       char **matching;
218
219       scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
220                    write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
221                             &scratch_pathname);
222 #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
223       if (scratch_chan < 0)
224         {
225           char *exename = alloca (strlen (filename) + 5);
226
227           strcat (strcpy (exename, filename), ".exe");
228           scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename,
229              write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
230              &scratch_pathname);
231         }
232 #endif
233       if (scratch_chan < 0)
234         perror_with_name (filename);
235       exec_bfd = bfd_fopen (scratch_pathname, gnutarget,
236                             write_files ? FOPEN_RUB : FOPEN_RB,
237                             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       /* At this point, scratch_pathname and exec_bfd->name both point to the
246          same malloc'd string.  However exec_close() will attempt to free it
247          via the exec_bfd->name pointer, so we need to make another copy and
248          leave exec_bfd as the new owner of the original copy.  */
249       scratch_pathname = xstrdup (scratch_pathname);
250       cleanups = make_cleanup (xfree, scratch_pathname);
251
252       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
253         {
254           /* Make sure to close exec_bfd, or else "run" might try to use
255              it.  */
256           exec_close ();
257           error (_("\"%s\": not in executable format: %s"),
258                  scratch_pathname,
259                  gdb_bfd_errmsg (bfd_get_error (), matching));
260         }
261
262       /* FIXME - This should only be run for RS6000, but the ifdef is a poor
263          way to accomplish.  */
264 #ifdef DEPRECATED_IBM6000_TARGET
265       /* Setup initial vmap.  */
266
267       map_vmap (exec_bfd, 0);
268       if (vmap == NULL)
269         {
270           /* Make sure to close exec_bfd, or else "run" might try to use
271              it.  */
272           exec_close ();
273           error (_("\"%s\": can't find the file sections: %s"),
274                  scratch_pathname, bfd_errmsg (bfd_get_error ()));
275         }
276 #endif /* DEPRECATED_IBM6000_TARGET */
277
278       if (build_section_table (exec_bfd, &sections, &sections_end))
279         {
280           /* Make sure to close exec_bfd, or else "run" might try to use
281              it.  */
282           exec_close ();
283           error (_("\"%s\": can't find the file sections: %s"),
284                  scratch_pathname, bfd_errmsg (bfd_get_error ()));
285         }
286
287       exec_bfd_mtime = bfd_get_mtime (exec_bfd);
288
289       validate_files ();
290
291       set_gdbarch_from_file (exec_bfd);
292
293       /* Add the executable's sections to the current address spaces'
294          list of sections.  This possibly pushes the exec_ops
295          target.  */
296       add_target_sections (sections, sections_end);
297       xfree (sections);
298
299       /* Tell display code (if any) about the changed file name.  */
300       if (deprecated_exec_file_display_hook)
301         (*deprecated_exec_file_display_hook) (filename);
302
303       do_cleanups (cleanups);
304     }
305   bfd_cache_close_all ();
306   observer_notify_executable_changed ();
307 }
308
309 /*  Process the first arg in ARGS as the new exec file.
310
311    Note that we have to explicitly ignore additional args, since we can
312    be called from file_command(), which also calls symbol_file_command()
313    which can take multiple args.
314    
315    If ARGS is NULL, we just want to close the exec file.  */
316
317 static void
318 exec_file_command (char *args, int from_tty)
319 {
320   char **argv;
321   char *filename;
322
323   if (from_tty && target_has_execution
324       && !query (_("A program is being debugged already.\n"
325                    "Are you sure you want to change the file? ")))
326     error (_("File not changed."));
327
328   if (args)
329     {
330       struct cleanup *cleanups;
331
332       /* Scan through the args and pick up the first non option arg
333          as the filename.  */
334
335       argv = gdb_buildargv (args);
336       cleanups = make_cleanup_freeargv (argv);
337
338       for (; (*argv != NULL) && (**argv == '-'); argv++)
339         {;
340         }
341       if (*argv == NULL)
342         error (_("No executable file name was specified"));
343
344       filename = tilde_expand (*argv);
345       make_cleanup (xfree, filename);
346       exec_file_attach (filename, from_tty);
347
348       do_cleanups (cleanups);
349     }
350   else
351     exec_file_attach (NULL, from_tty);
352 }
353
354 /* Set both the exec file and the symbol file, in one command.
355    What a novelty.  Why did GDB go through four major releases before this
356    command was added?  */
357
358 static void
359 file_command (char *arg, int from_tty)
360 {
361   /* FIXME, if we lose on reading the symbol file, we should revert
362      the exec file, but that's rough.  */
363   exec_file_command (arg, from_tty);
364   symbol_file_command (arg, from_tty);
365   if (deprecated_file_changed_hook)
366     deprecated_file_changed_hook (arg);
367 }
368 \f
369
370 /* Locate all mappable sections of a BFD file.
371    table_pp_char is a char * to get it through bfd_map_over_sections;
372    we cast it back to its proper type.  */
373
374 static void
375 add_to_section_table (bfd *abfd, struct bfd_section *asect,
376                       void *table_pp_char)
377 {
378   struct target_section **table_pp = (struct target_section **) table_pp_char;
379   flagword aflag;
380
381   /* Check the section flags, but do not discard zero-length sections, since
382      some symbols may still be attached to this section.  For instance, we
383      encountered on sparc-solaris 2.10 a shared library with an empty .bss
384      section to which a symbol named "_end" was attached.  The address
385      of this symbol still needs to be relocated.  */
386   aflag = bfd_get_section_flags (abfd, asect);
387   if (!(aflag & SEC_ALLOC))
388     return;
389
390   (*table_pp)->bfd = abfd;
391   (*table_pp)->the_bfd_section = asect;
392   (*table_pp)->addr = bfd_section_vma (abfd, asect);
393   (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
394   (*table_pp)++;
395 }
396
397 int
398 resize_section_table (struct target_section_table *table, int num_added)
399 {
400   struct target_section *old_value;
401   int old_count;
402   int new_count;
403
404   old_value = table->sections;
405   old_count = table->sections_end - table->sections;
406
407   new_count = num_added + old_count;
408
409   if (new_count)
410     {
411       table->sections = xrealloc (table->sections,
412                                   sizeof (struct target_section) * new_count);
413       table->sections_end = table->sections + new_count;
414     }
415   else
416     {
417       xfree (table->sections);
418       table->sections = table->sections_end = NULL;
419     }
420
421   return old_count;
422 }
423
424 /* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
425    Returns 0 if OK, 1 on error.  */
426
427 int
428 build_section_table (struct bfd *some_bfd, struct target_section **start,
429                      struct target_section **end)
430 {
431   unsigned count;
432
433   count = bfd_count_sections (some_bfd);
434   if (*start)
435     xfree (* start);
436   *start = (struct target_section *) xmalloc (count * sizeof (**start));
437   *end = *start;
438   bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
439   if (*end > *start + count)
440     internal_error (__FILE__, __LINE__,
441                     _("failed internal consistency check"));
442   /* We could realloc the table, but it probably loses for most files.  */
443   return 0;
444 }
445
446 /* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
447    current set of target sections.  */
448
449 void
450 add_target_sections (struct target_section *sections,
451                      struct target_section *sections_end)
452 {
453   int count;
454   struct target_section_table *table = current_target_sections;
455
456   count = sections_end - sections;
457
458   if (count > 0)
459     {
460       int space = resize_section_table (table, count);
461
462       memcpy (table->sections + space,
463               sections, count * sizeof (sections[0]));
464
465       /* If these are the first file sections we can provide memory
466          from, push the file_stratum target.  */
467       if (!using_exec_ops)
468         {
469           using_exec_ops = 1;
470           push_target (&exec_ops);
471         }
472     }
473 }
474
475 /* Remove all target sections taken from ABFD.  */
476
477 void
478 remove_target_sections (bfd *abfd)
479 {
480   struct target_section *src, *dest;
481   struct target_section_table *table = current_target_sections;
482
483   dest = table->sections;
484   for (src = table->sections; src < table->sections_end; src++)
485     if (src->bfd != abfd)
486       {
487         /* Keep this section.  */
488         if (dest < src)
489           *dest = *src;
490         dest++;
491       }
492
493   /* If we've dropped any sections, resize the section table.  */
494   if (dest < src)
495     {
496       int old_count;
497
498       old_count = resize_section_table (table, dest - src);
499
500       /* If we don't have any more sections to read memory from,
501          remove the file_stratum target from the stack.  */
502       if (old_count + (dest - src) == 0)
503         {
504           struct program_space *pspace;
505
506           ALL_PSPACES (pspace)
507             if (pspace->target_sections.sections
508                 != pspace->target_sections.sections_end)
509               return;
510
511           unpush_target (&exec_ops);
512         }
513     }
514 }
515
516 \f
517 static void
518 bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3)
519 {
520   struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
521   struct vmap *vp;
522
523   vp = vmap_bfd->pvmap;
524
525   if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
526     return;
527
528   if (strcmp (bfd_section_name (abfd, sect), ".text") == 0)
529     {
530       vp->tstart = bfd_section_vma (abfd, sect);
531       vp->tend = vp->tstart + bfd_section_size (abfd, sect);
532       vp->tvma = bfd_section_vma (abfd, sect);
533       vp->toffs = sect->filepos;
534     }
535   else if (strcmp (bfd_section_name (abfd, sect), ".data") == 0)
536     {
537       vp->dstart = bfd_section_vma (abfd, sect);
538       vp->dend = vp->dstart + bfd_section_size (abfd, sect);
539       vp->dvma = bfd_section_vma (abfd, sect);
540     }
541   /* Silently ignore other types of sections.  (FIXME?)  */
542 }
543
544 /* Make a vmap for ABFD which might be a member of the archive ARCH.
545    Return the new vmap.  */
546
547 struct vmap *
548 map_vmap (bfd *abfd, bfd *arch)
549 {
550   struct vmap_and_bfd vmap_bfd;
551   struct vmap *vp, **vpp;
552
553   vp = (struct vmap *) xmalloc (sizeof (*vp));
554   memset ((char *) vp, '\0', sizeof (*vp));
555   vp->nxt = 0;
556   vp->bfd = 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 }