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