xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/exec.c (revision 7d62b00eb9ad855ffcd7da46b41e23feb5476fac)
1 /* Work with executable files, for GDB.
2 
3    Copyright (C) 1988-2019 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 "observable.h"
33 #include "arch-utils.h"
34 #include "gdbthread.h"
35 #include "progspace.h"
36 #include "gdb_bfd.h"
37 #include "gcore.h"
38 #include "source.h"
39 
40 #include <fcntl.h>
41 #include "readline/readline.h"
42 #include "gdbcore.h"
43 
44 #include <ctype.h>
45 #include <sys/stat.h>
46 #include "solist.h"
47 #include <algorithm>
48 #include "common/pathstuff.h"
49 
50 void (*deprecated_file_changed_hook) (const char *);
51 
52 static const target_info exec_target_info = {
53   "exec",
54   N_("Local exec file"),
55   N_("Use an executable file as a target.\n\
56 Specify the filename of the executable file.")
57 };
58 
59 /* The target vector for executable files.  */
60 
61 struct exec_target final : public target_ops
62 {
63   const target_info &info () const override
64   { return exec_target_info; }
65 
66   strata stratum () const override { return file_stratum; }
67 
68   void close () override;
69   enum target_xfer_status xfer_partial (enum target_object object,
70 					const char *annex,
71 					gdb_byte *readbuf,
72 					const gdb_byte *writebuf,
73 					ULONGEST offset, ULONGEST len,
74 					ULONGEST *xfered_len) override;
75   struct target_section_table *get_section_table () override;
76   void files_info () override;
77 
78   bool has_memory () override;
79   char *make_corefile_notes (bfd *, int *) override;
80   int find_memory_regions (find_memory_region_ftype func, void *data) override;
81 };
82 
83 static exec_target exec_ops;
84 
85 /* Whether to open exec and core files read-only or read-write.  */
86 
87 int write_files = 0;
88 static void
89 show_write_files (struct ui_file *file, int from_tty,
90 		  struct cmd_list_element *c, const char *value)
91 {
92   fprintf_filtered (file, _("Writing into executable and core files is %s.\n"),
93 		    value);
94 }
95 
96 
97 static void
98 exec_target_open (const char *args, int from_tty)
99 {
100   target_preopen (from_tty);
101   exec_file_attach (args, from_tty);
102 }
103 
104 /* Close and clear exec_bfd.  If we end up with no target sections to
105    read memory from, this unpushes the exec_ops target.  */
106 
107 void
108 exec_close (void)
109 {
110   if (exec_bfd)
111     {
112       bfd *abfd = exec_bfd;
113 
114       gdb_bfd_unref (abfd);
115 
116       /* Removing target sections may close the exec_ops target.
117 	 Clear exec_bfd before doing so to prevent recursion.  */
118       exec_bfd = NULL;
119       exec_bfd_mtime = 0;
120 
121       remove_target_sections (&exec_bfd);
122 
123       xfree (exec_filename);
124       exec_filename = NULL;
125     }
126 }
127 
128 /* This is the target_close implementation.  Clears all target
129    sections and closes all executable bfds from all program spaces.  */
130 
131 void
132 exec_target::close ()
133 {
134   struct program_space *ss;
135   scoped_restore_current_program_space restore_pspace;
136 
137   ALL_PSPACES (ss)
138     {
139       set_current_program_space (ss);
140       clear_section_table (current_target_sections);
141       exec_close ();
142     }
143 }
144 
145 /* See gdbcore.h.  */
146 
147 void
148 try_open_exec_file (const char *exec_file_host, struct inferior *inf,
149 		    symfile_add_flags add_flags)
150 {
151   struct gdb_exception prev_err = exception_none;
152 
153   /* exec_file_attach and symbol_file_add_main may throw an error if the file
154      cannot be opened either locally or remotely.
155 
156      This happens for example, when the file is first found in the local
157      sysroot (above), and then disappears (a TOCTOU race), or when it doesn't
158      exist in the target filesystem, or when the file does exist, but
159      is not readable.
160 
161      Even without a symbol file, the remote-based debugging session should
162      continue normally instead of ending abruptly.  Hence we catch thrown
163      errors/exceptions in the following code.  */
164   std::string saved_message;
165   TRY
166     {
167       /* We must do this step even if exec_file_host is NULL, so that
168 	 exec_file_attach will clear state.  */
169       exec_file_attach (exec_file_host, add_flags & SYMFILE_VERBOSE);
170     }
171   CATCH (err, RETURN_MASK_ERROR)
172     {
173       if (err.message != NULL)
174 	warning ("%s", err.message);
175 
176       prev_err = err;
177 
178       /* Save message so it doesn't get trashed by the catch below.  */
179       if (err.message != NULL)
180 	{
181 	  saved_message = err.message;
182 	  prev_err.message = saved_message.c_str ();
183 	}
184     }
185   END_CATCH
186 
187   if (exec_file_host != NULL)
188     {
189       TRY
190 	{
191 	  symbol_file_add_main (exec_file_host, add_flags);
192 	}
193       CATCH (err, RETURN_MASK_ERROR)
194 	{
195 	  if (!exception_print_same (prev_err, err))
196 	    warning ("%s", err.message);
197 	}
198       END_CATCH
199     }
200 }
201 
202 /* See gdbcore.h.  */
203 
204 void
205 exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
206 {
207   char *exec_file_target;
208   symfile_add_flags add_flags = 0;
209 
210   /* Do nothing if we already have an executable filename.  */
211   if (get_exec_file (0) != NULL)
212     return;
213 
214   /* Try to determine a filename from the process itself.  */
215   exec_file_target = target_pid_to_exec_file (pid);
216   if (exec_file_target == NULL)
217     {
218       warning (_("No executable has been specified and target does not "
219 		 "support\n"
220 		 "determining executable automatically.  "
221 		 "Try using the \"file\" command."));
222       return;
223     }
224 
225   gdb::unique_xmalloc_ptr<char> exec_file_host
226     = exec_file_find (exec_file_target, NULL);
227 
228   if (defer_bp_reset)
229     add_flags |= SYMFILE_DEFER_BP_RESET;
230 
231   if (from_tty)
232     add_flags |= SYMFILE_VERBOSE;
233 
234   /* Attempt to open the exec file.  */
235   try_open_exec_file (exec_file_host.get (), current_inferior (), add_flags);
236 }
237 
238 /* Set FILENAME as the new exec file.
239 
240    This function is intended to be behave essentially the same
241    as exec_file_command, except that the latter will detect when
242    a target is being debugged, and will ask the user whether it
243    should be shut down first.  (If the answer is "no", then the
244    new file is ignored.)
245 
246    This file is used by exec_file_command, to do the work of opening
247    and processing the exec file after any prompting has happened.
248 
249    And, it is used by child_attach, when the attach command was
250    given a pid but not a exec pathname, and the attach command could
251    figure out the pathname from the pid.  (In this case, we shouldn't
252    ask the user whether the current target should be shut down --
253    we're supplying the exec pathname late for good reason.)  */
254 
255 void
256 exec_file_attach (const char *filename, int from_tty)
257 {
258   /* First, acquire a reference to the current exec_bfd.  We release
259      this at the end of the function; but acquiring it now lets the
260      BFD cache return it if this call refers to the same file.  */
261   gdb_bfd_ref_ptr exec_bfd_holder = gdb_bfd_ref_ptr::new_reference (exec_bfd);
262 
263   /* Remove any previous exec file.  */
264   exec_close ();
265 
266   /* Now open and digest the file the user requested, if any.  */
267 
268   if (!filename)
269     {
270       if (from_tty)
271         printf_unfiltered (_("No executable file now.\n"));
272 
273       set_gdbarch_from_file (NULL);
274     }
275   else
276     {
277       int load_via_target = 0;
278       const char *scratch_pathname, *canonical_pathname;
279       int scratch_chan;
280       struct target_section *sections = NULL, *sections_end = NULL;
281       char **matching;
282 
283       if (is_target_filename (filename))
284 	{
285 	  if (target_filesystem_is_local ())
286 	    filename += strlen (TARGET_SYSROOT_PREFIX);
287 	  else
288 	    load_via_target = 1;
289 	}
290 
291       gdb::unique_xmalloc_ptr<char> canonical_storage, scratch_storage;
292       if (load_via_target)
293 	{
294 	  /* gdb_bfd_fopen does not support "target:" filenames.  */
295 	  if (write_files)
296 	    warning (_("writing into executable files is "
297 		       "not supported for %s sysroots"),
298 		     TARGET_SYSROOT_PREFIX);
299 
300 	  scratch_pathname = filename;
301 	  scratch_chan = -1;
302 	  canonical_pathname = scratch_pathname;
303 	}
304       else
305 	{
306 	  scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST,
307 				filename, write_files ?
308 				O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
309 				&scratch_storage);
310 #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
311 	  if (scratch_chan < 0)
312 	    {
313 	      char *exename = (char *) alloca (strlen (filename) + 5);
314 
315 	      strcat (strcpy (exename, filename), ".exe");
316 	      scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST,
317 				    exename, write_files ?
318 				    O_RDWR | O_BINARY
319 				    : O_RDONLY | O_BINARY,
320 				    &scratch_storage);
321 	    }
322 #endif
323 	  if (scratch_chan < 0)
324 	    perror_with_name (filename);
325 
326 	  scratch_pathname = scratch_storage.get ();
327 
328 	  /* gdb_bfd_open (and its variants) prefers canonicalized
329 	     pathname for better BFD caching.  */
330 	  canonical_storage = gdb_realpath (scratch_pathname);
331 	  canonical_pathname = canonical_storage.get ();
332 	}
333 
334       gdb_bfd_ref_ptr temp;
335       if (write_files && !load_via_target)
336 	temp = gdb_bfd_fopen (canonical_pathname, gnutarget,
337 			      FOPEN_RUB, scratch_chan);
338       else
339 	temp = gdb_bfd_open (canonical_pathname, gnutarget, scratch_chan);
340       exec_bfd = temp.release ();
341 
342       if (!exec_bfd)
343 	{
344 	  error (_("\"%s\": could not open as an executable file: %s."),
345 		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
346 	}
347 
348       /* gdb_realpath_keepfile resolves symlinks on the local
349 	 filesystem and so cannot be used for "target:" files.  */
350       gdb_assert (exec_filename == NULL);
351       if (load_via_target)
352 	exec_filename = xstrdup (bfd_get_filename (exec_bfd));
353       else
354 	exec_filename = gdb_realpath_keepfile (scratch_pathname).release ();
355 
356       if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching))
357 	{
358 	  /* Make sure to close exec_bfd, or else "run" might try to use
359 	     it.  */
360 	  exec_close ();
361 	  error (_("\"%s\": not in executable format: %s"),
362 		 scratch_pathname,
363 		 gdb_bfd_errmsg (bfd_get_error (), matching).c_str ());
364 	}
365 
366       if (build_section_table (exec_bfd, &sections, &sections_end))
367 	{
368 	  /* Make sure to close exec_bfd, or else "run" might try to use
369 	     it.  */
370 	  exec_close ();
371 	  error (_("\"%s\": can't find the file sections: %s"),
372 		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
373 	}
374 
375       exec_bfd_mtime = bfd_get_mtime (exec_bfd);
376 
377       validate_files ();
378 
379       set_gdbarch_from_file (exec_bfd);
380 
381       /* Add the executable's sections to the current address spaces'
382 	 list of sections.  This possibly pushes the exec_ops
383 	 target.  */
384       add_target_sections (&exec_bfd, sections, sections_end);
385       xfree (sections);
386 
387       /* Tell display code (if any) about the changed file name.  */
388       if (deprecated_exec_file_display_hook)
389 	(*deprecated_exec_file_display_hook) (filename);
390     }
391 
392   bfd_cache_close_all ();
393   gdb::observers::executable_changed.notify ();
394 }
395 
396 /*  Process the first arg in ARGS as the new exec file.
397 
398    Note that we have to explicitly ignore additional args, since we can
399    be called from file_command(), which also calls symbol_file_command()
400    which can take multiple args.
401 
402    If ARGS is NULL, we just want to close the exec file.  */
403 
404 static void
405 exec_file_command (const char *args, int from_tty)
406 {
407   if (from_tty && target_has_execution
408       && !query (_("A program is being debugged already.\n"
409 		   "Are you sure you want to change the file? ")))
410     error (_("File not changed."));
411 
412   if (args)
413     {
414       /* Scan through the args and pick up the first non option arg
415          as the filename.  */
416 
417       gdb_argv built_argv (args);
418       char **argv = built_argv.get ();
419 
420       for (; (*argv != NULL) && (**argv == '-'); argv++)
421         {;
422         }
423       if (*argv == NULL)
424         error (_("No executable file name was specified"));
425 
426       gdb::unique_xmalloc_ptr<char> filename (tilde_expand (*argv));
427       exec_file_attach (filename.get (), from_tty);
428     }
429   else
430     exec_file_attach (NULL, from_tty);
431 }
432 
433 /* Set both the exec file and the symbol file, in one command.
434    What a novelty.  Why did GDB go through four major releases before this
435    command was added?  */
436 
437 static void
438 file_command (const char *arg, int from_tty)
439 {
440   /* FIXME, if we lose on reading the symbol file, we should revert
441      the exec file, but that's rough.  */
442   exec_file_command (arg, from_tty);
443   symbol_file_command (arg, from_tty);
444   if (deprecated_file_changed_hook)
445     deprecated_file_changed_hook (arg);
446 }
447 
448 
449 /* Locate all mappable sections of a BFD file.
450    table_pp_char is a char * to get it through bfd_map_over_sections;
451    we cast it back to its proper type.  */
452 
453 static void
454 add_to_section_table (bfd *abfd, struct bfd_section *asect,
455 		      void *table_pp_char)
456 {
457   struct target_section **table_pp = (struct target_section **) table_pp_char;
458   flagword aflag;
459 
460   gdb_assert (abfd == asect->owner);
461 
462   /* Check the section flags, but do not discard zero-length sections, since
463      some symbols may still be attached to this section.  For instance, we
464      encountered on sparc-solaris 2.10 a shared library with an empty .bss
465      section to which a symbol named "_end" was attached.  The address
466      of this symbol still needs to be relocated.  */
467   aflag = bfd_get_section_flags (abfd, asect);
468   if (!(aflag & SEC_ALLOC))
469     return;
470 
471   (*table_pp)->owner = NULL;
472   (*table_pp)->the_bfd_section = asect;
473   (*table_pp)->addr = bfd_section_vma (abfd, asect);
474   (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
475   (*table_pp)++;
476 }
477 
478 /* See exec.h.  */
479 
480 void
481 clear_section_table (struct target_section_table *table)
482 {
483   xfree (table->sections);
484   table->sections = table->sections_end = NULL;
485 }
486 
487 /* Resize section table TABLE by ADJUSTMENT.
488    ADJUSTMENT may be negative, in which case the caller must have already
489    removed the sections being deleted.
490    Returns the old size.  */
491 
492 static int
493 resize_section_table (struct target_section_table *table, int adjustment)
494 {
495   int old_count;
496   int new_count;
497 
498   old_count = table->sections_end - table->sections;
499 
500   new_count = adjustment + old_count;
501 
502   if (new_count)
503     {
504       table->sections = XRESIZEVEC (struct target_section, table->sections,
505 				    new_count);
506       table->sections_end = table->sections + new_count;
507     }
508   else
509     clear_section_table (table);
510 
511   return old_count;
512 }
513 
514 /* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
515    Returns 0 if OK, 1 on error.  */
516 
517 int
518 build_section_table (struct bfd *some_bfd, struct target_section **start,
519 		     struct target_section **end)
520 {
521   unsigned count;
522 
523   count = bfd_count_sections (some_bfd);
524   if (*start)
525     xfree (* start);
526   *start = XNEWVEC (struct target_section, count);
527   *end = *start;
528   bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
529   if (*end > *start + count)
530     internal_error (__FILE__, __LINE__,
531 		    _("failed internal consistency check"));
532   /* We could realloc the table, but it probably loses for most files.  */
533   return 0;
534 }
535 
536 /* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
537    current set of target sections.  */
538 
539 void
540 add_target_sections (void *owner,
541 		     struct target_section *sections,
542 		     struct target_section *sections_end)
543 {
544   int count;
545   struct target_section_table *table = current_target_sections;
546 
547   count = sections_end - sections;
548 
549   if (count > 0)
550     {
551       int space = resize_section_table (table, count);
552       int i;
553 
554       for (i = 0; i < count; ++i)
555 	{
556 	  table->sections[space + i] = sections[i];
557 	  table->sections[space + i].owner = owner;
558 	}
559 
560       /* If these are the first file sections we can provide memory
561 	 from, push the file_stratum target.  */
562       if (!target_is_pushed (&exec_ops))
563 	push_target (&exec_ops);
564     }
565 }
566 
567 /* Add the sections of OBJFILE to the current set of target sections.  */
568 
569 void
570 add_target_sections_of_objfile (struct objfile *objfile)
571 {
572   struct target_section_table *table = current_target_sections;
573   struct obj_section *osect;
574   int space;
575   unsigned count = 0;
576   struct target_section *ts;
577 
578   if (objfile == NULL)
579     return;
580 
581   /* Compute the number of sections to add.  */
582   ALL_OBJFILE_OSECTIONS (objfile, osect)
583     {
584       if (bfd_get_section_size (osect->the_bfd_section) == 0)
585 	continue;
586       count++;
587     }
588 
589   if (count == 0)
590     return;
591 
592   space = resize_section_table (table, count);
593 
594   ts = table->sections + space;
595 
596   ALL_OBJFILE_OSECTIONS (objfile, osect)
597     {
598       if (bfd_get_section_size (osect->the_bfd_section) == 0)
599 	continue;
600 
601       gdb_assert (ts < table->sections + space + count);
602 
603       ts->addr = obj_section_addr (osect);
604       ts->endaddr = obj_section_endaddr (osect);
605       ts->the_bfd_section = osect->the_bfd_section;
606       ts->owner = (void *) objfile;
607 
608       ts++;
609     }
610 }
611 
612 /* Remove all target sections owned by OWNER.
613    OWNER must be the same value passed to add_target_sections.  */
614 
615 void
616 remove_target_sections (void *owner)
617 {
618   struct target_section *src, *dest;
619   struct target_section_table *table = current_target_sections;
620 
621   gdb_assert (owner != NULL);
622 
623   dest = table->sections;
624   for (src = table->sections; src < table->sections_end; src++)
625     if (src->owner != owner)
626       {
627 	/* Keep this section.  */
628 	if (dest < src)
629 	  *dest = *src;
630 	dest++;
631       }
632 
633   /* If we've dropped any sections, resize the section table.  */
634   if (dest < src)
635     {
636       int old_count;
637 
638       old_count = resize_section_table (table, dest - src);
639 
640       /* If we don't have any more sections to read memory from,
641 	 remove the file_stratum target from the stack.  */
642       if (old_count + (dest - src) == 0)
643 	{
644 	  struct program_space *pspace;
645 
646 	  ALL_PSPACES (pspace)
647 	    if (pspace->target_sections.sections
648 		!= pspace->target_sections.sections_end)
649 	      return;
650 
651 	  unpush_target (&exec_ops);
652 	}
653     }
654 }
655 
656 
657 
658 enum target_xfer_status
659 exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset,
660 			     ULONGEST len, ULONGEST *xfered_len)
661 {
662   /* It's unduly pedantic to refuse to look at the executable for
663      read-only pieces; so do the equivalent of readonly regions aka
664      QTro packet.  */
665   if (exec_bfd != NULL)
666     {
667       asection *s;
668       bfd_size_type size;
669       bfd_vma vma;
670 
671       for (s = exec_bfd->sections; s; s = s->next)
672 	{
673 	  if ((s->flags & SEC_LOAD) == 0
674 	      || (s->flags & SEC_READONLY) == 0)
675 	    continue;
676 
677 	  vma = s->vma;
678 	  size = bfd_get_section_size (s);
679 	  if (vma <= offset && offset < (vma + size))
680 	    {
681 	      ULONGEST amt;
682 
683 	      amt = (vma + size) - offset;
684 	      if (amt > len)
685 		amt = len;
686 
687 	      amt = bfd_get_section_contents (exec_bfd, s,
688 					      readbuf, offset - vma, amt);
689 
690 	      if (amt == 0)
691 		return TARGET_XFER_EOF;
692 	      else
693 		{
694 		  *xfered_len = amt;
695 		  return TARGET_XFER_OK;
696 		}
697 	    }
698 	}
699     }
700 
701   /* Indicate failure to find the requested memory block.  */
702   return TARGET_XFER_E_IO;
703 }
704 
705 /* Return all read-only memory ranges found in the target section
706    table defined by SECTIONS and SECTIONS_END, starting at (and
707    intersected with) MEMADDR for LEN bytes.  */
708 
709 static std::vector<mem_range>
710 section_table_available_memory (CORE_ADDR memaddr, ULONGEST len,
711 				struct target_section *sections,
712 				struct target_section *sections_end)
713 {
714   std::vector<mem_range> memory;
715 
716   for (target_section *p = sections; p < sections_end; p++)
717     {
718       if ((bfd_get_section_flags (p->the_bfd_section->owner,
719 				  p->the_bfd_section)
720 	   & SEC_READONLY) == 0)
721 	continue;
722 
723       /* Copy the meta-data, adjusted.  */
724       if (mem_ranges_overlap (p->addr, p->endaddr - p->addr, memaddr, len))
725 	{
726 	  ULONGEST lo1, hi1, lo2, hi2;
727 
728 	  lo1 = memaddr;
729 	  hi1 = memaddr + len;
730 
731 	  lo2 = p->addr;
732 	  hi2 = p->endaddr;
733 
734 	  CORE_ADDR start = std::max (lo1, lo2);
735 	  int length = std::min (hi1, hi2) - start;
736 
737 	  memory.emplace_back (start, length);
738 	}
739     }
740 
741   return memory;
742 }
743 
744 enum target_xfer_status
745 section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
746 				     ULONGEST len, ULONGEST *xfered_len)
747 {
748   target_section_table *table = target_get_section_table (&exec_ops);
749   std::vector<mem_range> available_memory
750     = section_table_available_memory (offset, len,
751 				      table->sections, table->sections_end);
752 
753   normalize_mem_ranges (&available_memory);
754 
755   for (const mem_range &r : available_memory)
756     {
757       if (mem_ranges_overlap (r.start, r.length, offset, len))
758 	{
759 	  CORE_ADDR end;
760 	  enum target_xfer_status status;
761 
762 	  /* Get the intersection window.  */
763 	  end = std::min<CORE_ADDR> (offset + len, r.start + r.length);
764 
765 	  gdb_assert (end - offset <= len);
766 
767 	  if (offset >= r.start)
768 	    status = exec_read_partial_read_only (readbuf, offset,
769 						  end - offset,
770 						  xfered_len);
771 	  else
772 	    {
773 	      *xfered_len = r.start - offset;
774 	      status = TARGET_XFER_UNAVAILABLE;
775 	    }
776 	  return status;
777 	}
778     }
779 
780   *xfered_len = len;
781   return TARGET_XFER_UNAVAILABLE;
782 }
783 
784 enum target_xfer_status
785 section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
786 				   ULONGEST offset, ULONGEST len,
787 				   ULONGEST *xfered_len,
788 				   struct target_section *sections,
789 				   struct target_section *sections_end,
790 				   const char *section_name)
791 {
792   int res;
793   struct target_section *p;
794   ULONGEST memaddr = offset;
795   ULONGEST memend = memaddr + len;
796 
797   if (len == 0)
798     internal_error (__FILE__, __LINE__,
799 		    _("failed internal consistency check"));
800 
801   for (p = sections; p < sections_end; p++)
802     {
803       struct bfd_section *asect = p->the_bfd_section;
804       bfd *abfd = asect->owner;
805 
806       if (section_name && strcmp (section_name, asect->name) != 0)
807 	continue;		/* not the section we need.  */
808       if (memaddr >= p->addr)
809         {
810 	  if (memend <= p->endaddr)
811 	    {
812 	      /* Entire transfer is within this section.  */
813 	      if (writebuf)
814 		res = bfd_set_section_contents (abfd, asect,
815 						writebuf, memaddr - p->addr,
816 						len);
817 	      else
818 		res = bfd_get_section_contents (abfd, asect,
819 						readbuf, memaddr - p->addr,
820 						len);
821 
822 	      if (res != 0)
823 		{
824 		  *xfered_len = len;
825 		  return TARGET_XFER_OK;
826 		}
827 	      else
828 		return TARGET_XFER_EOF;
829 	    }
830 	  else if (memaddr >= p->endaddr)
831 	    {
832 	      /* This section ends before the transfer starts.  */
833 	      continue;
834 	    }
835 	  else
836 	    {
837 	      /* This section overlaps the transfer.  Just do half.  */
838 	      len = p->endaddr - memaddr;
839 	      if (writebuf)
840 		res = bfd_set_section_contents (abfd, asect,
841 						writebuf, memaddr - p->addr,
842 						len);
843 	      else
844 		res = bfd_get_section_contents (abfd, asect,
845 						readbuf, memaddr - p->addr,
846 						len);
847 	      if (res != 0)
848 		{
849 		  *xfered_len = len;
850 		  return TARGET_XFER_OK;
851 		}
852 	      else
853 		return TARGET_XFER_EOF;
854 	    }
855         }
856     }
857 
858   return TARGET_XFER_EOF;		/* We can't help.  */
859 }
860 
861 struct target_section_table *
862 exec_target::get_section_table ()
863 {
864   return current_target_sections;
865 }
866 
867 enum target_xfer_status
868 exec_target::xfer_partial (enum target_object object,
869 			   const char *annex, gdb_byte *readbuf,
870 			   const gdb_byte *writebuf,
871 			   ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
872 {
873   struct target_section_table *table = get_section_table ();
874 
875   if (object == TARGET_OBJECT_MEMORY)
876     return section_table_xfer_memory_partial (readbuf, writebuf,
877 					      offset, len, xfered_len,
878 					      table->sections,
879 					      table->sections_end,
880 					      NULL);
881   else
882     return TARGET_XFER_E_IO;
883 }
884 
885 
886 void
887 print_section_info (struct target_section_table *t, bfd *abfd)
888 {
889   struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
890   struct target_section *p;
891   /* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64.  */
892   int wid = gdbarch_addr_bit (gdbarch) <= 32 ? 8 : 16;
893 
894   printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
895   wrap_here ("        ");
896   printf_filtered (_("file type %s.\n"), bfd_get_target (abfd));
897   if (abfd == exec_bfd)
898     {
899       /* gcc-3.4 does not like the initialization in
900 	 <p == t->sections_end>.  */
901       bfd_vma displacement = 0;
902       bfd_vma entry_point;
903 
904       for (p = t->sections; p < t->sections_end; p++)
905 	{
906 	  struct bfd_section *psect = p->the_bfd_section;
907 	  bfd *pbfd = psect->owner;
908 
909 	  if ((bfd_get_section_flags (pbfd, psect) & (SEC_ALLOC | SEC_LOAD))
910 	      != (SEC_ALLOC | SEC_LOAD))
911 	    continue;
912 
913 	  if (bfd_get_section_vma (pbfd, psect) <= abfd->start_address
914 	      && abfd->start_address < (bfd_get_section_vma (pbfd, psect)
915 					+ bfd_get_section_size (psect)))
916 	    {
917 	      displacement = p->addr - bfd_get_section_vma (pbfd, psect);
918 	      break;
919 	    }
920 	}
921       if (p == t->sections_end)
922 	warning (_("Cannot find section for the entry point of %s."),
923 		 bfd_get_filename (abfd));
924 
925       entry_point = gdbarch_addr_bits_remove (gdbarch,
926 					      bfd_get_start_address (abfd)
927 						+ displacement);
928       printf_filtered (_("\tEntry point: %s\n"),
929 		       paddress (gdbarch, entry_point));
930     }
931   for (p = t->sections; p < t->sections_end; p++)
932     {
933       struct bfd_section *psect = p->the_bfd_section;
934       bfd *pbfd = psect->owner;
935 
936       printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
937       printf_filtered (" - %s", hex_string_custom (p->endaddr, wid));
938 
939       /* FIXME: A format of "08l" is not wide enough for file offsets
940 	 larger than 4GB.  OTOH, making it "016l" isn't desirable either
941 	 since most output will then be much wider than necessary.  It
942 	 may make sense to test the size of the file and choose the
943 	 format string accordingly.  */
944       /* FIXME: i18n: Need to rewrite this sentence.  */
945       if (info_verbose)
946 	printf_filtered (" @ %s",
947 			 hex_string_custom (psect->filepos, 8));
948       printf_filtered (" is %s", bfd_section_name (pbfd, psect));
949       if (pbfd != abfd)
950 	printf_filtered (" in %s", bfd_get_filename (pbfd));
951       printf_filtered ("\n");
952     }
953 }
954 
955 void
956 exec_target::files_info ()
957 {
958   if (exec_bfd)
959     print_section_info (current_target_sections, exec_bfd);
960   else
961     puts_filtered (_("\t<no file loaded>\n"));
962 }
963 
964 static void
965 set_section_command (const char *args, int from_tty)
966 {
967   struct target_section *p;
968   const char *secname;
969   unsigned seclen;
970   unsigned long secaddr;
971   char secprint[100];
972   long offset;
973   struct target_section_table *table;
974 
975   if (args == 0)
976     error (_("Must specify section name and its virtual address"));
977 
978   /* Parse out section name.  */
979   for (secname = args; !isspace (*args); args++);
980   seclen = args - secname;
981 
982   /* Parse out new virtual address.  */
983   secaddr = parse_and_eval_address (args);
984 
985   table = current_target_sections;
986   for (p = table->sections; p < table->sections_end; p++)
987     {
988       if (!strncmp (secname, bfd_section_name (p->bfd,
989 					       p->the_bfd_section), seclen)
990 	  && bfd_section_name (p->bfd, p->the_bfd_section)[seclen] == '\0')
991 	{
992 	  offset = secaddr - p->addr;
993 	  p->addr += offset;
994 	  p->endaddr += offset;
995 	  if (from_tty)
996 	    exec_ops.files_info ();
997 	  return;
998 	}
999     }
1000   if (seclen >= sizeof (secprint))
1001     seclen = sizeof (secprint) - 1;
1002   strncpy (secprint, secname, seclen);
1003   secprint[seclen] = '\0';
1004   error (_("Section %s not found"), secprint);
1005 }
1006 
1007 /* If we can find a section in FILENAME with BFD index INDEX, adjust
1008    it to ADDRESS.  */
1009 
1010 void
1011 exec_set_section_address (const char *filename, int index, CORE_ADDR address)
1012 {
1013   struct target_section *p;
1014   struct target_section_table *table;
1015 
1016   table = current_target_sections;
1017   for (p = table->sections; p < table->sections_end; p++)
1018     {
1019       if (filename_cmp (filename, p->the_bfd_section->owner->filename) == 0
1020 	  && index == p->the_bfd_section->index)
1021 	{
1022 	  p->endaddr += address - p->addr;
1023 	  p->addr = address;
1024 	}
1025     }
1026 }
1027 
1028 bool
1029 exec_target::has_memory ()
1030 {
1031   /* We can provide memory if we have any file/target sections to read
1032      from.  */
1033   return (current_target_sections->sections
1034 	  != current_target_sections->sections_end);
1035 }
1036 
1037 char *
1038 exec_target::make_corefile_notes (bfd *obfd, int *note_size)
1039 {
1040   error (_("Can't create a corefile"));
1041 }
1042 
1043 int
1044 exec_target::find_memory_regions (find_memory_region_ftype func, void *data)
1045 {
1046   return objfile_find_memory_regions (this, func, data);
1047 }
1048 
1049 void
1050 _initialize_exec (void)
1051 {
1052   struct cmd_list_element *c;
1053 
1054   if (!dbx_commands)
1055     {
1056       c = add_cmd ("file", class_files, file_command, _("\
1057 Use FILE as program to be debugged.\n\
1058 It is read for its symbols, for getting the contents of pure memory,\n\
1059 and it is the program executed when you use the `run' command.\n\
1060 If FILE cannot be found as specified, your execution directory path\n\
1061 ($PATH) is searched for a command of that name.\n\
1062 No arg means to have no executable file and no symbols."), &cmdlist);
1063       set_cmd_completer (c, filename_completer);
1064     }
1065 
1066   c = add_cmd ("exec-file", class_files, exec_file_command, _("\
1067 Use FILE as program for getting contents of pure memory.\n\
1068 If FILE cannot be found as specified, your execution directory path\n\
1069 is searched for a command of that name.\n\
1070 No arg means have no executable file."), &cmdlist);
1071   set_cmd_completer (c, filename_completer);
1072 
1073   add_com ("section", class_files, set_section_command, _("\
1074 Change the base address of section SECTION of the exec file to ADDR.\n\
1075 This can be used if the exec file does not contain section addresses,\n\
1076 (such as in the a.out format), or when the addresses specified in the\n\
1077 file itself are wrong.  Each section must be changed separately.  The\n\
1078 ``info files'' command lists all the sections and their addresses."));
1079 
1080   add_setshow_boolean_cmd ("write", class_support, &write_files, _("\
1081 Set writing into executable and core files."), _("\
1082 Show writing into executable and core files."), NULL,
1083 			   NULL,
1084 			   show_write_files,
1085 			   &setlist, &showlist);
1086 
1087   add_target (exec_target_info, exec_target_open, filename_completer);
1088 }
1089