Fix null pointer dereference in process_debug_info()
[binutils-gdb.git] / gdb / solib.c
blob2f69c3372b0b0ec0ace53159e4bfaaacfe0f42f9
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 "symtab.h"
23 #include "bfd.h"
24 #include "build-id.h"
25 #include "symfile.h"
26 #include "objfiles.h"
27 #include "gdbcore.h"
28 #include "command.h"
29 #include "target.h"
30 #include "frame.h"
31 #include "inferior.h"
32 #include "gdbsupport/environ.h"
33 #include "cli/cli-cmds.h"
34 #include "elf/external.h"
35 #include "elf/common.h"
36 #include "filenames.h"
37 #include "exec.h"
38 #include "solist.h"
39 #include "observable.h"
40 #include "readline/tilde.h"
41 #include "solib.h"
42 #include "interps.h"
43 #include "filesystem.h"
44 #include "gdb_bfd.h"
45 #include "gdbsupport/filestuff.h"
46 #include "gdbsupport/scoped_fd.h"
47 #include "debuginfod-support.h"
48 #include "source.h"
49 #include "cli/cli-style.h"
51 /* See solib.h. */
53 bool debug_solib;
55 /* If non-empty, this is a search path for loading non-absolute shared library
56 symbol files. This takes precedence over the environment variables PATH
57 and LD_LIBRARY_PATH. */
58 static std::string solib_search_path;
60 static void
61 show_solib_search_path (struct ui_file *file, int from_tty,
62 struct cmd_list_element *c, const char *value)
64 gdb_printf (file,
65 _ ("The search path for loading non-absolute "
66 "shared library symbol files is %s.\n"),
67 value);
70 /* Same as HAVE_DOS_BASED_FILE_SYSTEM, but useable as an rvalue. */
71 #if (HAVE_DOS_BASED_FILE_SYSTEM)
72 #define DOS_BASED_FILE_SYSTEM 1
73 #else
74 #define DOS_BASED_FILE_SYSTEM 0
75 #endif
77 /* Return the full pathname of a binary file (the main executable or a
78 shared library file), or NULL if not found. If FD is non-NULL, *FD
79 is set to either -1 or an open file handle for the binary file.
81 Global variable GDB_SYSROOT is used as a prefix directory
82 to search for binary files if they have an absolute path.
83 If GDB_SYSROOT starts with "target:" and target filesystem
84 is the local filesystem then the "target:" prefix will be
85 stripped before the search starts. This ensures that the
86 same search algorithm is used for local files regardless of
87 whether a "target:" prefix was used.
89 Global variable SOLIB_SEARCH_PATH is used as a prefix directory
90 (or set of directories, as in LD_LIBRARY_PATH) to search for all
91 shared libraries if not found in either the sysroot (if set) or
92 the local filesystem. SOLIB_SEARCH_PATH is not used when searching
93 for the main executable.
95 Search algorithm:
96 * If a sysroot is set and path is absolute:
97 * Search for sysroot/path.
98 * else
99 * Look for it literally (unmodified).
100 * If IS_SOLIB is non-zero:
101 * Look in SOLIB_SEARCH_PATH.
102 * If available, use target defined search function.
103 * If NO sysroot is set, perform the following two searches:
104 * Look in inferior's $PATH.
105 * If IS_SOLIB is non-zero:
106 * Look in inferior's $LD_LIBRARY_PATH.
108 * The last check avoids doing this search when targeting remote
109 * machines since a sysroot will almost always be set.
112 static gdb::unique_xmalloc_ptr<char>
113 solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
115 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
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, and we're looking for a solib, try to use target
299 supplied solib search method. */
300 if (is_solib && found_file < 0 && ops->find_and_open_solib)
301 found_file = ops->find_and_open_solib (in_pathname, O_RDONLY | O_BINARY,
302 &temp_pathname);
304 /* If not found, next search the inferior's $PATH environment variable. */
305 if (found_file < 0 && sysroot == NULL)
306 found_file = openp (current_inferior ()->environment.get ("PATH"),
307 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
308 O_RDONLY | O_BINARY, &temp_pathname);
310 /* If not found, and we're looking for a solib, next search the
311 inferior's $LD_LIBRARY_PATH environment variable. */
312 if (is_solib && found_file < 0 && sysroot == NULL)
313 found_file
314 = openp (current_inferior ()->environment.get ("LD_LIBRARY_PATH"),
315 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
316 O_RDONLY | O_BINARY, &temp_pathname);
318 if (fd == NULL)
320 if (found_file >= 0)
321 close (found_file);
323 else
324 *fd = found_file;
326 return temp_pathname;
329 /* Return the full pathname of the main executable, or NULL if not
330 found. If FD is non-NULL, *FD is set to either -1 or an open file
331 handle for the main executable. */
333 gdb::unique_xmalloc_ptr<char>
334 exec_file_find (const char *in_pathname, int *fd)
336 gdb::unique_xmalloc_ptr<char> result;
337 const char *fskind = effective_target_file_system_kind ();
339 if (in_pathname == NULL)
340 return NULL;
342 if (!gdb_sysroot.empty () && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
344 result = solib_find_1 (in_pathname, fd, false);
346 if (result == NULL && fskind == file_system_kind_dos_based)
348 char *new_pathname;
350 new_pathname = (char *) alloca (strlen (in_pathname) + 5);
351 strcpy (new_pathname, in_pathname);
352 strcat (new_pathname, ".exe");
354 result = solib_find_1 (new_pathname, fd, false);
357 else
359 /* It's possible we don't have a full path, but rather just a
360 filename. Some targets, such as HP-UX, don't provide the
361 full path, sigh.
363 Attempt to qualify the filename against the source path.
364 (If that fails, we'll just fall back on the original
365 filename. Not much more we can do...) */
367 if (!source_full_path_of (in_pathname, &result))
368 result.reset (xstrdup (in_pathname));
369 if (fd != NULL)
370 *fd = -1;
373 return result;
376 /* Return the full pathname of a shared library file, or NULL if not
377 found. If FD is non-NULL, *FD is set to either -1 or an open file
378 handle for the shared library.
380 The search algorithm used is described in solib_find_1's comment
381 above. */
383 gdb::unique_xmalloc_ptr<char>
384 solib_find (const char *in_pathname, int *fd)
386 const char *solib_symbols_extension
387 = gdbarch_solib_symbols_extension (current_inferior ()->arch ());
389 /* If solib_symbols_extension is set, replace the file's
390 extension. */
391 if (solib_symbols_extension != NULL)
393 const char *p = in_pathname + strlen (in_pathname);
395 while (p > in_pathname && *p != '.')
396 p--;
398 if (*p == '.')
400 char *new_pathname;
402 new_pathname
403 = (char *) alloca (p - in_pathname + 1
404 + strlen (solib_symbols_extension) + 1);
405 memcpy (new_pathname, in_pathname, p - in_pathname + 1);
406 strcpy (new_pathname + (p - in_pathname) + 1,
407 solib_symbols_extension);
409 in_pathname = new_pathname;
413 return solib_find_1 (in_pathname, fd, true);
416 /* Open and return a BFD for the shared library PATHNAME. If FD is not -1,
417 it is used as file handle to open the file. Throws an error if the file
418 could not be opened. Handles both local and remote file access.
420 If unsuccessful, the FD will be closed (unless FD was -1). */
422 gdb_bfd_ref_ptr
423 solib_bfd_fopen (const char *pathname, int fd)
425 gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd));
427 if (abfd == NULL)
429 /* Arrange to free PATHNAME when the error is thrown. */
430 error (_ ("Could not open `%s' as an executable file: %s"), pathname,
431 bfd_errmsg (bfd_get_error ()));
434 return abfd;
437 /* Find shared library PATHNAME and open a BFD for it. */
439 gdb_bfd_ref_ptr
440 solib_bfd_open (const char *pathname)
442 int found_file;
443 const struct bfd_arch_info *b;
445 /* Search for shared library file. */
446 gdb::unique_xmalloc_ptr<char> found_pathname
447 = solib_find (pathname, &found_file);
448 if (found_pathname == NULL)
450 /* Return failure if the file could not be found, so that we can
451 accumulate messages about missing libraries. */
452 if (errno == ENOENT)
453 return NULL;
455 perror_with_name (pathname);
458 /* Open bfd for shared library. */
459 gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname.get (), found_file));
461 /* Check bfd format. */
462 if (!bfd_check_format (abfd.get (), bfd_object))
463 error (_ ("`%s': not in executable format: %s"),
464 bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
466 /* Check bfd arch. */
467 b = gdbarch_bfd_arch_info (current_inferior ()->arch ());
468 if (!b->compatible (b, bfd_get_arch_info (abfd.get ())))
469 error (_ ("`%s': Shared library architecture %s is not compatible "
470 "with target architecture %s."),
471 bfd_get_filename (abfd.get ()),
472 bfd_get_arch_info (abfd.get ())->printable_name, b->printable_name);
474 return abfd;
477 /* Mapping of a core file's shared library sonames to their respective
478 build-ids. Added to the registries of core file bfds. */
480 typedef std::unordered_map<std::string, std::string> soname_build_id_map;
482 /* Key used to associate a soname_build_id_map to a core file bfd. */
484 static const struct registry<bfd>::key<soname_build_id_map>
485 cbfd_soname_build_id_data_key;
487 /* See solib.h. */
489 void
490 set_cbfd_soname_build_id (gdb_bfd_ref_ptr abfd, const char *soname,
491 const bfd_build_id *build_id)
493 gdb_assert (abfd.get () != nullptr);
494 gdb_assert (soname != nullptr);
495 gdb_assert (build_id != nullptr);
497 soname_build_id_map *mapptr
498 = cbfd_soname_build_id_data_key.get (abfd.get ());
500 if (mapptr == nullptr)
501 mapptr = cbfd_soname_build_id_data_key.emplace (abfd.get ());
503 (*mapptr)[soname] = build_id_to_string (build_id);
506 /* If SONAME had a build-id associated with it in ABFD's registry by a
507 previous call to set_cbfd_soname_build_id then return the build-id
508 as a NULL-terminated hex string. */
510 static gdb::unique_xmalloc_ptr<char>
511 get_cbfd_soname_build_id (gdb_bfd_ref_ptr abfd, const char *soname)
513 if (abfd.get () == nullptr || soname == nullptr)
514 return {};
516 soname_build_id_map *mapptr
517 = cbfd_soname_build_id_data_key.get (abfd.get ());
519 if (mapptr == nullptr)
520 return {};
522 auto it = mapptr->find (lbasename (soname));
523 if (it == mapptr->end ())
524 return {};
526 return make_unique_xstrdup (it->second.c_str ());
529 /* Given a pointer to one of the shared objects in our list of mapped
530 objects, use the recorded name to open a bfd descriptor for the
531 object, build a section table, relocate all the section addresses
532 by the base address at which the shared object was mapped, and then
533 add the sections to the target's section table.
535 FIXME: In most (all?) cases the shared object file name recorded in
536 the dynamic linkage tables will be a fully qualified pathname. For
537 cases where it isn't, do we really mimic the systems search
538 mechanism correctly in the below code (particularly the tilde
539 expansion stuff?). */
541 static int
542 solib_map_sections (solib &so)
544 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
546 gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so.so_name.c_str ()));
547 gdb_bfd_ref_ptr abfd (ops->bfd_open (filename.get ()));
548 gdb::unique_xmalloc_ptr<char> build_id_hexstr
549 = get_cbfd_soname_build_id (current_program_space->cbfd,
550 so.so_name.c_str ());
552 /* If we already know the build-id of this solib from a core file, verify
553 it matches ABFD's build-id. If there is a mismatch or the solib wasn't
554 found, attempt to query debuginfod for the correct solib. */
555 if (build_id_hexstr.get () != nullptr)
557 bool mismatch = false;
559 if (abfd != nullptr && abfd->build_id != nullptr)
561 std::string build_id = build_id_to_string (abfd->build_id);
563 if (build_id != build_id_hexstr.get ())
564 mismatch = true;
566 if (abfd == nullptr || mismatch)
568 scoped_fd fd = debuginfod_exec_query (
569 (const unsigned char *) build_id_hexstr.get (), 0,
570 so.so_name.c_str (), &filename);
572 if (fd.get () >= 0)
573 abfd = ops->bfd_open (filename.get ());
574 else if (mismatch)
575 warning (_ ("Build-id of %ps does not match core file."),
576 styled_string (file_name_style.style (),
577 filename.get ()));
581 if (abfd == NULL)
582 return 0;
584 /* Leave bfd open, core_xfer_memory and "info files" need it. */
585 so.abfd = std::move (abfd);
587 /* Copy the full path name into so_name, allowing symbol_file_add
588 to find it later. This also affects the =library-loaded GDB/MI
589 event, and in particular the part of that notification providing
590 the library's host-side path. If we let the target dictate
591 that objfile's path, and the target is different from the host,
592 GDB/MI will not provide the correct host-side path. */
594 so.so_name = bfd_get_filename (so.abfd.get ());
595 so.sections = build_section_table (so.abfd.get ());
597 for (target_section &p : so.sections)
599 /* Relocate the section binding addresses as recorded in the shared
600 object's file by the base address to which the object was actually
601 mapped. */
602 ops->relocate_section_addresses (so, &p);
604 /* If the target didn't provide information about the address
605 range of the shared object, assume we want the location of
606 the .text section. */
607 if (so.addr_low == 0 && so.addr_high == 0
608 && strcmp (p.the_bfd_section->name, ".text") == 0)
610 so.addr_low = p.addr;
611 so.addr_high = p.endaddr;
615 /* Add the shared object's sections to the current set of file
616 section tables. Do this immediately after mapping the object so
617 that later nodes in the list can query this object, as is needed
618 in solib-osf.c. */
619 current_program_space->add_target_sections (&so, so.sections);
621 return 1;
624 /* See solist.h. */
626 void
627 solib::clear ()
629 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
631 this->sections.clear ();
632 this->abfd = nullptr;
634 /* Our caller closed the objfile, possibly via objfile_purge_solibs. */
635 this->symbols_loaded = 0;
636 this->objfile = nullptr;
638 this->addr_low = this->addr_high = 0;
640 /* Restore the target-supplied file name. SO_NAME may be the path
641 of the symbol file. */
642 this->so_name = this->so_original_name;
644 /* Do the same for target-specific data. */
645 if (ops->clear_so != NULL)
646 ops->clear_so (*this);
649 lm_info::~lm_info () = default;
651 /* Read in symbols for shared object SO. If SYMFILE_VERBOSE is set in FLAGS,
652 be chatty about it. Return true if any symbols were actually loaded. */
654 bool
655 solib_read_symbols (solib &so, symfile_add_flags flags)
657 if (so.symbols_loaded)
659 /* If needed, we've already warned in our caller. */
661 else if (so.abfd == NULL)
663 /* We've already warned about this library, when trying to open
664 it. */
666 else
668 flags |= current_inferior ()->symfile_flags;
672 /* Have we already loaded this shared object? */
673 so.objfile = nullptr;
674 for (objfile *objfile : current_program_space->objfiles ())
676 if (filename_cmp (objfile_name (objfile), so.so_name.c_str ())
677 == 0
678 && objfile->addr_low == so.addr_low)
680 so.objfile = objfile;
681 break;
684 if (so.objfile == NULL)
686 section_addr_info sap
687 = build_section_addr_info_from_section_table (so.sections);
688 gdb_bfd_ref_ptr tmp_bfd = so.abfd;
689 so.objfile
690 = symbol_file_add_from_bfd (tmp_bfd, so.so_name.c_str (),
691 flags, &sap, OBJF_SHARED, nullptr);
692 so.objfile->addr_low = so.addr_low;
695 so.symbols_loaded = 1;
697 catch (const gdb_exception_error &e)
699 exception_fprintf (gdb_stderr, e,
700 _ ("Error while reading shared"
701 " library symbols for %s:\n"),
702 so.so_name.c_str ());
705 return true;
708 return false;
711 /* Return true if KNOWN->objfile is used by any other so_list object
712 in the list of shared libraries. Return false otherwise. */
714 static bool
715 solib_used (const solib &known)
717 for (const solib &pivot : current_program_space->solibs ())
718 if (&pivot != &known && pivot.objfile == known.objfile)
719 return true;
720 return false;
723 /* Notify interpreters and observers that solib SO has been loaded. */
725 static void
726 notify_solib_loaded (solib &so)
728 interps_notify_solib_loaded (so);
729 gdb::observers::solib_loaded.notify (so);
732 /* Notify interpreters and observers that solib SO has been unloaded. */
734 static void
735 notify_solib_unloaded (program_space *pspace, const solib &so)
737 interps_notify_solib_unloaded (so);
738 gdb::observers::solib_unloaded.notify (pspace, so);
741 /* See solib.h. */
743 void
744 update_solib_list (int from_tty)
746 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
748 /* We can reach here due to changing solib-search-path or the
749 sysroot, before having any inferior. */
750 if (target_has_execution () && inferior_ptid != null_ptid)
752 struct inferior *inf = current_inferior ();
754 /* If we are attaching to a running process for which we
755 have not opened a symbol file, we may be able to get its
756 symbols now! */
757 if (inf->attach_flag
758 && current_program_space->symfile_object_file == NULL)
762 ops->open_symbol_file_object (from_tty);
764 catch (const gdb_exception_error &ex)
766 exception_fprintf (gdb_stderr, ex,
767 "Error reading attached "
768 "process's symbol file.\n");
773 /* GDB and the inferior's dynamic linker each maintain their own
774 list of currently loaded shared objects; we want to bring the
775 former in sync with the latter. Scan both lists, seeing which
776 shared objects appear where. There are three cases:
778 - A shared object appears on both lists. This means that GDB
779 knows about it already, and it's still loaded in the inferior.
780 Nothing needs to happen.
782 - A shared object appears only on GDB's list. This means that
783 the inferior has unloaded it. We should remove the shared
784 object from GDB's tables.
786 - A shared object appears only on the inferior's list. This
787 means that it's just been loaded. We should add it to GDB's
788 tables.
790 So we walk GDB's list, checking each entry to see if it appears
791 in the inferior's list too. If it does, no action is needed, and
792 we remove it from the inferior's list. If it doesn't, the
793 inferior has unloaded it, and we remove it from GDB's list. By
794 the time we're done walking GDB's list, the inferior's list
795 contains only the new shared objects, which we then add. */
797 intrusive_list<solib> inferior = ops->current_sos ();
798 intrusive_list<solib>::iterator gdb_iter
799 = current_program_space->so_list.begin ();
800 while (gdb_iter != current_program_space->so_list.end ())
802 intrusive_list<solib>::iterator inferior_iter = inferior.begin ();
804 /* Check to see whether the shared object *gdb also appears in
805 the inferior's current list. */
806 for (; inferior_iter != inferior.end (); ++inferior_iter)
808 if (ops->same)
810 if (ops->same (*gdb_iter, *inferior_iter))
811 break;
813 else
815 if (!filename_cmp (gdb_iter->so_original_name.c_str (),
816 inferior_iter->so_original_name.c_str ()))
817 break;
821 /* If the shared object appears on the inferior's list too, then
822 it's still loaded, so we don't need to do anything. Delete
823 it from the inferior's list, and leave it on GDB's list. */
824 if (inferior_iter != inferior.end ())
826 inferior.erase (inferior_iter);
827 delete &*inferior_iter;
828 ++gdb_iter;
831 /* If it's not on the inferior's list, remove it from GDB's tables. */
832 else
834 /* Notify any observer that the shared object has been
835 unloaded before we remove it from GDB's tables. */
836 notify_solib_unloaded (current_program_space, *gdb_iter);
838 current_program_space->deleted_solibs.push_back (gdb_iter->so_name);
840 intrusive_list<solib>::iterator gdb_iter_next
841 = current_program_space->so_list.erase (gdb_iter);
843 /* Unless the user loaded it explicitly, free SO's objfile. */
844 if (gdb_iter->objfile != nullptr
845 && !(gdb_iter->objfile->flags & OBJF_USERLOADED)
846 && !solib_used (*gdb_iter))
847 gdb_iter->objfile->unlink ();
849 /* Some targets' section tables might be referring to
850 sections from so.abfd; remove them. */
851 current_program_space->remove_target_sections (&*gdb_iter);
853 delete &*gdb_iter;
854 gdb_iter = gdb_iter_next;
858 /* Now the inferior's list contains only shared objects that don't
859 appear in GDB's list --- those that are newly loaded. Add them
860 to GDB's shared object list. */
861 if (!inferior.empty ())
863 int not_found = 0;
864 const char *not_found_filename = NULL;
866 /* Fill in the rest of each of the `so' nodes. */
867 for (solib &new_so : inferior)
869 current_program_space->added_solibs.push_back (&new_so);
873 /* Fill in the rest of the `struct solib' node. */
874 if (!solib_map_sections (new_so))
876 not_found++;
877 if (not_found_filename == NULL)
878 not_found_filename = new_so.so_original_name.c_str ();
882 catch (const gdb_exception_error &e)
884 exception_fprintf (gdb_stderr, e,
885 _ ("Error while mapping shared "
886 "library sections:\n"));
889 /* Notify any observer that the shared object has been
890 loaded now that we've added it to GDB's tables. */
891 notify_solib_loaded (new_so);
894 /* Add the new shared objects to GDB's list. */
895 current_program_space->so_list.splice (std::move (inferior));
897 /* If a library was not found, issue an appropriate warning
898 message. We have to use a single call to warning in case the
899 front end does something special with warnings, e.g., pop up
900 a dialog box. It Would Be Nice if we could get a "warning: "
901 prefix on each line in the CLI front end, though - it doesn't
902 stand out well. */
904 if (not_found == 1)
905 warning (_ ("Could not load shared library symbols for %s.\n"
906 "Do you need \"set solib-search-path\" "
907 "or \"set sysroot\"?"),
908 not_found_filename);
909 else if (not_found > 1)
910 warning (_ ("\
911 Could not load shared library symbols for %d libraries, e.g. %s.\n\
912 Use the \"info sharedlibrary\" command to see the complete listing.\n\
913 Do you need \"set solib-search-path\" or \"set sysroot\"?"),
914 not_found, not_found_filename);
918 /* Return non-zero if NAME is the libpthread shared library.
920 Uses a fairly simplistic heuristic approach where we check
921 the file name against "/libpthread". This can lead to false
922 positives, but this should be good enough in practice.
924 As of glibc-2.34, functions formerly residing in libpthread have
925 been moved to libc, so "/libc." needs to be checked too. (Matching
926 the "." will avoid matching libraries such as libcrypt.) */
928 bool
929 libpthread_name_p (const char *name)
931 return (strstr (name, "/libpthread") != NULL
932 || strstr (name, "/libc.") != NULL);
935 /* Return non-zero if SO is the libpthread shared library. */
937 static bool
938 libpthread_solib_p (const solib &so)
940 return libpthread_name_p (so.so_name.c_str ());
943 /* Read in symbolic information for any shared objects whose names
944 match PATTERN. (If we've already read a shared object's symbol
945 info, leave it alone.) If PATTERN is zero, read them all.
947 If READSYMS is 0, defer reading symbolic information until later
948 but still do any needed low level processing.
950 FROM_TTY is described for update_solib_list, above. */
952 void
953 solib_add (const char *pattern, int from_tty, int readsyms)
955 if (print_symbol_loading_p (from_tty, 0, 0))
957 if (pattern != NULL)
959 gdb_printf (_ ("Loading symbols for shared libraries: %s\n"),
960 pattern);
962 else
963 gdb_printf (_ ("Loading symbols for shared libraries.\n"));
966 current_program_space->solib_add_generation++;
968 if (pattern)
970 char *re_err = re_comp (pattern);
972 if (re_err)
973 error (_ ("Invalid regexp: %s"), re_err);
976 update_solib_list (from_tty);
978 /* Walk the list of currently loaded shared libraries, and read
979 symbols for any that match the pattern --- or any whose symbols
980 aren't already loaded, if no pattern was given. */
982 bool any_matches = false;
983 bool loaded_any_symbols = false;
984 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
986 if (from_tty)
987 add_flags |= SYMFILE_VERBOSE;
989 for (solib &gdb : current_program_space->solibs ())
990 if (!pattern || re_exec (gdb.so_name.c_str ()))
992 /* Normally, we would read the symbols from that library
993 only if READSYMS is set. However, we're making a small
994 exception for the pthread library, because we sometimes
995 need the library symbols to be loaded in order to provide
996 thread support (x86-linux for instance). */
997 const int add_this_solib = (readsyms || libpthread_solib_p (gdb));
999 any_matches = true;
1000 if (add_this_solib)
1002 if (gdb.symbols_loaded)
1004 /* If no pattern was given, be quiet for shared
1005 libraries we have already loaded. */
1006 if (pattern && (from_tty || info_verbose))
1007 gdb_printf (_ ("Symbols already loaded for %s\n"),
1008 gdb.so_name.c_str ());
1010 else if (solib_read_symbols (gdb, add_flags))
1011 loaded_any_symbols = true;
1015 if (loaded_any_symbols)
1016 breakpoint_re_set ();
1018 if (from_tty && pattern && !any_matches)
1019 gdb_printf ("No loaded shared libraries match the pattern `%s'.\n",
1020 pattern);
1022 if (loaded_any_symbols)
1024 /* Getting new symbols may change our opinion about what is
1025 frameless. */
1026 reinit_frame_cache ();
1031 /* Implement the "info sharedlibrary" command. Walk through the
1032 shared library list and print information about each attached
1033 library matching PATTERN. If PATTERN is elided, print them
1034 all. */
1036 static void
1037 info_sharedlibrary_command (const char *pattern, int from_tty)
1039 bool so_missing_debug_info = false;
1040 int addr_width;
1041 int nr_libs;
1042 gdbarch *gdbarch = current_inferior ()->arch ();
1043 struct ui_out *uiout = current_uiout;
1045 if (pattern)
1047 char *re_err = re_comp (pattern);
1049 if (re_err)
1050 error (_ ("Invalid regexp: %s"), re_err);
1053 /* "0x", a little whitespace, and two hex digits per byte of pointers. */
1054 addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
1056 update_solib_list (from_tty);
1058 /* ui_out_emit_table table_emitter needs to know the number of rows,
1059 so we need to make two passes over the libs. */
1061 nr_libs = 0;
1062 for (const solib &so : current_program_space->solibs ())
1064 if (!so.so_name.empty ())
1066 if (pattern && !re_exec (so.so_name.c_str ()))
1067 continue;
1068 ++nr_libs;
1073 ui_out_emit_table table_emitter (uiout, 4, nr_libs, "SharedLibraryTable");
1075 /* The "- 1" is because ui_out adds one space between columns. */
1076 uiout->table_header (addr_width - 1, ui_left, "from", "From");
1077 uiout->table_header (addr_width - 1, ui_left, "to", "To");
1078 uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
1079 uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
1081 uiout->table_body ();
1083 for (const solib &so : current_program_space->solibs ())
1085 if (so.so_name.empty ())
1086 continue;
1088 if (pattern && !re_exec (so.so_name.c_str ()))
1089 continue;
1091 ui_out_emit_tuple tuple_emitter (uiout, "lib");
1093 if (so.addr_high != 0)
1095 uiout->field_core_addr ("from", gdbarch, so.addr_low);
1096 uiout->field_core_addr ("to", gdbarch, so.addr_high);
1098 else
1100 uiout->field_skip ("from");
1101 uiout->field_skip ("to");
1104 if (!top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ()
1105 && so.symbols_loaded && !objfile_has_symbols (so.objfile))
1107 so_missing_debug_info = true;
1108 uiout->field_string ("syms-read", "Yes (*)");
1110 else
1111 uiout->field_string ("syms-read", so.symbols_loaded ? "Yes" : "No");
1113 uiout->field_string ("name", so.so_name, file_name_style.style ());
1115 uiout->text ("\n");
1119 if (nr_libs == 0)
1121 if (pattern)
1122 uiout->message (_ ("No shared libraries matched.\n"));
1123 else
1124 uiout->message (_ ("No shared libraries loaded at this time.\n"));
1126 else
1128 if (so_missing_debug_info)
1129 uiout->message (_ ("(*): Shared library is missing "
1130 "debugging information.\n"));
1134 /* See solib.h. */
1136 bool
1137 solib_contains_address_p (const solib &solib, CORE_ADDR address)
1139 for (const target_section &p : solib.sections)
1140 if (p.addr <= address && address < p.endaddr)
1141 return true;
1143 return false;
1146 /* If ADDRESS is in a shared lib in program space PSPACE, return its
1147 name.
1149 Provides a hook for other gdb routines to discover whether or not a
1150 particular address is within the mapped address space of a shared
1151 library.
1153 For example, this routine is called at one point to disable
1154 breakpoints which are in shared libraries that are not currently
1155 mapped in. */
1157 const char *
1158 solib_name_from_address (struct program_space *pspace, CORE_ADDR address)
1160 for (const solib &so : pspace->so_list)
1161 if (solib_contains_address_p (so, address))
1162 return so.so_name.c_str ();
1164 return nullptr;
1167 /* See solib.h. */
1169 bool
1170 solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
1172 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1174 if (ops->keep_data_in_core)
1175 return ops->keep_data_in_core (vaddr, size) != 0;
1176 else
1177 return false;
1180 /* See solib.h. */
1182 void
1183 clear_solib (program_space *pspace)
1185 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1187 disable_breakpoints_in_shlibs (pspace);
1189 pspace->so_list.clear_and_dispose ([pspace] (solib *so) {
1190 notify_solib_unloaded (pspace, *so);
1191 pspace->remove_target_sections (so);
1192 delete so;
1195 if (ops->clear_solib != nullptr)
1196 ops->clear_solib (pspace);
1199 /* Shared library startup support. When GDB starts up the inferior,
1200 it nurses it along (through the shell) until it is ready to execute
1201 its first instruction. At this point, this function gets
1202 called. */
1204 void
1205 solib_create_inferior_hook (int from_tty)
1207 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1209 ops->solib_create_inferior_hook (from_tty);
1212 /* See solib.h. */
1214 bool
1215 in_solib_dynsym_resolve_code (CORE_ADDR pc)
1217 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1219 return ops->in_dynsym_resolve_code (pc) != 0;
1222 /* Implements the "sharedlibrary" command. */
1224 static void
1225 sharedlibrary_command (const char *args, int from_tty)
1227 dont_repeat ();
1228 solib_add (args, from_tty, 1);
1231 /* Implements the command "nosharedlibrary", which discards symbols
1232 that have been auto-loaded from shared libraries. Symbols from
1233 shared libraries that were added by explicit request of the user
1234 are not discarded. Also called from remote.c. */
1236 void
1237 no_shared_libraries (const char *ignored, int from_tty)
1239 /* The order of the two routines below is important: clear_solib notifies
1240 the solib_unloaded observers, and some of these observers might need
1241 access to their associated objfiles. Therefore, we can not purge the
1242 solibs' objfiles before clear_solib has been called. */
1244 clear_solib (current_program_space);
1245 objfile_purge_solibs ();
1248 /* See solib.h. */
1250 void
1251 update_solib_breakpoints (void)
1253 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1255 if (ops->update_breakpoints != NULL)
1256 ops->update_breakpoints ();
1259 /* See solib.h. */
1261 void
1262 handle_solib_event (void)
1264 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1266 if (ops->handle_event != NULL)
1267 ops->handle_event ();
1269 current_inferior ()->pspace->clear_solib_cache ();
1271 /* Check for any newly added shared libraries if we're supposed to
1272 be adding them automatically. Switch terminal for any messages
1273 produced by breakpoint_re_set. */
1274 target_terminal::ours_for_output ();
1275 solib_add (NULL, 0, auto_solib_add);
1276 target_terminal::inferior ();
1279 /* Reload shared libraries, but avoid reloading the same symbol file
1280 we already have loaded. */
1282 static void
1283 reload_shared_libraries_1 (int from_tty)
1285 if (print_symbol_loading_p (from_tty, 0, 0))
1286 gdb_printf (_ ("Loading symbols for shared libraries.\n"));
1288 for (solib &so : current_program_space->solibs ())
1290 const char *found_pathname = NULL;
1291 bool was_loaded = so.symbols_loaded != 0;
1292 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
1294 if (from_tty)
1295 add_flags |= SYMFILE_VERBOSE;
1297 gdb::unique_xmalloc_ptr<char> filename (
1298 tilde_expand (so.so_original_name.c_str ()));
1299 gdb_bfd_ref_ptr abfd (solib_bfd_open (filename.get ()));
1300 if (abfd != NULL)
1301 found_pathname = bfd_get_filename (abfd.get ());
1303 /* If this shared library is no longer associated with its previous
1304 symbol file, close that. */
1305 if ((found_pathname == NULL && was_loaded)
1306 || (found_pathname != NULL
1307 && filename_cmp (found_pathname, so.so_name.c_str ()) != 0))
1309 if (so.objfile && !(so.objfile->flags & OBJF_USERLOADED)
1310 && !solib_used (so))
1311 so.objfile->unlink ();
1312 current_program_space->remove_target_sections (&so);
1313 so.clear ();
1316 /* If this shared library is now associated with a new symbol
1317 file, open it. */
1318 if (found_pathname != NULL
1319 && (!was_loaded
1320 || filename_cmp (found_pathname, so.so_name.c_str ()) != 0))
1322 bool got_error = false;
1326 solib_map_sections (so);
1329 catch (const gdb_exception_error &e)
1331 exception_fprintf (gdb_stderr, e,
1332 _ ("Error while mapping "
1333 "shared library sections:\n"));
1334 got_error = true;
1337 if (!got_error
1338 && (auto_solib_add || was_loaded || libpthread_solib_p (so)))
1339 solib_read_symbols (so, add_flags);
1344 static void
1345 reload_shared_libraries (const char *ignored, int from_tty,
1346 struct cmd_list_element *e)
1348 reload_shared_libraries_1 (from_tty);
1350 const solib_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
1352 /* Creating inferior hooks here has two purposes. First, if we reload
1353 shared libraries then the address of solib breakpoint we've computed
1354 previously might be no longer valid. For example, if we forgot to set
1355 solib-absolute-prefix and are setting it right now, then the previous
1356 breakpoint address is plain wrong. Second, installing solib hooks
1357 also implicitly figures were ld.so is and loads symbols for it.
1358 Absent this call, if we've just connected to a target and set
1359 solib-absolute-prefix or solib-search-path, we'll lose all information
1360 about ld.so. */
1361 if (target_has_execution ())
1363 /* Reset or free private data structures not associated with
1364 so_list entries. */
1365 if (ops->clear_solib != nullptr)
1366 ops->clear_solib (current_program_space);
1368 /* Remove any previous solib event breakpoint. This is usually
1369 done in common code, at breakpoint_init_inferior time, but
1370 we're not really starting up the inferior here. */
1371 remove_solib_event_breakpoints ();
1373 solib_create_inferior_hook (from_tty);
1376 /* Sometimes the platform-specific hook loads initial shared
1377 libraries, and sometimes it doesn't. If it doesn't FROM_TTY will be
1378 incorrectly 0 but such solib targets should be fixed anyway. If we
1379 made all the inferior hook methods consistent, this call could be
1380 removed. Call it only after the solib target has been initialized by
1381 solib_create_inferior_hook. */
1383 solib_add (NULL, 0, auto_solib_add);
1385 breakpoint_re_set ();
1387 /* We may have loaded or unloaded debug info for some (or all)
1388 shared libraries. However, frames may still reference them. For
1389 example, a frame's unwinder might still point at DWARF FDE
1390 structures that are now freed. Also, getting new symbols may
1391 change our opinion about what is frameless. */
1392 reinit_frame_cache ();
1395 /* Wrapper for reload_shared_libraries that replaces "remote:"
1396 at the start of gdb_sysroot with "target:". */
1398 static void
1399 gdb_sysroot_changed (const char *ignored, int from_tty,
1400 struct cmd_list_element *e)
1402 const char *old_prefix = "remote:";
1403 const char *new_prefix = TARGET_SYSROOT_PREFIX;
1405 if (startswith (gdb_sysroot.c_str (), old_prefix))
1407 static bool warning_issued = false;
1409 gdb_assert (strlen (old_prefix) == strlen (new_prefix));
1410 gdb_sysroot = new_prefix + gdb_sysroot.substr (strlen (old_prefix));
1412 if (!warning_issued)
1414 warning (_ ("\"%s\" is deprecated, use \"%s\" instead."), old_prefix,
1415 new_prefix);
1416 warning (_ ("sysroot set to \"%s\"."), gdb_sysroot.c_str ());
1418 warning_issued = true;
1422 reload_shared_libraries (ignored, from_tty, e);
1425 static void
1426 show_auto_solib_add (struct ui_file *file, int from_tty,
1427 struct cmd_list_element *c, const char *value)
1429 gdb_printf (file, _ ("Autoloading of shared library symbols is %s.\n"),
1430 value);
1433 /* Lookup the value for a specific symbol from dynamic symbol table. Look
1434 up symbol from ABFD. MATCH_SYM is a callback function to determine
1435 whether to pick up a symbol. DATA is the input of this callback
1436 function. Return 0 if symbol is not found. */
1438 CORE_ADDR
1439 gdb_bfd_lookup_symbol_from_symtab (
1440 bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym)
1442 long storage_needed = bfd_get_symtab_upper_bound (abfd);
1443 CORE_ADDR symaddr = 0;
1445 if (storage_needed > 0)
1447 unsigned int i;
1449 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1450 asymbol **symbol_table = storage.data ();
1451 unsigned int number_of_symbols
1452 = bfd_canonicalize_symtab (abfd, symbol_table);
1454 for (i = 0; i < number_of_symbols; i++)
1456 asymbol *sym = *symbol_table++;
1458 if (match_sym (sym))
1460 gdbarch *gdbarch = current_inferior ()->arch ();
1461 symaddr = sym->value;
1463 /* Some ELF targets fiddle with addresses of symbols they
1464 consider special. They use minimal symbols to do that
1465 and this is needed for correct breakpoint placement,
1466 but we do not have full data here to build a complete
1467 minimal symbol, so just set the address and let the
1468 targets cope with that. */
1469 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1470 && gdbarch_elf_make_msymbol_special_p (gdbarch))
1472 struct minimal_symbol msym
1476 msym.set_value_address (symaddr);
1477 gdbarch_elf_make_msymbol_special (gdbarch, sym, &msym);
1478 symaddr = CORE_ADDR (msym.unrelocated_address ());
1481 /* BFD symbols are section relative. */
1482 symaddr += sym->section->vma;
1483 break;
1488 return symaddr;
1491 /* See solib.h. */
1494 gdb_bfd_scan_elf_dyntag (const int desired_dyntag, bfd *abfd, CORE_ADDR *ptr,
1495 CORE_ADDR *ptr_addr)
1497 int arch_size, step;
1498 bfd_size_type sect_size;
1499 long current_dyntag;
1500 CORE_ADDR dyn_ptr, dyn_addr;
1501 gdb_byte *bufend, *bufstart, *buf;
1502 Elf32_External_Dyn *x_dynp_32;
1503 Elf64_External_Dyn *x_dynp_64;
1504 struct bfd_section *sect;
1506 if (abfd == NULL)
1507 return 0;
1509 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1510 return 0;
1512 arch_size = bfd_get_arch_size (abfd);
1513 if (arch_size == -1)
1514 return 0;
1516 /* Find the start address of the .dynamic section. */
1517 sect = bfd_get_section_by_name (abfd, ".dynamic");
1518 if (sect == NULL)
1519 return 0;
1521 bool found = false;
1522 for (const target_section &target_section :
1523 current_program_space->target_sections ())
1524 if (sect == target_section.the_bfd_section)
1526 dyn_addr = target_section.addr;
1527 found = true;
1528 break;
1530 if (!found)
1532 /* ABFD may come from OBJFILE acting only as a symbol file without being
1533 loaded into the target (see add_symbol_file_command). This case is
1534 such fallback to the file VMA address without the possibility of
1535 having the section relocated to its actual in-memory address. */
1537 dyn_addr = bfd_section_vma (sect);
1540 /* Read in .dynamic from the BFD. We will get the actual value
1541 from memory later. */
1542 sect_size = bfd_section_size (sect);
1543 gdb::byte_vector buffer (sect_size);
1544 buf = bufstart = buffer.data ();
1545 if (!bfd_get_section_contents (abfd, sect,
1546 buf, 0, sect_size))
1547 return 0;
1549 /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
1550 step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
1551 : sizeof (Elf64_External_Dyn);
1552 for (bufend = buf + sect_size; buf < bufend; buf += step)
1554 if (arch_size == 32)
1556 x_dynp_32 = (Elf32_External_Dyn *) buf;
1557 current_dyntag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
1558 dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
1560 else
1562 x_dynp_64 = (Elf64_External_Dyn *) buf;
1563 current_dyntag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
1564 dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
1566 if (current_dyntag == DT_NULL)
1567 return 0;
1568 if (current_dyntag == desired_dyntag)
1570 /* If requested, try to read the runtime value of this .dynamic
1571 entry. */
1572 if (ptr)
1574 struct type *ptr_type;
1575 gdb_byte ptr_buf[8];
1576 CORE_ADDR ptr_addr_1;
1578 ptr_type = builtin_type (current_inferior ()->arch ())
1579 ->builtin_data_ptr;
1580 ptr_addr_1 = dyn_addr + (buf - bufstart) + arch_size / 8;
1581 if (target_read_memory (ptr_addr_1, ptr_buf, arch_size / 8) == 0)
1582 dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
1583 *ptr = dyn_ptr;
1584 if (ptr_addr)
1585 *ptr_addr = dyn_addr + (buf - bufstart);
1587 return 1;
1591 return 0;
1594 /* See solib.h. */
1596 gdb::unique_xmalloc_ptr<char>
1597 gdb_bfd_read_elf_soname (const char *filename)
1599 gdb_bfd_ref_ptr abfd = gdb_bfd_open (filename, gnutarget);
1601 if (abfd == nullptr)
1602 return {};
1604 /* Check that ABFD is an ET_DYN ELF file. */
1605 if (!bfd_check_format (abfd.get (), bfd_object)
1606 || !(bfd_get_file_flags (abfd.get ()) & DYNAMIC))
1607 return {};
1609 CORE_ADDR idx;
1610 if (!gdb_bfd_scan_elf_dyntag (DT_SONAME, abfd.get (), &idx, nullptr))
1611 return {};
1613 struct bfd_section *dynstr
1614 = bfd_get_section_by_name (abfd.get (), ".dynstr");
1615 int sect_size = bfd_section_size (dynstr);
1616 if (dynstr == nullptr || sect_size <= idx)
1617 return {};
1619 /* Read soname from the string table. */
1620 gdb::byte_vector dynstr_buf;
1621 if (!gdb_bfd_get_full_section_contents (abfd.get (), dynstr, &dynstr_buf))
1622 return {};
1624 /* Ensure soname is null-terminated before returning a copy. */
1625 char *soname = (char *) dynstr_buf.data () + idx;
1626 if (strnlen (soname, sect_size - idx) == sect_size - idx)
1627 return {};
1629 return make_unique_xstrdup (soname);
1632 /* Lookup the value for a specific symbol from symbol table. Look up symbol
1633 from ABFD. MATCH_SYM is a callback function to determine whether to pick
1634 up a symbol. DATA is the input of this callback function. Return 0
1635 if symbol is not found. */
1637 static CORE_ADDR
1638 bfd_lookup_symbol_from_dyn_symtab (
1639 bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym)
1641 long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
1642 CORE_ADDR symaddr = 0;
1644 if (storage_needed > 0)
1646 unsigned int i;
1647 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1648 asymbol **symbol_table = storage.data ();
1649 unsigned int number_of_symbols
1650 = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
1652 for (i = 0; i < number_of_symbols; i++)
1654 asymbol *sym = *symbol_table++;
1656 if (match_sym (sym))
1658 /* BFD symbols are section relative. */
1659 symaddr = sym->value + sym->section->vma;
1660 break;
1664 return symaddr;
1667 /* Lookup the value for a specific symbol from symbol table and dynamic
1668 symbol table. Look up symbol from ABFD. MATCH_SYM is a callback
1669 function to determine whether to pick up a symbol. DATA is the
1670 input of this callback function. Return 0 if symbol is not
1671 found. */
1673 CORE_ADDR
1674 gdb_bfd_lookup_symbol (bfd *abfd,
1675 gdb::function_view<bool (const asymbol *)> match_sym)
1677 CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym);
1679 /* On FreeBSD, the dynamic linker is stripped by default. So we'll
1680 have to check the dynamic string table too. */
1681 if (symaddr == 0)
1682 symaddr = bfd_lookup_symbol_from_dyn_symtab (abfd, match_sym);
1684 return symaddr;
1687 /* The shared library list may contain user-loaded object files that
1688 can be removed out-of-band by the user. So upon notification of
1689 free_objfile remove all references to any user-loaded file that is
1690 about to be freed. */
1692 static void
1693 remove_user_added_objfile (struct objfile *objfile)
1695 if (objfile->flags & OBJF_USERLOADED)
1697 for (solib &so : objfile->pspace->solibs ())
1698 if (so.objfile == objfile)
1699 so.objfile = nullptr;
1703 void _initialize_solib ();
1705 void
1706 _initialize_solib ()
1708 gdb::observers::free_objfile.attach (remove_user_added_objfile, "solib");
1709 gdb::observers::inferior_execd.attach (
1710 [] (inferior *exec_inf, inferior *follow_inf) {
1711 solib_create_inferior_hook (0);
1713 "solib");
1715 add_com (
1716 "sharedlibrary", class_files, sharedlibrary_command,
1717 _ ("Load shared object library symbols for files matching REGEXP."));
1718 cmd_list_element *info_sharedlibrary_cmd
1719 = add_info ("sharedlibrary", info_sharedlibrary_command,
1720 _ ("Status of loaded shared object libraries."));
1721 add_info_alias ("dll", info_sharedlibrary_cmd, 1);
1722 add_com ("nosharedlibrary", class_files, no_shared_libraries,
1723 _ ("Unload all shared object library symbols."));
1725 add_setshow_boolean_cmd ("auto-solib-add", class_support, &auto_solib_add,
1726 _ ("\
1727 Set autoloading of shared library symbols."),
1728 _ ("\
1729 Show autoloading of shared library symbols."),
1730 _ ("\
1731 If \"on\", symbols from all shared object libraries will be loaded\n\
1732 automatically when the inferior begins execution, when the dynamic linker\n\
1733 informs gdb that a new library has been loaded, or when attaching to the\n\
1734 inferior. Otherwise, symbols must be loaded manually, using \
1735 `sharedlibrary'."),
1736 NULL, show_auto_solib_add, &setlist, &showlist);
1738 set_show_commands sysroot_cmds
1739 = add_setshow_optional_filename_cmd ("sysroot", class_support,
1740 &gdb_sysroot, _ ("\
1741 Set an alternate system root."),
1742 _ ("\
1743 Show the current system root."),
1744 _ ("\
1745 The system root is used to load absolute shared library symbol files.\n\
1746 For other (relative) files, you can add directories using\n\
1747 `set solib-search-path'."),
1748 gdb_sysroot_changed, NULL, &setlist,
1749 &showlist);
1751 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.set, class_support, 0,
1752 &setlist);
1753 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.show, class_support, 0,
1754 &showlist);
1756 add_setshow_optional_filename_cmd ("solib-search-path", class_support,
1757 &solib_search_path, _ ("\
1758 Set the search path for loading non-absolute shared library symbol files."),
1759 _ ("\
1760 Show the search path for loading non-absolute shared library symbol files."),
1761 _ ("\
1762 This takes precedence over the environment variables \
1763 PATH and LD_LIBRARY_PATH."),
1764 reload_shared_libraries,
1765 show_solib_search_path, &setlist,
1766 &showlist);
1768 add_setshow_boolean_cmd ("solib", class_maintenance, &debug_solib, _ ("\
1769 Set solib debugging."),
1770 _ ("\
1771 Show solib debugging."),
1772 _ ("\
1773 When true, solib-related debugging output is enabled."),
1774 nullptr, nullptr, &setdebuglist, &showdebuglist);