Add translations for various sub-directories
[binutils-gdb.git] / gdb / solib.c
blob4a04f1ddb1fb6800436fba2cd2f1c09e0d31bfc3
1 /* Handle shared libraries for GDB, the GNU Debugger.
3 Copyright (C) 1990-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include <fcntl.h>
22 #include "exceptions.h"
23 #include "extract-store-integer.h"
24 #include "symtab.h"
25 #include "bfd.h"
26 #include "build-id.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29 #include "gdbcore.h"
30 #include "command.h"
31 #include "target.h"
32 #include "frame.h"
33 #include "inferior.h"
34 #include "gdbsupport/environ.h"
35 #include "cli/cli-cmds.h"
36 #include "elf/external.h"
37 #include "elf/common.h"
38 #include "filenames.h"
39 #include "exec.h"
40 #include "solist.h"
41 #include "observable.h"
42 #include "readline/tilde.h"
43 #include "solib.h"
44 #include "interps.h"
45 #include "filesystem.h"
46 #include "gdb_bfd.h"
47 #include "gdbsupport/filestuff.h"
48 #include "gdbsupport/scoped_fd.h"
49 #include "source.h"
50 #include "cli/cli-style.h"
52 /* See solib.h. */
54 bool debug_solib;
56 /* If non-empty, this is a search path for loading non-absolute shared library
57 symbol files. This takes precedence over the environment variables PATH
58 and LD_LIBRARY_PATH. */
59 static std::string solib_search_path;
61 static void
62 show_solib_search_path (struct ui_file *file, int from_tty,
63 struct cmd_list_element *c, const char *value)
65 gdb_printf (file,
66 _ ("The search path for loading non-absolute "
67 "shared library symbol files is %s.\n"),
68 value);
71 /* Same as HAVE_DOS_BASED_FILE_SYSTEM, but useable as an rvalue. */
72 #if (HAVE_DOS_BASED_FILE_SYSTEM)
73 #define DOS_BASED_FILE_SYSTEM 1
74 #else
75 #define DOS_BASED_FILE_SYSTEM 0
76 #endif
78 /* Return the full pathname of a binary file (the main executable or a
79 shared library file), or NULL if not found. If FD is non-NULL, *FD
80 is set to either -1 or an open file handle for the binary file.
82 Global variable GDB_SYSROOT is used as a prefix directory
83 to search for binary files if they have an absolute path.
84 If GDB_SYSROOT starts with "target:" and target filesystem
85 is the local filesystem then the "target:" prefix will be
86 stripped before the search starts. This ensures that the
87 same search algorithm is used for local files regardless of
88 whether a "target:" prefix was used.
90 Global variable SOLIB_SEARCH_PATH is used as a prefix directory
91 (or set of directories, as in LD_LIBRARY_PATH) to search for all
92 shared libraries if not found in either the sysroot (if set) or
93 the local filesystem. SOLIB_SEARCH_PATH is not used when searching
94 for the main executable.
96 Search algorithm:
97 * If a sysroot is set and path is absolute:
98 * Search for sysroot/path.
99 * else
100 * Look for it literally (unmodified).
101 * If IS_SOLIB is non-zero:
102 * Look in SOLIB_SEARCH_PATH.
103 * If available, use target defined search function.
104 * If NO sysroot is set, perform the following two searches:
105 * Look in inferior's $PATH.
106 * If IS_SOLIB is non-zero:
107 * Look in inferior's $LD_LIBRARY_PATH.
109 * The last check avoids doing this search when targeting remote
110 * machines since a sysroot will almost always be set.
113 static gdb::unique_xmalloc_ptr<char>
114 solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
116 int found_file = -1;
117 gdb::unique_xmalloc_ptr<char> temp_pathname;
118 const char *fskind = effective_target_file_system_kind ();
119 const char *sysroot = gdb_sysroot.c_str ();
120 int prefix_len, orig_prefix_len;
122 /* If the absolute prefix starts with "target:" but the filesystem
123 accessed by the target_fileio_* methods is the local filesystem
124 then we strip the "target:" prefix now and work with the local
125 filesystem. This ensures that the same search algorithm is used
126 for all local files regardless of whether a "target:" prefix was
127 used. */
128 if (is_target_filename (sysroot) && target_filesystem_is_local ())
129 sysroot += strlen (TARGET_SYSROOT_PREFIX);
131 /* Strip any trailing slashes from the absolute prefix. */
132 prefix_len = orig_prefix_len = strlen (sysroot);
134 while (prefix_len > 0 && IS_DIR_SEPARATOR (sysroot[prefix_len - 1]))
135 prefix_len--;
137 std::string sysroot_holder;
138 if (prefix_len == 0)
139 sysroot = NULL;
140 else if (prefix_len != orig_prefix_len)
142 sysroot_holder = std::string (sysroot, prefix_len);
143 sysroot = sysroot_holder.c_str ();
146 /* If we're on a non-DOS-based system, backslashes won't be
147 understood as directory separator, so, convert them to forward
148 slashes, iff we're supposed to handle DOS-based file system
149 semantics for target paths. */
150 if (!DOS_BASED_FILE_SYSTEM && fskind == file_system_kind_dos_based)
152 char *p;
154 /* Avoid clobbering our input. */
155 p = (char *) alloca (strlen (in_pathname) + 1);
156 strcpy (p, in_pathname);
157 in_pathname = p;
159 for (; *p; p++)
161 if (*p == '\\')
162 *p = '/';
166 /* Note, we're interested in IS_TARGET_ABSOLUTE_PATH, not
167 IS_ABSOLUTE_PATH. The latter is for host paths only, while
168 IN_PATHNAME is a target path. For example, if we're supposed to
169 be handling DOS-like semantics we want to consider a
170 'c:/foo/bar.dll' path as an absolute path, even on a Unix box.
171 With such a path, before giving up on the sysroot, we'll try:
173 1st attempt, c:/foo/bar.dll ==> /sysroot/c:/foo/bar.dll
174 2nd attempt, c:/foo/bar.dll ==> /sysroot/c/foo/bar.dll
175 3rd attempt, c:/foo/bar.dll ==> /sysroot/foo/bar.dll
178 if (!IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname) || sysroot == NULL)
179 temp_pathname.reset (xstrdup (in_pathname));
180 else
182 bool need_dir_separator;
184 /* Concatenate the sysroot and the target reported filename. We
185 may need to glue them with a directory separator. Cases to
186 consider:
188 | sysroot | separator | in_pathname |
189 |-----------------+-----------+----------------|
190 | /some/dir | / | c:/foo/bar.dll |
191 | /some/dir | | /foo/bar.dll |
192 | target: | | c:/foo/bar.dll |
193 | target: | | /foo/bar.dll |
194 | target:some/dir | / | c:/foo/bar.dll |
195 | target:some/dir | | /foo/bar.dll |
197 IOW, we don't need to add a separator if IN_PATHNAME already
198 has one, or when the sysroot is exactly "target:".
199 There's no need to check for drive spec explicitly, as we only
200 get here if IN_PATHNAME is considered an absolute path. */
201 need_dir_separator = !(IS_DIR_SEPARATOR (in_pathname[0])
202 || strcmp (TARGET_SYSROOT_PREFIX, sysroot) == 0);
204 /* Cat the prefixed pathname together. */
205 temp_pathname.reset (concat (sysroot,
206 need_dir_separator ? SLASH_STRING : "",
207 in_pathname, (char *) NULL));
210 /* Handle files to be accessed via the target. */
211 if (is_target_filename (temp_pathname.get ()))
213 if (fd != NULL)
214 *fd = -1;
215 return temp_pathname;
218 /* Now see if we can open it. */
219 found_file = gdb_open_cloexec (temp_pathname.get (), O_RDONLY | O_BINARY, 0)
220 .release ();
222 /* If the search in gdb_sysroot failed, and the path name has a
223 drive spec (e.g, c:/foo), try stripping ':' from the drive spec,
224 and retrying in the sysroot:
225 c:/foo/bar.dll ==> /sysroot/c/foo/bar.dll. */
227 if (found_file < 0 && sysroot != NULL
228 && HAS_TARGET_DRIVE_SPEC (fskind, in_pathname))
230 bool need_dir_separator = !IS_DIR_SEPARATOR (in_pathname[2]);
231 char drive[2] = { in_pathname[0], '\0' };
233 temp_pathname.reset (concat (sysroot, SLASH_STRING, drive,
234 need_dir_separator ? SLASH_STRING : "",
235 in_pathname + 2, (char *) NULL));
237 found_file
238 = gdb_open_cloexec (temp_pathname.get (), O_RDONLY | O_BINARY, 0)
239 .release ();
240 if (found_file < 0)
242 /* If the search in gdb_sysroot still failed, try fully
243 stripping the drive spec, and trying once more in the
244 sysroot before giving up.
246 c:/foo/bar.dll ==> /sysroot/foo/bar.dll. */
248 temp_pathname.reset (concat (sysroot,
249 need_dir_separator ? SLASH_STRING : "",
250 in_pathname + 2, (char *) NULL));
252 found_file
253 = gdb_open_cloexec (temp_pathname.get (), O_RDONLY | O_BINARY, 0)
254 .release ();
258 /* We try to find the library in various ways. After each attempt,
259 either found_file >= 0 and temp_pathname is a malloc'd string, or
260 found_file < 0 and temp_pathname does not point to storage that
261 needs to be freed. */
263 if (found_file < 0)
264 temp_pathname.reset (NULL);
266 /* If the search in gdb_sysroot failed, and the path name is
267 absolute at this point, make it relative. (openp will try and open the
268 file according to its absolute path otherwise, which is not what we want.)
269 Affects subsequent searches for this solib. */
270 if (found_file < 0 && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
272 /* First, get rid of any drive letters etc. */
273 while (!IS_TARGET_DIR_SEPARATOR (fskind, *in_pathname))
274 in_pathname++;
276 /* Next, get rid of all leading dir separators. */
277 while (IS_TARGET_DIR_SEPARATOR (fskind, *in_pathname))
278 in_pathname++;
281 /* If not found, and we're looking for a solib, search the
282 solib_search_path (if any). */
283 if (is_solib && found_file < 0 && !solib_search_path.empty ())
284 found_file = openp (solib_search_path.c_str (),
285 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
286 O_RDONLY | O_BINARY, &temp_pathname);
288 /* If not found, and we're looking for a solib, next search the
289 solib_search_path (if any) for the basename only (ignoring the
290 path). This is to allow reading solibs from a path that differs
291 from the opened path. */
292 if (is_solib && found_file < 0 && !solib_search_path.empty ())
293 found_file = openp (solib_search_path.c_str (),
294 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
295 target_lbasename (fskind, in_pathname),
296 O_RDONLY | O_BINARY, &temp_pathname);
298 /* If not found, next search the inferior's $PATH environment variable. */
299 if (found_file < 0 && sysroot == NULL)
300 found_file = openp (current_inferior ()->environment.get ("PATH"),
301 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
302 O_RDONLY | O_BINARY, &temp_pathname);
304 /* If not found, and we're looking for a solib, next search the
305 inferior's $LD_LIBRARY_PATH environment variable. */
306 if (is_solib && found_file < 0 && sysroot == NULL)
307 found_file
308 = openp (current_inferior ()->environment.get ("LD_LIBRARY_PATH"),
309 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
310 O_RDONLY | O_BINARY, &temp_pathname);
312 if (fd == NULL)
314 if (found_file >= 0)
315 close (found_file);
317 else
318 *fd = found_file;
320 return temp_pathname;
323 /* Return the full pathname of the main executable, or NULL if not
324 found. If FD is non-NULL, *FD is set to either -1 or an open file
325 handle for the main executable. */
327 gdb::unique_xmalloc_ptr<char>
328 exec_file_find (const char *in_pathname, int *fd)
330 gdb::unique_xmalloc_ptr<char> result;
331 const char *fskind = effective_target_file_system_kind ();
333 if (in_pathname == NULL)
334 return NULL;
336 if (!gdb_sysroot.empty () && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
338 result = solib_find_1 (in_pathname, fd, false);
340 if (result == NULL && fskind == file_system_kind_dos_based)
342 char *new_pathname;
344 new_pathname = (char *) alloca (strlen (in_pathname) + 5);
345 strcpy (new_pathname, in_pathname);
346 strcat (new_pathname, ".exe");
348 result = solib_find_1 (new_pathname, fd, false);
351 else
353 /* It's possible we don't have a full path, but rather just a
354 filename. Some targets, such as HP-UX, don't provide the
355 full path, sigh.
357 Attempt to qualify the filename against the source path.
358 (If that fails, we'll just fall back on the original
359 filename. Not much more we can do...) */
361 if (!source_full_path_of (in_pathname, &result))
362 result.reset (xstrdup (in_pathname));
363 if (fd != NULL)
364 *fd = -1;
367 return result;
370 /* Return the full pathname of a shared library file, or NULL if not
371 found. If FD is non-NULL, *FD is set to either -1 or an open file
372 handle for the shared library.
374 The search algorithm used is described in solib_find_1's comment
375 above. */
377 gdb::unique_xmalloc_ptr<char>
378 solib_find (const char *in_pathname, int *fd)
380 const char *solib_symbols_extension
381 = gdbarch_solib_symbols_extension (current_inferior ()->arch ());
383 /* If solib_symbols_extension is set, replace the file's
384 extension. */
385 if (solib_symbols_extension != NULL)
387 const char *p = in_pathname + strlen (in_pathname);
389 while (p > in_pathname && *p != '.')
390 p--;
392 if (*p == '.')
394 char *new_pathname;
396 new_pathname
397 = (char *) alloca (p - in_pathname + 1
398 + strlen (solib_symbols_extension) + 1);
399 memcpy (new_pathname, in_pathname, p - in_pathname + 1);
400 strcpy (new_pathname + (p - in_pathname) + 1,
401 solib_symbols_extension);
403 in_pathname = new_pathname;
407 return solib_find_1 (in_pathname, fd, true);
410 /* Open and return a BFD for the shared library PATHNAME. If FD is not -1,
411 it is used as file handle to open the file. Throws an error if the file
412 could not be opened. Handles both local and remote file access.
414 If unsuccessful, the FD will be closed (unless FD was -1). */
416 gdb_bfd_ref_ptr
417 solib_bfd_fopen (const char *pathname, int fd)
419 gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd));
421 if (abfd == NULL)
423 /* Arrange to free PATHNAME when the error is thrown. */
424 error (_ ("Could not open `%s' as an executable file: %s"), pathname,
425 bfd_errmsg (bfd_get_error ()));
428 return abfd;
431 /* Find shared library PATHNAME and open a BFD for it. */
433 gdb_bfd_ref_ptr
434 solib_bfd_open (const char *pathname)
436 int found_file;
437 const struct bfd_arch_info *b;
439 /* Search for shared library file. */
440 gdb::unique_xmalloc_ptr<char> found_pathname
441 = solib_find (pathname, &found_file);
442 if (found_pathname == NULL)
444 /* Return failure if the file could not be found, so that we can
445 accumulate messages about missing libraries. */
446 if (errno == ENOENT)
447 return NULL;
449 perror_with_name (pathname);
452 /* Open bfd for shared library. */
453 gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname.get (), found_file));
455 /* Check bfd format. */
456 if (!bfd_check_format (abfd.get (), bfd_object))
457 error (_ ("`%s': not in executable format: %s"),
458 bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
460 /* Check bfd arch. */
461 b = gdbarch_bfd_arch_info (current_inferior ()->arch ());
462 if (!b->compatible (b, bfd_get_arch_info (abfd.get ())))
463 error (_ ("`%s': Shared library architecture %s is not compatible "
464 "with target architecture %s."),
465 bfd_get_filename (abfd.get ()),
466 bfd_get_arch_info (abfd.get ())->printable_name, b->printable_name);
468 return abfd;
471 /* Given a pointer to one of the shared objects in our list of mapped
472 objects, use the recorded name to open a bfd descriptor for the
473 object, build a section table, relocate all the section addresses
474 by the base address at which the shared object was mapped, and then
475 add the sections to the target's section table.
477 FIXME: In most (all?) cases the shared object file name recorded in
478 the dynamic linkage tables will be a fully qualified pathname. For
479 cases where it isn't, do we really mimic the systems search
480 mechanism correctly in the below code (particularly the tilde
481 expansion stuff?). */
483 static int
484 solib_map_sections (solib &so)
486 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
488 gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so.so_name.c_str ()));
489 gdb_bfd_ref_ptr abfd (ops->bfd_open (filename.get ()));
491 /* If we have a core target then the core target might have some helpful
492 information (i.e. build-ids) about the shared libraries we are trying
493 to load. Grab those hints now and use the below to validate or find
494 the shared libraries.
496 If we don't have a core target then this will return an empty struct
497 with no hint information, we then lookup the shared library based on
498 its filename. */
499 std::optional<CORE_ADDR> solib_addr = ops->find_solib_addr (so);
500 std::optional <const core_target_mapped_file_info> mapped_file_info
501 = core_target_find_mapped_file (so.so_name.c_str (), solib_addr);
503 /* If we already know the build-id of this solib from a core file, verify
504 it matches ABFD's build-id. If there is a mismatch or the solib wasn't
505 found, attempt to query debuginfod for the correct solib. */
506 if (mapped_file_info.has_value ())
508 bool mismatch = (abfd != nullptr
509 && build_id_bfd_get (abfd.get ()) != nullptr
510 && !build_id_equal (mapped_file_info->build_id (),
511 build_id_bfd_get (abfd.get ())));
513 if (abfd == nullptr || mismatch)
515 /* If GDB found a suitable file during the file mapping
516 processing stage then lets use that. We don't check the
517 build-id after opening this file, either this file was found
518 by build-id, in which case it's going to match, or this file
519 doesn't have a build-id, so checking tells us nothing.
520 However, if it was good enough during the mapped file
521 processing, we assume it's good enough now. */
522 if (!mapped_file_info->filename ().empty ())
523 abfd = ops->bfd_open (mapped_file_info->filename ().c_str ());
524 else
525 abfd = nullptr;
527 if (abfd == nullptr)
528 abfd = find_objfile_by_build_id (current_program_space,
529 mapped_file_info->build_id (),
530 so.so_name.c_str ());
532 if (abfd == nullptr && mismatch)
534 warning (_ ("Build-id of %ps does not match core file."),
535 styled_string (file_name_style.style (),
536 filename.get ()));
537 abfd = nullptr;
542 if (abfd == NULL)
543 return 0;
545 /* Leave bfd open, core_xfer_memory and "info files" need it. */
546 so.abfd = std::move (abfd);
548 /* Copy the full path name into so_name, allowing symbol_file_add
549 to find it later. This also affects the =library-loaded GDB/MI
550 event, and in particular the part of that notification providing
551 the library's host-side path. If we let the target dictate
552 that objfile's path, and the target is different from the host,
553 GDB/MI will not provide the correct host-side path. */
555 so.so_name = bfd_get_filename (so.abfd.get ());
556 so.sections = build_section_table (so.abfd.get ());
558 for (target_section &p : so.sections)
560 /* Relocate the section binding addresses as recorded in the shared
561 object's file by the base address to which the object was actually
562 mapped. */
563 ops->relocate_section_addresses (so, &p);
565 /* If the target didn't provide information about the address
566 range of the shared object, assume we want the location of
567 the .text section. */
568 if (so.addr_low == 0 && so.addr_high == 0
569 && strcmp (p.the_bfd_section->name, ".text") == 0)
571 so.addr_low = p.addr;
572 so.addr_high = p.endaddr;
576 /* Add the shared object's sections to the current set of file
577 section tables. Do this immediately after mapping the object so
578 that later nodes in the list can query this object, as is needed
579 in solib-osf.c. */
580 current_program_space->add_target_sections (&so, so.sections);
582 return 1;
585 /* See solist.h. */
587 void
588 solib::clear ()
590 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
592 this->sections.clear ();
593 this->abfd = nullptr;
595 /* Our caller closed the objfile, possibly via objfile_purge_solibs. */
596 this->symbols_loaded = false;
597 this->objfile = nullptr;
599 this->addr_low = this->addr_high = 0;
601 /* Restore the target-supplied file name. SO_NAME may be the path
602 of the symbol file. */
603 this->so_name = this->so_original_name;
605 /* Do the same for target-specific data. */
606 if (ops->clear_so != NULL)
607 ops->clear_so (*this);
610 lm_info::~lm_info () = default;
612 /* Read in symbols for shared object SO. If SYMFILE_VERBOSE is set in FLAGS,
613 be chatty about it. Return true if any symbols were actually loaded. */
615 bool
616 solib_read_symbols (solib &so, symfile_add_flags flags)
618 if (so.symbols_loaded)
620 /* If needed, we've already warned in our caller. */
622 else if (so.abfd == NULL)
624 /* We've already warned about this library, when trying to open
625 it. */
627 else
629 flags |= current_inferior ()->symfile_flags;
633 /* Have we already loaded this shared object? */
634 so.objfile = nullptr;
635 for (objfile *objfile : current_program_space->objfiles ())
637 if (filename_cmp (objfile_name (objfile), so.so_name.c_str ())
638 == 0
639 && objfile->addr_low == so.addr_low)
641 so.objfile = objfile;
642 break;
645 if (so.objfile == NULL)
647 section_addr_info sap
648 = build_section_addr_info_from_section_table (so.sections);
649 gdb_bfd_ref_ptr tmp_bfd = so.abfd;
650 so.objfile
651 = symbol_file_add_from_bfd (tmp_bfd, so.so_name.c_str (),
652 flags, &sap, OBJF_SHARED, nullptr);
653 so.objfile->addr_low = so.addr_low;
656 so.symbols_loaded = true;
658 catch (const gdb_exception_error &e)
660 exception_fprintf (gdb_stderr, e,
661 _ ("Error while reading shared"
662 " library symbols for %s:\n"),
663 so.so_name.c_str ());
666 return true;
669 return false;
672 /* Return true if KNOWN->objfile is used by any other solib object
673 in PSPACE's list of shared libraries. Return false otherwise. */
675 static bool
676 solib_used (program_space *pspace, const solib &known)
678 for (const solib &pivot : pspace->solibs ())
679 if (&pivot != &known && pivot.objfile == known.objfile)
680 return true;
682 return false;
685 /* Notify interpreters and observers that solib SO has been loaded. */
687 static void
688 notify_solib_loaded (solib &so)
690 interps_notify_solib_loaded (so);
691 gdb::observers::solib_loaded.notify (so);
694 /* Notify interpreters and observers that solib SO has been unloaded. */
696 static void
697 notify_solib_unloaded (program_space *pspace, const solib &so)
699 interps_notify_solib_unloaded (so);
700 gdb::observers::solib_unloaded.notify (pspace, so);
703 /* See solib.h. */
705 void
706 update_solib_list (int from_tty)
708 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
710 /* We can reach here due to changing solib-search-path or the
711 sysroot, before having any inferior. */
712 if (target_has_execution () && inferior_ptid != null_ptid)
714 struct inferior *inf = current_inferior ();
716 /* If we are attaching to a running process for which we
717 have not opened a symbol file, we may be able to get its
718 symbols now! */
719 if (inf->attach_flag
720 && current_program_space->symfile_object_file == NULL)
724 ops->open_symbol_file_object (from_tty);
726 catch (const gdb_exception_error &ex)
728 exception_fprintf (gdb_stderr, ex,
729 "Error reading attached "
730 "process's symbol file.\n");
735 /* GDB and the inferior's dynamic linker each maintain their own
736 list of currently loaded shared objects; we want to bring the
737 former in sync with the latter. Scan both lists, seeing which
738 shared objects appear where. There are three cases:
740 - A shared object appears on both lists. This means that GDB
741 knows about it already, and it's still loaded in the inferior.
742 Nothing needs to happen.
744 - A shared object appears only on GDB's list. This means that
745 the inferior has unloaded it. We should remove the shared
746 object from GDB's tables.
748 - A shared object appears only on the inferior's list. This
749 means that it's just been loaded. We should add it to GDB's
750 tables.
752 So we walk GDB's list, checking each entry to see if it appears
753 in the inferior's list too. If it does, no action is needed, and
754 we remove it from the inferior's list. If it doesn't, the
755 inferior has unloaded it, and we remove it from GDB's list. By
756 the time we're done walking GDB's list, the inferior's list
757 contains only the new shared objects, which we then add. */
759 owning_intrusive_list<solib> inferior = ops->current_sos ();
760 owning_intrusive_list<solib>::iterator gdb_iter
761 = current_program_space->so_list.begin ();
762 while (gdb_iter != current_program_space->so_list.end ())
764 intrusive_list<solib>::iterator inferior_iter = inferior.begin ();
766 /* Check to see whether the shared object *gdb also appears in
767 the inferior's current list. */
768 for (; inferior_iter != inferior.end (); ++inferior_iter)
770 if (ops->same)
772 if (ops->same (*gdb_iter, *inferior_iter))
773 break;
775 else
777 if (!filename_cmp (gdb_iter->so_original_name.c_str (),
778 inferior_iter->so_original_name.c_str ()))
779 break;
783 /* If the shared object appears on the inferior's list too, then
784 it's still loaded, so we don't need to do anything. Delete
785 it from the inferior's list, and leave it on GDB's list. */
786 if (inferior_iter != inferior.end ())
788 inferior.erase (inferior_iter);
789 ++gdb_iter;
792 /* If it's not on the inferior's list, remove it from GDB's tables. */
793 else
795 /* Notify any observer that the shared object has been
796 unloaded before we remove it from GDB's tables. */
797 notify_solib_unloaded (current_program_space, *gdb_iter);
799 current_program_space->deleted_solibs.push_back (gdb_iter->so_name);
801 /* Unless the user loaded it explicitly, free SO's objfile. */
802 if (gdb_iter->objfile != nullptr
803 && !(gdb_iter->objfile->flags & OBJF_USERLOADED)
804 && !solib_used (current_program_space, *gdb_iter))
805 gdb_iter->objfile->unlink ();
807 /* Some targets' section tables might be referring to
808 sections from so.abfd; remove them. */
809 current_program_space->remove_target_sections (&*gdb_iter);
811 gdb_iter = current_program_space->so_list.erase (gdb_iter);
815 /* Now the inferior's list contains only shared objects that don't
816 appear in GDB's list --- those that are newly loaded. Add them
817 to GDB's shared object list. */
818 if (!inferior.empty ())
820 int not_found = 0;
821 const char *not_found_filename = NULL;
823 /* Fill in the rest of each of the `so' nodes. */
824 for (solib &new_so : inferior)
826 current_program_space->added_solibs.push_back (&new_so);
830 /* Fill in the rest of the `struct solib' node. */
831 if (!solib_map_sections (new_so))
833 not_found++;
834 if (not_found_filename == NULL)
835 not_found_filename = new_so.so_original_name.c_str ();
839 catch (const gdb_exception_error &e)
841 exception_fprintf (gdb_stderr, e,
842 _ ("Error while mapping shared "
843 "library sections:\n"));
846 /* Notify any observer that the shared object has been
847 loaded now that we've added it to GDB's tables. */
848 notify_solib_loaded (new_so);
851 /* Add the new shared objects to GDB's list. */
852 current_program_space->so_list.splice (std::move (inferior));
854 /* If a library was not found, issue an appropriate warning
855 message. We have to use a single call to warning in case the
856 front end does something special with warnings, e.g., pop up
857 a dialog box. It Would Be Nice if we could get a "warning: "
858 prefix on each line in the CLI front end, though - it doesn't
859 stand out well. */
861 if (not_found == 1)
862 warning (_ ("Could not load shared library symbols for %ps.\n"
863 "Do you need \"%ps\" or \"%ps\"?"),
864 styled_string (file_name_style.style (),
865 not_found_filename),
866 styled_string (command_style.style (),
867 "set solib-search-path"),
868 styled_string (command_style.style (), "set sysroot"));
869 else if (not_found > 1)
870 warning (_ ("\
871 Could not load shared library symbols for %d libraries, e.g. %ps.\n\
872 Use the \"%ps\" command to see the complete listing.\n\
873 Do you need \"%ps\" or \"%ps\"?"),
874 not_found,
875 styled_string (file_name_style.style (),
876 not_found_filename),
877 styled_string (command_style.style (),
878 "info sharedlibrary"),
879 styled_string (command_style.style (),
880 "set solib-search-path"),
881 styled_string (command_style.style (),
882 "set sysroot"));
887 /* Return non-zero if NAME is the libpthread shared library.
889 Uses a fairly simplistic heuristic approach where we check
890 the file name against "/libpthread". This can lead to false
891 positives, but this should be good enough in practice.
893 As of glibc-2.34, functions formerly residing in libpthread have
894 been moved to libc, so "/libc." needs to be checked too. (Matching
895 the "." will avoid matching libraries such as libcrypt.) */
897 bool
898 libpthread_name_p (const char *name)
900 return (strstr (name, "/libpthread") != NULL
901 || strstr (name, "/libc.") != NULL);
904 /* Return non-zero if SO is the libpthread shared library. */
906 static bool
907 libpthread_solib_p (const solib &so)
909 return libpthread_name_p (so.so_name.c_str ());
912 /* Read in symbolic information for any shared objects whose names
913 match PATTERN. (If we've already read a shared object's symbol
914 info, leave it alone.) If PATTERN is zero, read them all.
916 If READSYMS is 0, defer reading symbolic information until later
917 but still do any needed low level processing.
919 FROM_TTY is described for update_solib_list, above. */
921 void
922 solib_add (const char *pattern, int from_tty, int readsyms)
924 if (print_symbol_loading_p (from_tty, 0, 0))
926 if (pattern != NULL)
928 gdb_printf (_ ("Loading symbols for shared libraries: %s\n"),
929 pattern);
931 else
932 gdb_printf (_ ("Loading symbols for shared libraries.\n"));
935 current_program_space->solib_add_generation++;
937 if (pattern)
939 char *re_err = re_comp (pattern);
941 if (re_err)
942 error (_ ("Invalid regexp: %s"), re_err);
945 update_solib_list (from_tty);
947 /* Walk the list of currently loaded shared libraries, and read
948 symbols for any that match the pattern --- or any whose symbols
949 aren't already loaded, if no pattern was given. */
951 bool any_matches = false;
952 bool loaded_any_symbols = false;
953 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
955 if (from_tty)
956 add_flags |= SYMFILE_VERBOSE;
958 for (solib &gdb : current_program_space->solibs ())
959 if (!pattern || re_exec (gdb.so_name.c_str ()))
961 /* Normally, we would read the symbols from that library
962 only if READSYMS is set. However, we're making a small
963 exception for the pthread library, because we sometimes
964 need the library symbols to be loaded in order to provide
965 thread support (x86-linux for instance). */
966 const int add_this_solib = (readsyms || libpthread_solib_p (gdb));
968 any_matches = true;
969 if (add_this_solib)
971 if (gdb.symbols_loaded)
973 /* If no pattern was given, be quiet for shared
974 libraries we have already loaded. */
975 if (pattern && (from_tty || info_verbose))
976 gdb_printf (_ ("Symbols already loaded for %ps\n"),
977 styled_string (file_name_style.style (),
978 gdb.so_name.c_str ()));
980 else if (solib_read_symbols (gdb, add_flags))
981 loaded_any_symbols = true;
985 if (loaded_any_symbols)
986 breakpoint_re_set ();
988 if (from_tty && pattern && !any_matches)
989 gdb_printf ("No loaded shared libraries match the pattern `%s'.\n",
990 pattern);
992 if (loaded_any_symbols)
994 /* Getting new symbols may change our opinion about what is
995 frameless. */
996 reinit_frame_cache ();
1001 /* Implement the "info sharedlibrary" command. Walk through the
1002 shared library list and print information about each attached
1003 library matching PATTERN. If PATTERN is elided, print them
1004 all. */
1006 static void
1007 info_sharedlibrary_command (const char *pattern, int from_tty)
1009 bool so_missing_debug_info = false;
1010 int addr_width;
1011 int nr_libs;
1012 gdbarch *gdbarch = current_inferior ()->arch ();
1013 struct ui_out *uiout = current_uiout;
1015 if (pattern)
1017 char *re_err = re_comp (pattern);
1019 if (re_err)
1020 error (_ ("Invalid regexp: %s"), re_err);
1023 /* "0x", a little whitespace, and two hex digits per byte of pointers. */
1024 addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
1026 update_solib_list (from_tty);
1028 /* ui_out_emit_table table_emitter needs to know the number of rows,
1029 so we need to make two passes over the libs. */
1031 nr_libs = 0;
1032 for (const solib &so : current_program_space->solibs ())
1034 if (!so.so_name.empty ())
1036 if (pattern && !re_exec (so.so_name.c_str ()))
1037 continue;
1038 ++nr_libs;
1043 ui_out_emit_table table_emitter (uiout, 4, nr_libs, "SharedLibraryTable");
1045 /* The "- 1" is because ui_out adds one space between columns. */
1046 uiout->table_header (addr_width - 1, ui_left, "from", "From");
1047 uiout->table_header (addr_width - 1, ui_left, "to", "To");
1048 uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
1049 uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
1051 uiout->table_body ();
1053 for (const solib &so : current_program_space->solibs ())
1055 if (so.so_name.empty ())
1056 continue;
1058 if (pattern && !re_exec (so.so_name.c_str ()))
1059 continue;
1061 ui_out_emit_tuple tuple_emitter (uiout, "lib");
1063 if (so.addr_high != 0)
1065 uiout->field_core_addr ("from", gdbarch, so.addr_low);
1066 uiout->field_core_addr ("to", gdbarch, so.addr_high);
1068 else
1070 uiout->field_skip ("from");
1071 uiout->field_skip ("to");
1074 if (!top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ()
1075 && so.symbols_loaded && !objfile_has_symbols (so.objfile))
1077 so_missing_debug_info = true;
1078 uiout->field_string ("syms-read", "Yes (*)");
1080 else
1081 uiout->field_string ("syms-read", so.symbols_loaded ? "Yes" : "No");
1083 uiout->field_string ("name", so.so_name, file_name_style.style ());
1085 uiout->text ("\n");
1089 if (nr_libs == 0)
1091 if (pattern)
1092 uiout->message (_ ("No shared libraries matched.\n"));
1093 else
1094 uiout->message (_ ("No shared libraries loaded at this time.\n"));
1096 else
1098 if (so_missing_debug_info)
1099 uiout->message (_ ("(*): Shared library is missing "
1100 "debugging information.\n"));
1104 /* See solib.h. */
1106 bool
1107 solib_contains_address_p (const solib &solib, CORE_ADDR address)
1109 for (const target_section &p : solib.sections)
1110 if (p.addr <= address && address < p.endaddr)
1111 return true;
1113 return false;
1116 /* If ADDRESS is in a shared lib in program space PSPACE, return its
1117 name.
1119 Provides a hook for other gdb routines to discover whether or not a
1120 particular address is within the mapped address space of a shared
1121 library.
1123 For example, this routine is called at one point to disable
1124 breakpoints which are in shared libraries that are not currently
1125 mapped in. */
1127 const char *
1128 solib_name_from_address (struct program_space *pspace, CORE_ADDR address)
1130 for (const solib &so : pspace->so_list)
1131 if (solib_contains_address_p (so, address))
1132 return so.so_name.c_str ();
1134 return nullptr;
1137 /* See solib.h. */
1139 bool
1140 solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
1142 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1144 if (ops->keep_data_in_core)
1145 return ops->keep_data_in_core (vaddr, size) != 0;
1146 else
1147 return false;
1150 /* See solib.h. */
1152 void
1153 clear_solib (program_space *pspace)
1155 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1157 disable_breakpoints_in_shlibs (pspace);
1159 for (solib &so : pspace->so_list)
1161 notify_solib_unloaded (pspace, so);
1162 pspace->remove_target_sections (&so);
1165 pspace->so_list.clear ();
1167 if (ops->clear_solib != nullptr)
1168 ops->clear_solib (pspace);
1171 /* Shared library startup support. When GDB starts up the inferior,
1172 it nurses it along (through the shell) until it is ready to execute
1173 its first instruction. At this point, this function gets
1174 called. */
1176 void
1177 solib_create_inferior_hook (int from_tty)
1179 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1181 ops->solib_create_inferior_hook (from_tty);
1184 /* See solib.h. */
1186 bool
1187 in_solib_dynsym_resolve_code (CORE_ADDR pc)
1189 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1191 return ops->in_dynsym_resolve_code (pc) != 0;
1194 /* Implements the "sharedlibrary" command. */
1196 static void
1197 sharedlibrary_command (const char *args, int from_tty)
1199 dont_repeat ();
1200 solib_add (args, from_tty, 1);
1203 /* See solib.h. */
1205 void
1206 no_shared_libraries (program_space *pspace)
1208 /* The order of the two routines below is important: clear_solib notifies
1209 the solib_unloaded observers, and some of these observers might need
1210 access to their associated objfiles. Therefore, we can not purge the
1211 solibs' objfiles before clear_solib has been called. */
1213 clear_solib (pspace);
1214 objfile_purge_solibs (pspace);
1217 /* Implements the command "nosharedlibrary", which discards symbols
1218 that have been auto-loaded from shared libraries. Symbols from
1219 shared libraries that were added by explicit request of the user
1220 are not discarded. */
1222 static void
1223 no_shared_libraries_command (const char *ignored, int from_tty)
1225 no_shared_libraries (current_program_space);
1228 /* See solib.h. */
1230 void
1231 update_solib_breakpoints (void)
1233 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1235 if (ops->update_breakpoints != NULL)
1236 ops->update_breakpoints ();
1239 /* See solib.h. */
1241 void
1242 handle_solib_event (void)
1244 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1246 if (ops->handle_event != NULL)
1247 ops->handle_event ();
1249 current_inferior ()->pspace->clear_solib_cache ();
1251 /* Check for any newly added shared libraries if we're supposed to
1252 be adding them automatically. Switch terminal for any messages
1253 produced by breakpoint_re_set. */
1254 target_terminal::ours_for_output ();
1255 solib_add (NULL, 0, auto_solib_add);
1256 target_terminal::inferior ();
1259 /* Reload shared libraries, but avoid reloading the same symbol file
1260 we already have loaded. */
1262 static void
1263 reload_shared_libraries_1 (int from_tty)
1265 if (print_symbol_loading_p (from_tty, 0, 0))
1266 gdb_printf (_ ("Loading symbols for shared libraries.\n"));
1268 for (solib &so : current_program_space->solibs ())
1270 const char *found_pathname = NULL;
1271 bool was_loaded = so.symbols_loaded;
1272 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
1274 if (from_tty)
1275 add_flags |= SYMFILE_VERBOSE;
1277 gdb::unique_xmalloc_ptr<char> filename (
1278 tilde_expand (so.so_original_name.c_str ()));
1279 gdb_bfd_ref_ptr abfd (solib_bfd_open (filename.get ()));
1280 if (abfd != NULL)
1281 found_pathname = bfd_get_filename (abfd.get ());
1283 /* If this shared library is no longer associated with its previous
1284 symbol file, close that. */
1285 if ((found_pathname == NULL && was_loaded)
1286 || (found_pathname != NULL
1287 && filename_cmp (found_pathname, so.so_name.c_str ()) != 0))
1289 if (so.objfile && !(so.objfile->flags & OBJF_USERLOADED)
1290 && !solib_used (current_program_space, so))
1291 so.objfile->unlink ();
1292 current_program_space->remove_target_sections (&so);
1293 so.clear ();
1296 /* If this shared library is now associated with a new symbol
1297 file, open it. */
1298 if (found_pathname != NULL
1299 && (!was_loaded
1300 || filename_cmp (found_pathname, so.so_name.c_str ()) != 0))
1302 bool got_error = false;
1306 solib_map_sections (so);
1309 catch (const gdb_exception_error &e)
1311 exception_fprintf (gdb_stderr, e,
1312 _ ("Error while mapping "
1313 "shared library sections:\n"));
1314 got_error = true;
1317 if (!got_error
1318 && (auto_solib_add || was_loaded || libpthread_solib_p (so)))
1319 solib_read_symbols (so, add_flags);
1324 static void
1325 reload_shared_libraries (const char *ignored, int from_tty,
1326 struct cmd_list_element *e)
1328 reload_shared_libraries_1 (from_tty);
1330 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1332 /* Creating inferior hooks here has two purposes. First, if we reload
1333 shared libraries then the address of solib breakpoint we've computed
1334 previously might be no longer valid. For example, if we forgot to set
1335 solib-absolute-prefix and are setting it right now, then the previous
1336 breakpoint address is plain wrong. Second, installing solib hooks
1337 also implicitly figures were ld.so is and loads symbols for it.
1338 Absent this call, if we've just connected to a target and set
1339 solib-absolute-prefix or solib-search-path, we'll lose all information
1340 about ld.so. */
1341 if (target_has_execution ())
1343 /* Reset or free private data structures not associated with
1344 so_list entries. */
1345 if (ops->clear_solib != nullptr)
1346 ops->clear_solib (current_program_space);
1348 /* Remove any previous solib event breakpoint. This is usually
1349 done in common code, at breakpoint_init_inferior time, but
1350 we're not really starting up the inferior here. */
1351 remove_solib_event_breakpoints ();
1353 solib_create_inferior_hook (from_tty);
1356 /* Sometimes the platform-specific hook loads initial shared
1357 libraries, and sometimes it doesn't. If it doesn't FROM_TTY will be
1358 incorrectly 0 but such solib targets should be fixed anyway. If we
1359 made all the inferior hook methods consistent, this call could be
1360 removed. Call it only after the solib target has been initialized by
1361 solib_create_inferior_hook. */
1363 solib_add (NULL, 0, auto_solib_add);
1365 breakpoint_re_set ();
1367 /* We may have loaded or unloaded debug info for some (or all)
1368 shared libraries. However, frames may still reference them. For
1369 example, a frame's unwinder might still point at DWARF FDE
1370 structures that are now freed. Also, getting new symbols may
1371 change our opinion about what is frameless. */
1372 reinit_frame_cache ();
1375 /* Wrapper for reload_shared_libraries that replaces "remote:"
1376 at the start of gdb_sysroot with "target:". */
1378 static void
1379 gdb_sysroot_changed (const char *ignored, int from_tty,
1380 struct cmd_list_element *e)
1382 const char *old_prefix = "remote:";
1383 const char *new_prefix = TARGET_SYSROOT_PREFIX;
1385 if (startswith (gdb_sysroot.c_str (), old_prefix))
1387 static bool warning_issued = false;
1389 gdb_assert (strlen (old_prefix) == strlen (new_prefix));
1390 gdb_sysroot = new_prefix + gdb_sysroot.substr (strlen (old_prefix));
1392 if (!warning_issued)
1394 warning (_ ("\"%s\" is deprecated, use \"%s\" instead."), old_prefix,
1395 new_prefix);
1396 warning (_ ("sysroot set to \"%s\"."), gdb_sysroot.c_str ());
1398 warning_issued = true;
1402 reload_shared_libraries (ignored, from_tty, e);
1405 static void
1406 show_auto_solib_add (struct ui_file *file, int from_tty,
1407 struct cmd_list_element *c, const char *value)
1409 gdb_printf (file, _ ("Autoloading of shared library symbols is %s.\n"),
1410 value);
1413 /* Lookup the value for a specific symbol from dynamic symbol table. Look
1414 up symbol from ABFD. MATCH_SYM is a callback function to determine
1415 whether to pick up a symbol. DATA is the input of this callback
1416 function. Return 0 if symbol is not found. */
1418 CORE_ADDR
1419 gdb_bfd_lookup_symbol_from_symtab (
1420 bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym)
1422 long storage_needed = bfd_get_symtab_upper_bound (abfd);
1423 CORE_ADDR symaddr = 0;
1425 if (storage_needed > 0)
1427 unsigned int i;
1429 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1430 asymbol **symbol_table = storage.data ();
1431 unsigned int number_of_symbols
1432 = bfd_canonicalize_symtab (abfd, symbol_table);
1434 for (i = 0; i < number_of_symbols; i++)
1436 asymbol *sym = *symbol_table++;
1438 if (match_sym (sym))
1440 gdbarch *gdbarch = current_inferior ()->arch ();
1441 symaddr = sym->value;
1443 /* Some ELF targets fiddle with addresses of symbols they
1444 consider special. They use minimal symbols to do that
1445 and this is needed for correct breakpoint placement,
1446 but we do not have full data here to build a complete
1447 minimal symbol, so just set the address and let the
1448 targets cope with that. */
1449 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1450 && gdbarch_elf_make_msymbol_special_p (gdbarch))
1452 struct minimal_symbol msym
1456 msym.set_value_address (symaddr);
1457 gdbarch_elf_make_msymbol_special (gdbarch, sym, &msym);
1458 symaddr = CORE_ADDR (msym.unrelocated_address ());
1461 /* BFD symbols are section relative. */
1462 symaddr += sym->section->vma;
1463 break;
1468 return symaddr;
1471 /* See solib.h. */
1474 gdb_bfd_scan_elf_dyntag (const int desired_dyntag, bfd *abfd, CORE_ADDR *ptr,
1475 CORE_ADDR *ptr_addr)
1477 int arch_size, step;
1478 bfd_size_type sect_size;
1479 long current_dyntag;
1480 CORE_ADDR dyn_ptr, dyn_addr;
1481 gdb_byte *bufend, *bufstart, *buf;
1482 Elf32_External_Dyn *x_dynp_32;
1483 Elf64_External_Dyn *x_dynp_64;
1484 struct bfd_section *sect;
1486 if (abfd == NULL)
1487 return 0;
1489 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1490 return 0;
1492 arch_size = bfd_get_arch_size (abfd);
1493 if (arch_size == -1)
1494 return 0;
1496 /* Find the start address of the .dynamic section. */
1497 sect = bfd_get_section_by_name (abfd, ".dynamic");
1498 if (sect == NULL)
1499 return 0;
1501 bool found = false;
1502 for (const target_section &target_section :
1503 current_program_space->target_sections ())
1504 if (sect == target_section.the_bfd_section)
1506 dyn_addr = target_section.addr;
1507 found = true;
1508 break;
1510 if (!found)
1512 /* ABFD may come from OBJFILE acting only as a symbol file without being
1513 loaded into the target (see add_symbol_file_command). This case is
1514 such fallback to the file VMA address without the possibility of
1515 having the section relocated to its actual in-memory address. */
1517 dyn_addr = bfd_section_vma (sect);
1520 /* Read in .dynamic from the BFD. We will get the actual value
1521 from memory later. */
1522 sect_size = bfd_section_size (sect);
1523 gdb::byte_vector buffer (sect_size);
1524 buf = bufstart = buffer.data ();
1525 if (!bfd_get_section_contents (abfd, sect,
1526 buf, 0, sect_size))
1527 return 0;
1529 /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
1530 step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
1531 : sizeof (Elf64_External_Dyn);
1532 for (bufend = buf + sect_size; buf < bufend; buf += step)
1534 if (arch_size == 32)
1536 x_dynp_32 = (Elf32_External_Dyn *) buf;
1537 current_dyntag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
1538 dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
1540 else
1542 x_dynp_64 = (Elf64_External_Dyn *) buf;
1543 current_dyntag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
1544 dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
1546 if (current_dyntag == DT_NULL)
1547 return 0;
1548 if (current_dyntag == desired_dyntag)
1550 /* If requested, try to read the runtime value of this .dynamic
1551 entry. */
1552 if (ptr)
1554 struct type *ptr_type;
1555 gdb_byte ptr_buf[8];
1556 CORE_ADDR ptr_addr_1;
1558 ptr_type = builtin_type (current_inferior ()->arch ())
1559 ->builtin_data_ptr;
1560 ptr_addr_1 = dyn_addr + (buf - bufstart) + arch_size / 8;
1561 if (target_read_memory (ptr_addr_1, ptr_buf, arch_size / 8) == 0)
1562 dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
1563 *ptr = dyn_ptr;
1564 if (ptr_addr)
1565 *ptr_addr = dyn_addr + (buf - bufstart);
1567 return 1;
1571 return 0;
1574 /* See solib.h. */
1576 gdb::unique_xmalloc_ptr<char>
1577 gdb_bfd_read_elf_soname (const char *filename)
1579 gdb_bfd_ref_ptr abfd = gdb_bfd_open (filename, gnutarget);
1581 if (abfd == nullptr)
1582 return {};
1584 /* Check that ABFD is an ET_DYN ELF file. */
1585 if (!bfd_check_format (abfd.get (), bfd_object)
1586 || !(bfd_get_file_flags (abfd.get ()) & DYNAMIC))
1587 return {};
1589 CORE_ADDR idx;
1590 if (!gdb_bfd_scan_elf_dyntag (DT_SONAME, abfd.get (), &idx, nullptr))
1591 return {};
1593 struct bfd_section *dynstr
1594 = bfd_get_section_by_name (abfd.get (), ".dynstr");
1595 int sect_size = bfd_section_size (dynstr);
1596 if (dynstr == nullptr || sect_size <= idx)
1597 return {};
1599 /* Read soname from the string table. */
1600 gdb::byte_vector dynstr_buf;
1601 if (!gdb_bfd_get_full_section_contents (abfd.get (), dynstr, &dynstr_buf))
1602 return {};
1604 /* Ensure soname is null-terminated before returning a copy. */
1605 char *soname = (char *) dynstr_buf.data () + idx;
1606 if (strnlen (soname, sect_size - idx) == sect_size - idx)
1607 return {};
1609 return make_unique_xstrdup (soname);
1612 /* Lookup the value for a specific symbol from symbol table. Look up symbol
1613 from ABFD. MATCH_SYM is a callback function to determine whether to pick
1614 up a symbol. DATA is the input of this callback function. Return 0
1615 if symbol is not found. */
1617 static CORE_ADDR
1618 bfd_lookup_symbol_from_dyn_symtab (
1619 bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym)
1621 long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
1622 CORE_ADDR symaddr = 0;
1624 if (storage_needed > 0)
1626 unsigned int i;
1627 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1628 asymbol **symbol_table = storage.data ();
1629 unsigned int number_of_symbols
1630 = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
1632 for (i = 0; i < number_of_symbols; i++)
1634 asymbol *sym = *symbol_table++;
1636 if (match_sym (sym))
1638 /* BFD symbols are section relative. */
1639 symaddr = sym->value + sym->section->vma;
1640 break;
1644 return symaddr;
1647 /* Lookup the value for a specific symbol from symbol table and dynamic
1648 symbol table. Look up symbol from ABFD. MATCH_SYM is a callback
1649 function to determine whether to pick up a symbol. DATA is the
1650 input of this callback function. Return 0 if symbol is not
1651 found. */
1653 CORE_ADDR
1654 gdb_bfd_lookup_symbol (bfd *abfd,
1655 gdb::function_view<bool (const asymbol *)> match_sym)
1657 CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym);
1659 /* On FreeBSD, the dynamic linker is stripped by default. So we'll
1660 have to check the dynamic string table too. */
1661 if (symaddr == 0)
1662 symaddr = bfd_lookup_symbol_from_dyn_symtab (abfd, match_sym);
1664 return symaddr;
1667 /* The shared library list may contain user-loaded object files that
1668 can be removed out-of-band by the user. So upon notification of
1669 free_objfile remove all references to any user-loaded file that is
1670 about to be freed. */
1672 static void
1673 remove_user_added_objfile (struct objfile *objfile)
1675 if (objfile->flags & OBJF_USERLOADED)
1677 for (solib &so : objfile->pspace ()->solibs ())
1678 if (so.objfile == objfile)
1679 so.objfile = nullptr;
1683 /* See solist.h. */
1685 std::optional<CORE_ADDR>
1686 default_find_solib_addr (solib &so)
1688 return {};
1691 void _initialize_solib ();
1693 void
1694 _initialize_solib ()
1696 gdb::observers::free_objfile.attach (remove_user_added_objfile, "solib");
1697 gdb::observers::inferior_execd.attach (
1698 [] (inferior *exec_inf, inferior *follow_inf) {
1699 solib_create_inferior_hook (0);
1701 "solib");
1703 add_com (
1704 "sharedlibrary", class_files, sharedlibrary_command,
1705 _ ("Load shared object library symbols for files matching REGEXP."));
1706 cmd_list_element *info_sharedlibrary_cmd
1707 = add_info ("sharedlibrary", info_sharedlibrary_command,
1708 _ ("Status of loaded shared object libraries."));
1709 add_info_alias ("dll", info_sharedlibrary_cmd, 1);
1710 add_com ("nosharedlibrary", class_files, no_shared_libraries_command,
1711 _ ("Unload all shared object library symbols."));
1713 add_setshow_boolean_cmd ("auto-solib-add", class_support, &auto_solib_add,
1714 _ ("\
1715 Set autoloading of shared library symbols."),
1716 _ ("\
1717 Show autoloading of shared library symbols."),
1718 _ ("\
1719 If \"on\", symbols from all shared object libraries will be loaded\n\
1720 automatically when the inferior begins execution, when the dynamic linker\n\
1721 informs gdb that a new library has been loaded, or when attaching to the\n\
1722 inferior. Otherwise, symbols must be loaded manually, using \
1723 `sharedlibrary'."),
1724 NULL, show_auto_solib_add, &setlist, &showlist);
1726 set_show_commands sysroot_cmds
1727 = add_setshow_optional_filename_cmd ("sysroot", class_support,
1728 &gdb_sysroot, _ ("\
1729 Set an alternate system root."),
1730 _ ("\
1731 Show the current system root."),
1732 _ ("\
1733 The system root is used to load absolute shared library symbol files.\n\
1734 For other (relative) files, you can add directories using\n\
1735 `set solib-search-path'."),
1736 gdb_sysroot_changed, NULL, &setlist,
1737 &showlist);
1739 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.set, class_support, 0,
1740 &setlist);
1741 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.show, class_support, 0,
1742 &showlist);
1744 add_setshow_optional_filename_cmd ("solib-search-path", class_support,
1745 &solib_search_path, _ ("\
1746 Set the search path for loading non-absolute shared library symbol files."),
1747 _ ("\
1748 Show the search path for loading non-absolute shared library symbol files."),
1749 _ ("\
1750 This takes precedence over the environment variables \
1751 PATH and LD_LIBRARY_PATH."),
1752 reload_shared_libraries,
1753 show_solib_search_path, &setlist,
1754 &showlist);
1756 add_setshow_boolean_cmd ("solib", class_maintenance, &debug_solib, _ ("\
1757 Set solib debugging."),
1758 _ ("\
1759 Show solib debugging."),
1760 _ ("\
1761 When true, solib-related debugging output is enabled."),
1762 nullptr, nullptr, &setdebuglist, &showdebuglist);