]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/solib.c
gdb: merge solib-frv aix-solib debug options into "set/show debug solib"
[thirdparty/binutils-gdb.git] / gdb / solib.c
CommitLineData
13437d4b 1/* Handle shared libraries for GDB, the GNU Debugger.
14a5e767 2
4a94e368 3 Copyright (C) 1990-2022 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 19
c906108c
SS
20#include "defs.h"
21
c906108c 22#include <sys/types.h>
c906108c 23#include <fcntl.h>
c906108c
SS
24#include "symtab.h"
25#include "bfd.h"
39f53acb 26#include "build-id.h"
c906108c
SS
27#include "symfile.h"
28#include "objfiles.h"
29#include "gdbcore.h"
30#include "command.h"
31#include "target.h"
32#include "frame.h"
d322d6d6 33#include "gdbsupport/gdb_regex.h"
c906108c 34#include "inferior.h"
268a13a5 35#include "gdbsupport/environ.h"
c906108c
SS
36#include "language.h"
37#include "gdbcmd.h"
fa58ee11 38#include "completer.h"
8ddf4645
AM
39#include "elf/external.h"
40#include "elf/common.h"
fe4e3eb8 41#include "filenames.h" /* for DOSish file names */
4646aa9d 42#include "exec.h"
13437d4b 43#include "solist.h"
76727919 44#include "observable.h"
e0eac551 45#include "readline/tilde.h"
f1838a98 46#include "remote.h"
2c0b251b 47#include "solib.h"
55333a84 48#include "interps.h"
ab38a727 49#include "filesystem.h"
cbb099e8 50#include "gdb_bfd.h"
268a13a5 51#include "gdbsupport/filestuff.h"
b91f93a0
AM
52#include "gdbsupport/scoped_fd.h"
53#include "debuginfod-support.h"
b46a8d7c 54#include "source.h"
e43b10e1 55#include "cli/cli-style.h"
5898c79a 56#include "solib-target.h"
c906108c 57
e26d0dab 58/* See solib.h. */
c906108c 59
e26d0dab 60bool debug_solib;
c906108c 61
c906108c
SS
62/* If non-empty, this is a search path for loading non-absolute shared library
63 symbol files. This takes precedence over the environment variables PATH
64 and LD_LIBRARY_PATH. */
e0700ba4 65static std::string solib_search_path;
920d2a44
AC
66static void
67show_solib_search_path (struct ui_file *file, int from_tty,
68 struct cmd_list_element *c, const char *value)
69{
6cb06a8c
TT
70 gdb_printf (file, _("The search path for loading non-absolute "
71 "shared library symbol files is %s.\n"),
72 value);
920d2a44 73}
c906108c 74
ab38a727
PA
75/* Same as HAVE_DOS_BASED_FILE_SYSTEM, but useable as an rvalue. */
76#if (HAVE_DOS_BASED_FILE_SYSTEM)
77# define DOS_BASED_FILE_SYSTEM 1
78#else
79# define DOS_BASED_FILE_SYSTEM 0
80#endif
81
797bc1cb
TT
82/* Return the full pathname of a binary file (the main executable or a
83 shared library file), or NULL if not found. If FD is non-NULL, *FD
84 is set to either -1 or an open file handle for the binary file.
e4f7b8c8 85
f822c95b 86 Global variable GDB_SYSROOT is used as a prefix directory
af1900b0 87 to search for binary files if they have an absolute path.
b57fbfba
GB
88 If GDB_SYSROOT starts with "target:" and target filesystem
89 is the local filesystem then the "target:" prefix will be
90 stripped before the search starts. This ensures that the
91 same search algorithm is used for local files regardless of
92 whether a "target:" prefix was used.
e4f7b8c8
MS
93
94 Global variable SOLIB_SEARCH_PATH is used as a prefix directory
95 (or set of directories, as in LD_LIBRARY_PATH) to search for all
b57fbfba 96 shared libraries if not found in either the sysroot (if set) or
af1900b0
GB
97 the local filesystem. SOLIB_SEARCH_PATH is not used when searching
98 for the main executable.
e4f7b8c8 99
c8c18e65 100 Search algorithm:
b57fbfba
GB
101 * If a sysroot is set and path is absolute:
102 * Search for sysroot/path.
c8c18e65
KW
103 * else
104 * Look for it literally (unmodified).
af1900b0
GB
105 * If IS_SOLIB is non-zero:
106 * Look in SOLIB_SEARCH_PATH.
107 * If available, use target defined search function.
b57fbfba 108 * If NO sysroot is set, perform the following two searches:
c8c18e65 109 * Look in inferior's $PATH.
af1900b0
GB
110 * If IS_SOLIB is non-zero:
111 * Look in inferior's $LD_LIBRARY_PATH.
ab38a727 112 *
85102364 113 * The last check avoids doing this search when targeting remote
b57fbfba 114 * machines since a sysroot will almost always be set.
7f86f058 115*/
e4f7b8c8 116
797bc1cb 117static gdb::unique_xmalloc_ptr<char>
5b89c67a 118solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
e4f7b8c8 119{
9e468e95 120 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
e4f7b8c8 121 int found_file = -1;
e0cc99a6 122 gdb::unique_xmalloc_ptr<char> temp_pathname;
ab38a727 123 const char *fskind = effective_target_file_system_kind ();
e0700ba4 124 const char *sysroot = gdb_sysroot.c_str ();
f8773be1 125 int prefix_len, orig_prefix_len;
08105857 126
a3be80c3
GB
127 /* If the absolute prefix starts with "target:" but the filesystem
128 accessed by the target_fileio_* methods is the local filesystem
129 then we strip the "target:" prefix now and work with the local
130 filesystem. This ensures that the same search algorithm is used
131 for all local files regardless of whether a "target:" prefix was
132 used. */
133 if (is_target_filename (sysroot) && target_filesystem_is_local ())
134 sysroot += strlen (TARGET_SYSROOT_PREFIX);
135
f8773be1
GB
136 /* Strip any trailing slashes from the absolute prefix. */
137 prefix_len = orig_prefix_len = strlen (sysroot);
f1d10cfb 138
f8773be1
GB
139 while (prefix_len > 0 && IS_DIR_SEPARATOR (sysroot[prefix_len - 1]))
140 prefix_len--;
f1d10cfb 141
9a897d43 142 std::string sysroot_holder;
f8773be1
GB
143 if (prefix_len == 0)
144 sysroot = NULL;
145 else if (prefix_len != orig_prefix_len)
146 {
9a897d43
TT
147 sysroot_holder = std::string (sysroot, prefix_len);
148 sysroot = sysroot_holder.c_str ();
ab38a727
PA
149 }
150
151 /* If we're on a non-DOS-based system, backslashes won't be
152 understood as directory separator, so, convert them to forward
153 slashes, iff we're supposed to handle DOS-based file system
154 semantics for target paths. */
155 if (!DOS_BASED_FILE_SYSTEM && fskind == file_system_kind_dos_based)
156 {
157 char *p;
158
159 /* Avoid clobbering our input. */
224c3ddb 160 p = (char *) alloca (strlen (in_pathname) + 1);
ab38a727
PA
161 strcpy (p, in_pathname);
162 in_pathname = p;
163
164 for (; *p; p++)
165 {
166 if (*p == '\\')
167 *p = '/';
168 }
169 }
170
171 /* Note, we're interested in IS_TARGET_ABSOLUTE_PATH, not
172 IS_ABSOLUTE_PATH. The latter is for host paths only, while
173 IN_PATHNAME is a target path. For example, if we're supposed to
174 be handling DOS-like semantics we want to consider a
175 'c:/foo/bar.dll' path as an absolute path, even on a Unix box.
176 With such a path, before giving up on the sysroot, we'll try:
177
178 1st attempt, c:/foo/bar.dll ==> /sysroot/c:/foo/bar.dll
179 2nd attempt, c:/foo/bar.dll ==> /sysroot/c/foo/bar.dll
180 3rd attempt, c:/foo/bar.dll ==> /sysroot/foo/bar.dll
181 */
182
b57fbfba 183 if (!IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname) || sysroot == NULL)
e0cc99a6 184 temp_pathname.reset (xstrdup (in_pathname));
ab38a727
PA
185 else
186 {
5b89c67a 187 bool need_dir_separator;
ab38a727 188
3736004f
PA
189 /* Concatenate the sysroot and the target reported filename. We
190 may need to glue them with a directory separator. Cases to
191 consider:
192
dda83cd7
SM
193 | sysroot | separator | in_pathname |
194 |-----------------+-----------+----------------|
195 | /some/dir | / | c:/foo/bar.dll |
196 | /some/dir | | /foo/bar.dll |
197 | target: | | c:/foo/bar.dll |
198 | target: | | /foo/bar.dll |
199 | target:some/dir | / | c:/foo/bar.dll |
200 | target:some/dir | | /foo/bar.dll |
3736004f
PA
201
202 IOW, we don't need to add a separator if IN_PATHNAME already
6471e7d2 203 has one, or when the sysroot is exactly "target:".
3736004f
PA
204 There's no need to check for drive spec explicitly, as we only
205 get here if IN_PATHNAME is considered an absolute path. */
206 need_dir_separator = !(IS_DIR_SEPARATOR (in_pathname[0])
2938e6cf 207 || strcmp (TARGET_SYSROOT_PREFIX, sysroot) == 0);
ab38a727 208
f1d10cfb 209 /* Cat the prefixed pathname together. */
e0cc99a6
TT
210 temp_pathname.reset (concat (sysroot,
211 need_dir_separator ? SLASH_STRING : "",
212 in_pathname, (char *) NULL));
e4f7b8c8
MS
213 }
214
2938e6cf 215 /* Handle files to be accessed via the target. */
e0cc99a6 216 if (is_target_filename (temp_pathname.get ()))
f1838a98 217 {
998d2a3e
GB
218 if (fd != NULL)
219 *fd = -1;
e0cc99a6 220 return temp_pathname;
f1838a98
UW
221 }
222
f1d10cfb 223 /* Now see if we can open it. */
13084383
SM
224 found_file = gdb_open_cloexec (temp_pathname.get (),
225 O_RDONLY | O_BINARY, 0).release ();
ab38a727
PA
226
227 /* If the search in gdb_sysroot failed, and the path name has a
228 drive spec (e.g, c:/foo), try stripping ':' from the drive spec,
229 and retrying in the sysroot:
230 c:/foo/bar.dll ==> /sysroot/c/foo/bar.dll. */
f1d10cfb 231
ab38a727 232 if (found_file < 0
b57fbfba 233 && sysroot != NULL
ab38a727
PA
234 && HAS_TARGET_DRIVE_SPEC (fskind, in_pathname))
235 {
5b89c67a 236 bool need_dir_separator = !IS_DIR_SEPARATOR (in_pathname[2]);
e0cc99a6 237 char drive[2] = { in_pathname[0], '\0' };
ab38a727 238
e0cc99a6
TT
239 temp_pathname.reset (concat (sysroot,
240 SLASH_STRING,
241 drive,
242 need_dir_separator ? SLASH_STRING : "",
243 in_pathname + 2, (char *) NULL));
ab38a727 244
e0cc99a6 245 found_file = gdb_open_cloexec (temp_pathname.get (),
13084383 246 O_RDONLY | O_BINARY, 0).release ();
ab38a727
PA
247 if (found_file < 0)
248 {
ab38a727
PA
249 /* If the search in gdb_sysroot still failed, try fully
250 stripping the drive spec, and trying once more in the
251 sysroot before giving up.
252
253 c:/foo/bar.dll ==> /sysroot/foo/bar.dll. */
254
e0cc99a6
TT
255 temp_pathname.reset (concat (sysroot,
256 need_dir_separator ? SLASH_STRING : "",
257 in_pathname + 2, (char *) NULL));
ab38a727 258
e0cc99a6 259 found_file = gdb_open_cloexec (temp_pathname.get (),
13084383 260 O_RDONLY | O_BINARY, 0).release ();
ab38a727
PA
261 }
262 }
0997b535 263
ab38a727
PA
264 /* We try to find the library in various ways. After each attempt,
265 either found_file >= 0 and temp_pathname is a malloc'd string, or
266 found_file < 0 and temp_pathname does not point to storage that
267 needs to be freed. */
268
269 if (found_file < 0)
e0cc99a6 270 temp_pathname.reset (NULL);
ab38a727 271
f822c95b 272 /* If the search in gdb_sysroot failed, and the path name is
ba5f0d88
OF
273 absolute at this point, make it relative. (openp will try and open the
274 file according to its absolute path otherwise, which is not what we want.)
275 Affects subsequent searches for this solib. */
ab38a727 276 if (found_file < 0 && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
ba5f0d88
OF
277 {
278 /* First, get rid of any drive letters etc. */
ab38a727
PA
279 while (!IS_TARGET_DIR_SEPARATOR (fskind, *in_pathname))
280 in_pathname++;
ba5f0d88
OF
281
282 /* Next, get rid of all leading dir separators. */
ab38a727
PA
283 while (IS_TARGET_DIR_SEPARATOR (fskind, *in_pathname))
284 in_pathname++;
ba5f0d88 285 }
ab38a727 286
af1900b0
GB
287 /* If not found, and we're looking for a solib, search the
288 solib_search_path (if any). */
e0700ba4
SM
289 if (is_solib && found_file < 0 && !solib_search_path.empty ())
290 found_file = openp (solib_search_path.c_str (),
492c0ab7 291 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
fbdebf46 292 in_pathname, O_RDONLY | O_BINARY, &temp_pathname);
ab38a727 293
af1900b0
GB
294 /* If not found, and we're looking for a solib, next search the
295 solib_search_path (if any) for the basename only (ignoring the
296 path). This is to allow reading solibs from a path that differs
297 from the opened path. */
e0700ba4
SM
298 if (is_solib && found_file < 0 && !solib_search_path.empty ())
299 found_file = openp (solib_search_path.c_str (),
492c0ab7 300 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH,
ab38a727
PA
301 target_lbasename (fskind, in_pathname),
302 O_RDONLY | O_BINARY, &temp_pathname);
e4f7b8c8 303
af1900b0
GB
304 /* If not found, and we're looking for a solib, try to use target
305 supplied solib search method. */
306 if (is_solib && found_file < 0 && ops->find_and_open_solib)
637d6690 307 found_file = ops->find_and_open_solib (in_pathname, O_RDONLY | O_BINARY,
66aba65d 308 &temp_pathname);
2610b0bf 309
c378eb4e 310 /* If not found, next search the inferior's $PATH environment variable. */
b57fbfba 311 if (found_file < 0 && sysroot == NULL)
9a6c7d9c 312 found_file = openp (current_inferior ()->environment.get ("PATH"),
492c0ab7
JK
313 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
314 O_RDONLY | O_BINARY, &temp_pathname);
e4f7b8c8 315
af1900b0
GB
316 /* If not found, and we're looking for a solib, next search the
317 inferior's $LD_LIBRARY_PATH environment variable. */
318 if (is_solib && found_file < 0 && sysroot == NULL)
9a6c7d9c
SDJ
319 found_file = openp (current_inferior ()->environment.get
320 ("LD_LIBRARY_PATH"),
492c0ab7
JK
321 OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname,
322 O_RDONLY | O_BINARY, &temp_pathname);
e4f7b8c8 323
998d2a3e
GB
324 if (fd == NULL)
325 {
326 if (found_file >= 0)
327 close (found_file);
328 }
329 else
330 *fd = found_file;
331
e0cc99a6 332 return temp_pathname;
572d275c
UW
333}
334
af1900b0 335/* Return the full pathname of the main executable, or NULL if not
797bc1cb
TT
336 found. If FD is non-NULL, *FD is set to either -1 or an open file
337 handle for the main executable. */
af1900b0 338
797bc1cb 339gdb::unique_xmalloc_ptr<char>
992f1ddc 340exec_file_find (const char *in_pathname, int *fd)
af1900b0 341{
797bc1cb 342 gdb::unique_xmalloc_ptr<char> result;
ecf45d2c
SL
343 const char *fskind = effective_target_file_system_kind ();
344
345 if (in_pathname == NULL)
346 return NULL;
af1900b0 347
e0700ba4 348 if (!gdb_sysroot.empty () && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
af1900b0 349 {
5b89c67a 350 result = solib_find_1 (in_pathname, fd, false);
af1900b0 351
ecf45d2c 352 if (result == NULL && fskind == file_system_kind_dos_based)
af1900b0
GB
353 {
354 char *new_pathname;
355
224c3ddb 356 new_pathname = (char *) alloca (strlen (in_pathname) + 5);
af1900b0
GB
357 strcpy (new_pathname, in_pathname);
358 strcat (new_pathname, ".exe");
359
5b89c67a 360 result = solib_find_1 (new_pathname, fd, false);
af1900b0
GB
361 }
362 }
ecf45d2c
SL
363 else
364 {
365 /* It's possible we don't have a full path, but rather just a
366 filename. Some targets, such as HP-UX, don't provide the
367 full path, sigh.
368
369 Attempt to qualify the filename against the source path.
370 (If that fails, we'll just fall back on the original
371 filename. Not much more we can do...) */
372
e0cc99a6 373 if (!source_full_path_of (in_pathname, &result))
797bc1cb 374 result.reset (xstrdup (in_pathname));
ecf45d2c
SL
375 if (fd != NULL)
376 *fd = -1;
377 }
af1900b0
GB
378
379 return result;
380}
381
382/* Return the full pathname of a shared library file, or NULL if not
797bc1cb
TT
383 found. If FD is non-NULL, *FD is set to either -1 or an open file
384 handle for the shared library.
af1900b0
GB
385
386 The search algorithm used is described in solib_find_1's comment
387 above. */
388
797bc1cb 389gdb::unique_xmalloc_ptr<char>
992f1ddc 390solib_find (const char *in_pathname, int *fd)
af1900b0
GB
391{
392 const char *solib_symbols_extension
393 = gdbarch_solib_symbols_extension (target_gdbarch ());
394
395 /* If solib_symbols_extension is set, replace the file's
396 extension. */
397 if (solib_symbols_extension != NULL)
398 {
992f1ddc 399 const char *p = in_pathname + strlen (in_pathname);
af1900b0
GB
400
401 while (p > in_pathname && *p != '.')
402 p--;
403
404 if (*p == '.')
405 {
406 char *new_pathname;
407
224c3ddb
SM
408 new_pathname
409 = (char *) alloca (p - in_pathname + 1
410 + strlen (solib_symbols_extension) + 1);
af1900b0
GB
411 memcpy (new_pathname, in_pathname, p - in_pathname + 1);
412 strcpy (new_pathname + (p - in_pathname) + 1,
413 solib_symbols_extension);
414
415 in_pathname = new_pathname;
416 }
417 }
418
5b89c67a 419 return solib_find_1 (in_pathname, fd, true);
af1900b0
GB
420}
421
572d275c
UW
422/* Open and return a BFD for the shared library PATHNAME. If FD is not -1,
423 it is used as file handle to open the file. Throws an error if the file
424 could not be opened. Handles both local and remote file access.
425
797bc1cb 426 If unsuccessful, the FD will be closed (unless FD was -1). */
572d275c 427
192b62ce 428gdb_bfd_ref_ptr
797bc1cb 429solib_bfd_fopen (const char *pathname, int fd)
572d275c 430{
192b62ce 431 gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd));
572d275c 432
192b62ce
TT
433 if (abfd != NULL && !gdb_bfd_has_target_filename (abfd.get ()))
434 bfd_set_cacheable (abfd.get (), 1);
f1838a98 435
192b62ce 436 if (abfd == NULL)
f1838a98 437 {
9a897d43 438 /* Arrange to free PATHNAME when the error is thrown. */
f1838a98 439 error (_("Could not open `%s' as an executable file: %s"),
572d275c 440 pathname, bfd_errmsg (bfd_get_error ()));
f1838a98
UW
441 }
442
520b0001 443 return abfd;
572d275c
UW
444}
445
446/* Find shared library PATHNAME and open a BFD for it. */
447
192b62ce 448gdb_bfd_ref_ptr
692d6f97 449solib_bfd_open (const char *pathname)
572d275c 450{
572d275c 451 int found_file;
378d2b72 452 const struct bfd_arch_info *b;
572d275c 453
572d275c 454 /* Search for shared library file. */
797bc1cb
TT
455 gdb::unique_xmalloc_ptr<char> found_pathname
456 = solib_find (pathname, &found_file);
572d275c 457 if (found_pathname == NULL)
048d532d
PA
458 {
459 /* Return failure if the file could not be found, so that we can
460 accumulate messages about missing libraries. */
461 if (errno == ENOENT)
462 return NULL;
463
464 perror_with_name (pathname);
465 }
572d275c
UW
466
467 /* Open bfd for shared library. */
797bc1cb 468 gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname.get (), found_file));
572d275c
UW
469
470 /* Check bfd format. */
192b62ce
TT
471 if (!bfd_check_format (abfd.get (), bfd_object))
472 error (_("`%s': not in executable format: %s"),
00f93c44 473 bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
f1838a98 474
378d2b72 475 /* Check bfd arch. */
f5656ead 476 b = gdbarch_bfd_arch_info (target_gdbarch ());
192b62ce 477 if (!b->compatible (b, bfd_get_arch_info (abfd.get ())))
c0e0d6bc
TT
478 error (_("`%s': Shared library architecture %s is not compatible "
479 "with target architecture %s."), bfd_get_filename (abfd.get ()),
480 bfd_get_arch_info (abfd.get ())->printable_name,
481 b->printable_name);
378d2b72 482
f1838a98 483 return abfd;
e4f7b8c8
MS
484}
485
39f53acb
AM
486/* Mapping of a core file's shared library sonames to their respective
487 build-ids. Added to the registries of core file bfds. */
488
489typedef std::unordered_map<std::string, std::string> soname_build_id_map;
490
491/* Key used to associate a soname_build_id_map to a core file bfd. */
492
08b8a139
TT
493static const struct registry<bfd>::key<soname_build_id_map>
494 cbfd_soname_build_id_data_key;
39f53acb
AM
495
496/* See solib.h. */
497
498void
499set_cbfd_soname_build_id (gdb_bfd_ref_ptr abfd,
500 const char *soname,
501 const bfd_build_id *build_id)
502{
503 gdb_assert (abfd.get () != nullptr);
504 gdb_assert (soname != nullptr);
505 gdb_assert (build_id != nullptr);
506
507 soname_build_id_map *mapptr = cbfd_soname_build_id_data_key.get (abfd.get ());
508
509 if (mapptr == nullptr)
510 mapptr = cbfd_soname_build_id_data_key.emplace (abfd.get ());
511
512 (*mapptr)[soname] = build_id_to_string (build_id);
513}
514
515/* See solib.h. */
516
517gdb::unique_xmalloc_ptr<char>
518get_cbfd_soname_build_id (gdb_bfd_ref_ptr abfd, const char *soname)
519{
520 if (abfd.get () == nullptr || soname == nullptr)
521 return {};
522
523 soname_build_id_map *mapptr
524 = cbfd_soname_build_id_data_key.get (abfd.get ());
525
526 if (mapptr == nullptr)
527 return {};
528
529 auto it = mapptr->find (lbasename (soname));
530 if (it == mapptr->end ())
531 return {};
532
533 return make_unique_xstrdup (it->second.c_str ());
534}
535
7f86f058
PA
536/* Given a pointer to one of the shared objects in our list of mapped
537 objects, use the recorded name to open a bfd descriptor for the
538 object, build a section table, relocate all the section addresses
539 by the base address at which the shared object was mapped, and then
540 add the sections to the target's section table.
e4f7b8c8 541
7f86f058
PA
542 FIXME: In most (all?) cases the shared object file name recorded in
543 the dynamic linkage tables will be a fully qualified pathname. For
c5aa993b
JM
544 cases where it isn't, do we really mimic the systems search
545 mechanism correctly in the below code (particularly the tilde
7f86f058 546 expansion stuff?). */
c906108c
SS
547
548static int
048d532d 549solib_map_sections (struct so_list *so)
c906108c 550{
9e468e95 551 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
c5aa993b 552
ee0c3293
TT
553 gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so->so_name));
554 gdb_bfd_ref_ptr abfd (ops->bfd_open (filename.get ()));
b91f93a0
AM
555 gdb::unique_xmalloc_ptr<char> build_id_hexstr
556 = get_cbfd_soname_build_id (current_program_space->cbfd, so->so_name);
557
558 /* If we already know the build-id of this solib from a core file, verify
559 it matches ABFD's build-id. If there is a mismatch or the solib wasn't
560 found, attempt to query debuginfod for the correct solib. */
561 if (build_id_hexstr.get () != nullptr)
562 {
563 bool mismatch = false;
564
565 if (abfd != nullptr && abfd->build_id != nullptr)
566 {
567 std::string build_id = build_id_to_string (abfd->build_id);
568
569 if (build_id != build_id_hexstr.get ())
570 mismatch = true;
571 }
572 if (abfd == nullptr || mismatch)
573 {
574 scoped_fd fd = debuginfod_exec_query ((const unsigned char*)
575 build_id_hexstr.get (),
576 0, so->so_name, &filename);
577
578 if (fd.get () >= 0)
579 abfd = ops->bfd_open (filename.get ());
580 else if (mismatch)
581 warning (_("Build-id of %ps does not match core file."),
582 styled_string (file_name_style.style (), filename.get ()));
583 }
584 }
e4f7b8c8 585
048d532d
PA
586 if (abfd == NULL)
587 return 0;
588
13437d4b 589 /* Leave bfd open, core_xfer_memory and "info files" need it. */
192b62ce 590 so->abfd = abfd.release ();
23e04971 591
b030cf11
JB
592 /* Copy the full path name into so_name, allowing symbol_file_add
593 to find it later. This also affects the =library-loaded GDB/MI
594 event, and in particular the part of that notification providing
595 the library's host-side path. If we let the target dictate
596 that objfile's path, and the target is different from the host,
597 GDB/MI will not provide the correct host-side path. */
192b62ce 598 if (strlen (bfd_get_filename (so->abfd)) >= SO_NAME_MAX_PATH_SIZE)
b030cf11 599 error (_("Shared library file name is too long."));
192b62ce 600 strcpy (so->so_name, bfd_get_filename (so->abfd));
b030cf11 601
bb2a6777
TT
602 if (so->sections == nullptr)
603 so->sections = new target_section_table;
2d128614 604 *so->sections = build_section_table (so->abfd);
104c1213 605
d7a78e5c 606 for (target_section &p : *so->sections)
104c1213 607 {
13437d4b 608 /* Relocate the section binding addresses as recorded in the shared
dda83cd7
SM
609 object's file by the base address to which the object was actually
610 mapped. */
bb2a6777 611 ops->relocate_section_addresses (so, &p);
cfa9d6d9
DJ
612
613 /* If the target didn't provide information about the address
614 range of the shared object, assume we want the location of
615 the .text section. */
616 if (so->addr_low == 0 && so->addr_high == 0
bb2a6777 617 && strcmp (p.the_bfd_section->name, ".text") == 0)
13437d4b 618 {
bb2a6777
TT
619 so->addr_low = p.addr;
620 so->addr_high = p.endaddr;
13437d4b 621 }
104c1213
JM
622 }
623
048d532d
PA
624 /* Add the shared object's sections to the current set of file
625 section tables. Do this immediately after mapping the object so
626 that later nodes in the list can query this object, as is needed
627 in solib-osf.c. */
3769e227 628 current_program_space->add_target_sections (so, *so->sections);
048d532d
PA
629
630 return 1;
104c1213 631}
c906108c 632
0892cb63
DE
633/* Free symbol-file related contents of SO and reset for possible reloading
634 of SO. If we have opened a BFD for SO, close it. If we have placed SO's
635 sections in some target's section table, the caller is responsible for
636 removing them.
a86988f2
PA
637
638 This function doesn't mess with objfiles at all. If there is an
639 objfile associated with SO that needs to be removed, the caller is
640 responsible for taking care of that. */
641
642static void
0892cb63 643clear_so (struct so_list *so)
a86988f2 644{
9e468e95 645 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
0892cb63 646
bb2a6777
TT
647 delete so->sections;
648 so->sections = NULL;
a86988f2
PA
649
650 gdb_bfd_unref (so->abfd);
651 so->abfd = NULL;
652
653 /* Our caller closed the objfile, possibly via objfile_purge_solibs. */
654 so->symbols_loaded = 0;
655 so->objfile = NULL;
656
657 so->addr_low = so->addr_high = 0;
658
659 /* Restore the target-supplied file name. SO_NAME may be the path
660 of the symbol file. */
661 strcpy (so->so_name, so->so_original_name);
0892cb63
DE
662
663 /* Do the same for target-specific data. */
664 if (ops->clear_so != NULL)
665 ops->clear_so (so);
a86988f2
PA
666}
667
7f86f058 668/* Free the storage associated with the `struct so_list' object SO.
c378eb4e 669 If we have opened a BFD for SO, close it.
c906108c 670
07cd4b97
JB
671 The caller is responsible for removing SO from whatever list it is
672 a member of. If we have placed SO's sections in some target's
673 section table, the caller is responsible for removing them.
c906108c 674
07cd4b97
JB
675 This function doesn't mess with objfiles at all. If there is an
676 objfile associated with SO that needs to be removed, the caller is
677 responsible for taking care of that. */
678
13437d4b 679void
07cd4b97 680free_so (struct so_list *so)
c906108c 681{
9e468e95 682 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
c5aa993b 683
0892cb63 684 clear_so (so);
66aba65d 685 ops->free_so (so);
07cd4b97 686
b8c9b27d 687 xfree (so);
c906108c
SS
688}
689
07cd4b97 690
7eedccfa 691/* Read in symbols for shared object SO. If SYMFILE_VERBOSE is set in FLAGS,
5b89c67a 692 be chatty about it. Return true if any symbols were actually loaded. */
42a6e6a0 693
5b89c67a 694bool
b15cc25c 695solib_read_symbols (struct so_list *so, symfile_add_flags flags)
42a6e6a0
MK
696{
697 if (so->symbols_loaded)
698 {
a86988f2 699 /* If needed, we've already warned in our caller. */
42a6e6a0 700 }
8bb75286
DJ
701 else if (so->abfd == NULL)
702 {
048d532d
PA
703 /* We've already warned about this library, when trying to open
704 it. */
8bb75286 705 }
42a6e6a0
MK
706 else
707 {
048d532d 708
7dcd53a0
TT
709 flags |= current_inferior ()->symfile_flags;
710
a70b8144 711 try
048d532d 712 {
048d532d 713 /* Have we already loaded this shared object? */
aed57c53 714 so->objfile = nullptr;
2030c079 715 for (objfile *objfile : current_program_space->objfiles ())
048d532d 716 {
aed57c53
TT
717 if (filename_cmp (objfile_name (objfile), so->so_name) == 0
718 && objfile->addr_low == so->addr_low)
719 {
720 so->objfile = objfile;
721 break;
722 }
048d532d 723 }
9c6595ab
PA
724 if (so->objfile == NULL)
725 {
37e136b1 726 section_addr_info sap
bb2a6777 727 = build_section_addr_info_from_section_table (*so->sections);
98badbfd
TT
728 gdb_bfd_ref_ptr tmp_bfd
729 (gdb_bfd_ref_ptr::new_reference (so->abfd));
730 so->objfile = symbol_file_add_from_bfd (tmp_bfd, so->so_name,
37e136b1
TT
731 flags, &sap,
732 OBJF_SHARED, NULL);
9c6595ab 733 so->objfile->addr_low = so->addr_low;
9c6595ab 734 }
492d29ea
PA
735
736 so->symbols_loaded = 1;
737 }
230d2906 738 catch (const gdb_exception_error &e)
492d29ea
PA
739 {
740 exception_fprintf (gdb_stderr, e, _("Error while reading shared"
741 " library symbols for %s:\n"),
742 so->so_name);
048d532d
PA
743 }
744
5b89c67a 745 return true;
42a6e6a0
MK
746 }
747
5b89c67a 748 return false;
42a6e6a0 749}
c906108c 750
a1fd1ac9
TT
751/* Return true if KNOWN->objfile is used by any other so_list object
752 in the list of shared libraries. Return false otherwise. */
59145f8c 753
5b89c67a 754static bool
59145f8c
AR
755solib_used (const struct so_list *const known)
756{
a1fd1ac9 757 for (const struct so_list *pivot : current_program_space->solibs ())
59145f8c 758 if (pivot != known && pivot->objfile == known->objfile)
5b89c67a
CB
759 return true;
760 return false;
59145f8c
AR
761}
762
51457a05 763/* See solib.h. */
c906108c 764
e696b3ad
MAL
765void
766update_solib_list (int from_tty)
07cd4b97 767{
9e468e95 768 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
66aba65d 769 struct so_list *inferior = ops->current_sos();
07cd4b97
JB
770 struct so_list *gdb, **gdb_link;
771
181e7f93
PA
772 /* We can reach here due to changing solib-search-path or the
773 sysroot, before having any inferior. */
55f6301a 774 if (target_has_execution () && inferior_ptid != null_ptid)
181e7f93
PA
775 {
776 struct inferior *inf = current_inferior ();
777
778 /* If we are attaching to a running process for which we
779 have not opened a symbol file, we may be able to get its
780 symbols now! */
a42d7dd8
TT
781 if (inf->attach_flag
782 && current_program_space->symfile_object_file == NULL)
bf469271 783 {
a70b8144 784 try
bf469271
PA
785 {
786 ops->open_symbol_file_object (from_tty);
787 }
230d2906 788 catch (const gdb_exception &ex)
bf469271
PA
789 {
790 exception_fprintf (gdb_stderr, ex,
791 "Error reading attached "
792 "process's symbol file.\n");
793 }
bf469271 794 }
181e7f93 795 }
104c1213 796
07cd4b97
JB
797 /* GDB and the inferior's dynamic linker each maintain their own
798 list of currently loaded shared objects; we want to bring the
799 former in sync with the latter. Scan both lists, seeing which
800 shared objects appear where. There are three cases:
801
802 - A shared object appears on both lists. This means that GDB
105b175f
JB
803 knows about it already, and it's still loaded in the inferior.
804 Nothing needs to happen.
07cd4b97
JB
805
806 - A shared object appears only on GDB's list. This means that
105b175f
JB
807 the inferior has unloaded it. We should remove the shared
808 object from GDB's tables.
07cd4b97
JB
809
810 - A shared object appears only on the inferior's list. This
105b175f
JB
811 means that it's just been loaded. We should add it to GDB's
812 tables.
07cd4b97
JB
813
814 So we walk GDB's list, checking each entry to see if it appears
815 in the inferior's list too. If it does, no action is needed, and
816 we remove it from the inferior's list. If it doesn't, the
817 inferior has unloaded it, and we remove it from GDB's list. By
818 the time we're done walking GDB's list, the inferior's list
819 contains only the new shared objects, which we then add. */
820
a1fd1ac9
TT
821 gdb = current_program_space->so_list;
822 gdb_link = &current_program_space->so_list;
07cd4b97 823 while (gdb)
c906108c 824 {
07cd4b97
JB
825 struct so_list *i = inferior;
826 struct so_list **i_link = &inferior;
827
828 /* Check to see whether the shared object *gdb also appears in
829 the inferior's current list. */
830 while (i)
c906108c 831 {
a7c02bc8
VP
832 if (ops->same)
833 {
834 if (ops->same (gdb, i))
835 break;
836 }
837 else
838 {
0ba1096a 839 if (! filename_cmp (gdb->so_original_name, i->so_original_name))
a7c02bc8
VP
840 break;
841 }
07cd4b97
JB
842
843 i_link = &i->next;
844 i = *i_link;
c906108c 845 }
c5aa993b 846
07cd4b97 847 /* If the shared object appears on the inferior's list too, then
dda83cd7
SM
848 it's still loaded, so we don't need to do anything. Delete
849 it from the inferior's list, and leave it on GDB's list. */
07cd4b97 850 if (i)
c906108c 851 {
07cd4b97 852 *i_link = i->next;
07cd4b97
JB
853 free_so (i);
854 gdb_link = &gdb->next;
855 gdb = *gdb_link;
856 }
857
858 /* If it's not on the inferior's list, remove it from GDB's tables. */
859 else
860 {
42a6e6a0
MK
861 /* Notify any observer that the shared object has been
862 unloaded before we remove it from GDB's tables. */
76727919 863 gdb::observers::solib_unloaded.notify (gdb);
84acb35a 864
6fb16ce6 865 current_program_space->deleted_solibs.push_back (gdb->so_name);
edcc5120 866
07cd4b97 867 *gdb_link = gdb->next;
07cd4b97
JB
868
869 /* Unless the user loaded it explicitly, free SO's objfile. */
59145f8c
AR
870 if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED)
871 && !solib_used (gdb))
268e4f09 872 gdb->objfile->unlink ();
07cd4b97
JB
873
874 /* Some targets' section tables might be referring to
875 sections from so->abfd; remove them. */
2a3f84af 876 current_program_space->remove_target_sections (gdb);
07cd4b97
JB
877
878 free_so (gdb);
879 gdb = *gdb_link;
c906108c
SS
880 }
881 }
c5aa993b 882
07cd4b97
JB
883 /* Now the inferior's list contains only shared objects that don't
884 appear in GDB's list --- those that are newly loaded. Add them
e8930304 885 to GDB's shared object list. */
07cd4b97 886 if (inferior)
c906108c 887 {
048d532d
PA
888 int not_found = 0;
889 const char *not_found_filename = NULL;
890
07cd4b97
JB
891 struct so_list *i;
892
893 /* Add the new shared objects to GDB's list. */
894 *gdb_link = inferior;
895
e8930304 896 /* Fill in the rest of each of the `struct so_list' nodes. */
07cd4b97 897 for (i = inferior; i; i = i->next)
c906108c 898 {
048d532d 899
6c95b8df 900 i->pspace = current_program_space;
bcb430e4 901 current_program_space->added_solibs.push_back (i);
07cd4b97 902
a70b8144 903 try
048d532d
PA
904 {
905 /* Fill in the rest of the `struct so_list' node. */
906 if (!solib_map_sections (i))
907 {
908 not_found++;
909 if (not_found_filename == NULL)
910 not_found_filename = i->so_original_name;
911 }
912 }
07cd4b97 913
230d2906 914 catch (const gdb_exception_error &e)
492d29ea
PA
915 {
916 exception_fprintf (gdb_stderr, e,
917 _("Error while mapping shared "
918 "library sections:\n"));
919 }
42a6e6a0
MK
920
921 /* Notify any observer that the shared object has been
048d532d 922 loaded now that we've added it to GDB's tables. */
76727919 923 gdb::observers::solib_loaded.notify (i);
c906108c 924 }
048d532d
PA
925
926 /* If a library was not found, issue an appropriate warning
927 message. We have to use a single call to warning in case the
928 front end does something special with warnings, e.g., pop up
929 a dialog box. It Would Be Nice if we could get a "warning: "
930 prefix on each line in the CLI front end, though - it doesn't
931 stand out well. */
932
933 if (not_found == 1)
3e43a32a
MS
934 warning (_("Could not load shared library symbols for %s.\n"
935 "Do you need \"set solib-search-path\" "
936 "or \"set sysroot\"?"),
048d532d
PA
937 not_found_filename);
938 else if (not_found > 1)
939 warning (_("\
940Could not load shared library symbols for %d libraries, e.g. %s.\n\
941Use the \"info sharedlibrary\" command to see the complete listing.\n\
942Do you need \"set solib-search-path\" or \"set sysroot\"?"),
943 not_found, not_found_filename);
e8930304 944 }
105b175f
JB
945}
946
17a37d48
PP
947
948/* Return non-zero if NAME is the libpthread shared library.
6612ad7f
JB
949
950 Uses a fairly simplistic heuristic approach where we check
951 the file name against "/libpthread". This can lead to false
e2b9ea4b
KB
952 positives, but this should be good enough in practice.
953
954 As of glibc-2.34, functions formerly residing in libpthread have
955 been moved to libc, so "/libc." needs to be checked too. (Matching
956 the "." will avoid matching libraries such as libcrypt.) */
6612ad7f 957
5b89c67a 958bool
17a37d48
PP
959libpthread_name_p (const char *name)
960{
e2b9ea4b
KB
961 return (strstr (name, "/libpthread") != NULL
962 || strstr (name, "/libc.") != NULL );
17a37d48
PP
963}
964
965/* Return non-zero if SO is the libpthread shared library. */
966
5b89c67a 967static bool
6612ad7f
JB
968libpthread_solib_p (struct so_list *so)
969{
17a37d48 970 return libpthread_name_p (so->so_name);
6612ad7f 971}
105b175f 972
7f86f058 973/* Read in symbolic information for any shared objects whose names
105b175f
JB
974 match PATTERN. (If we've already read a shared object's symbol
975 info, leave it alone.) If PATTERN is zero, read them all.
976
990f9fe3
FF
977 If READSYMS is 0, defer reading symbolic information until later
978 but still do any needed low level processing.
979
e696b3ad 980 FROM_TTY is described for update_solib_list, above. */
105b175f
JB
981
982void
e696b3ad 983solib_add (const char *pattern, int from_tty, int readsyms)
105b175f 984{
770e7fc7
DE
985 if (print_symbol_loading_p (from_tty, 0, 0))
986 {
987 if (pattern != NULL)
988 {
6cb06a8c
TT
989 gdb_printf (_("Loading symbols for shared libraries: %s\n"),
990 pattern);
770e7fc7
DE
991 }
992 else
6cb06a8c 993 gdb_printf (_("Loading symbols for shared libraries.\n"));
770e7fc7
DE
994 }
995
2eff07b3
PP
996 current_program_space->solib_add_generation++;
997
105b175f
JB
998 if (pattern)
999 {
1000 char *re_err = re_comp (pattern);
1001
1002 if (re_err)
8a3fe4f8 1003 error (_("Invalid regexp: %s"), re_err);
105b175f
JB
1004 }
1005
e696b3ad 1006 update_solib_list (from_tty);
c906108c 1007
105b175f
JB
1008 /* Walk the list of currently loaded shared libraries, and read
1009 symbols for any that match the pattern --- or any whose symbols
1010 aren't already loaded, if no pattern was given. */
e8930304 1011 {
5b89c67a
CB
1012 bool any_matches = false;
1013 bool loaded_any_symbols = false;
b15cc25c
PA
1014 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
1015
1016 if (from_tty)
dda83cd7 1017 add_flags |= SYMFILE_VERBOSE;
c906108c 1018
a1fd1ac9 1019 for (struct so_list *gdb : current_program_space->solibs ())
e8930304
JB
1020 if (! pattern || re_exec (gdb->so_name))
1021 {
dda83cd7
SM
1022 /* Normally, we would read the symbols from that library
1023 only if READSYMS is set. However, we're making a small
1024 exception for the pthread library, because we sometimes
1025 need the library symbols to be loaded in order to provide
1026 thread support (x86-linux for instance). */
1027 const int add_this_solib =
1028 (readsyms || libpthread_solib_p (gdb));
6612ad7f 1029
5b89c67a 1030 any_matches = true;
a86988f2
PA
1031 if (add_this_solib)
1032 {
1033 if (gdb->symbols_loaded)
1034 {
1035 /* If no pattern was given, be quiet for shared
1036 libraries we have already loaded. */
1037 if (pattern && (from_tty || info_verbose))
6cb06a8c
TT
1038 gdb_printf (_("Symbols already loaded for %s\n"),
1039 gdb->so_name);
a86988f2 1040 }
b15cc25c 1041 else if (solib_read_symbols (gdb, add_flags))
5b89c67a 1042 loaded_any_symbols = true;
a86988f2 1043 }
e8930304
JB
1044 }
1045
7eedccfa
PP
1046 if (loaded_any_symbols)
1047 breakpoint_re_set ();
1048
e8930304 1049 if (from_tty && pattern && ! any_matches)
6cb06a8c 1050 gdb_printf
e8930304
JB
1051 ("No loaded shared libraries match the pattern `%s'.\n", pattern);
1052
1053 if (loaded_any_symbols)
1054 {
1055 /* Getting new symbols may change our opinion about what is
1056 frameless. */
1057 reinit_frame_cache ();
e8930304
JB
1058 }
1059 }
c906108c
SS
1060}
1061
7f86f058
PA
1062/* Implement the "info sharedlibrary" command. Walk through the
1063 shared library list and print information about each attached
1064 library matching PATTERN. If PATTERN is elided, print them
1065 all. */
c906108c
SS
1066
1067static void
1d12d88f 1068info_sharedlibrary_command (const char *pattern, int from_tty)
c906108c 1069{
5b89c67a 1070 bool so_missing_debug_info = false;
c906108c 1071 int addr_width;
55333a84 1072 int nr_libs;
f5656ead 1073 struct gdbarch *gdbarch = target_gdbarch ();
79a45e25 1074 struct ui_out *uiout = current_uiout;
55333a84
DE
1075
1076 if (pattern)
1077 {
1078 char *re_err = re_comp (pattern);
1079
1080 if (re_err)
1081 error (_("Invalid regexp: %s"), re_err);
1082 }
c906108c 1083
84eb3c4f 1084 /* "0x", a little whitespace, and two hex digits per byte of pointers. */
55333a84 1085 addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
c906108c 1086
e696b3ad 1087 update_solib_list (from_tty);
07cd4b97 1088
4a2b031d
TT
1089 /* ui_out_emit_table table_emitter needs to know the number of rows,
1090 so we need to make two passes over the libs. */
55333a84 1091
a1fd1ac9
TT
1092 nr_libs = 0;
1093 for (struct so_list *so : current_program_space->solibs ())
c906108c 1094 {
c5aa993b 1095 if (so->so_name[0])
c906108c 1096 {
55333a84
DE
1097 if (pattern && ! re_exec (so->so_name))
1098 continue;
1099 ++nr_libs;
1100 }
1101 }
1102
4a2b031d
TT
1103 {
1104 ui_out_emit_table table_emitter (uiout, 4, nr_libs, "SharedLibraryTable");
55333a84 1105
4a2b031d
TT
1106 /* The "- 1" is because ui_out adds one space between columns. */
1107 uiout->table_header (addr_width - 1, ui_left, "from", "From");
1108 uiout->table_header (addr_width - 1, ui_left, "to", "To");
1109 uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
1110 uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
55333a84 1111
4a2b031d 1112 uiout->table_body ();
55333a84 1113
a1fd1ac9 1114 for (struct so_list *so : current_program_space->solibs ())
4a2b031d
TT
1115 {
1116 if (! so->so_name[0])
1117 continue;
1118 if (pattern && ! re_exec (so->so_name))
1119 continue;
1120
1121 ui_out_emit_tuple tuple_emitter (uiout, "lib");
1122
1123 if (so->addr_high != 0)
1124 {
1125 uiout->field_core_addr ("from", gdbarch, so->addr_low);
1126 uiout->field_core_addr ("to", gdbarch, so->addr_high);
1127 }
1128 else
1129 {
1130 uiout->field_skip ("from");
1131 uiout->field_skip ("to");
1132 }
1133
29f94340 1134 if (! top_level_interpreter ()->interp_ui_out ()->is_mi_like_p ()
4a2b031d
TT
1135 && so->symbols_loaded
1136 && !objfile_has_symbols (so->objfile))
1137 {
5b89c67a 1138 so_missing_debug_info = true;
4a2b031d
TT
1139 uiout->field_string ("syms-read", "Yes (*)");
1140 }
1141 else
1142 uiout->field_string ("syms-read", so->symbols_loaded ? "Yes" : "No");
1143
e43b10e1 1144 uiout->field_string ("name", so->so_name, file_name_style.style ());
4a2b031d
TT
1145
1146 uiout->text ("\n");
1147 }
1148 }
55333a84
DE
1149
1150 if (nr_libs == 0)
1151 {
1152 if (pattern)
112e8700 1153 uiout->message (_("No shared libraries matched.\n"));
55333a84 1154 else
112e8700 1155 uiout->message (_("No shared libraries loaded at this time.\n"));
55333a84
DE
1156 }
1157 else
c906108c 1158 {
55333a84 1159 if (so_missing_debug_info)
112e8700 1160 uiout->message (_("(*): Shared library is missing "
3e43a32a 1161 "debugging information.\n"));
c906108c
SS
1162 }
1163}
1164
5b89c67a 1165/* See solib.h. */
5fd1a349 1166
5b89c67a 1167bool
5fd1a349
PP
1168solib_contains_address_p (const struct so_list *const solib,
1169 CORE_ADDR address)
1170{
76547ab3
TV
1171 if (solib->sections == nullptr)
1172 return false;
1173
d7a78e5c 1174 for (target_section &p : *solib->sections)
bb2a6777 1175 if (p.addr <= address && address < p.endaddr)
5b89c67a 1176 return true;
5fd1a349 1177
5b89c67a 1178 return false;
5fd1a349
PP
1179}
1180
7f86f058
PA
1181/* If ADDRESS is in a shared lib in program space PSPACE, return its
1182 name.
c906108c 1183
7f86f058
PA
1184 Provides a hook for other gdb routines to discover whether or not a
1185 particular address is within the mapped address space of a shared
1186 library.
c906108c 1187
c5aa993b
JM
1188 For example, this routine is called at one point to disable
1189 breakpoints which are in shared libraries that are not currently
7f86f058 1190 mapped in. */
c906108c 1191
6d08aed3 1192const char *
6c95b8df 1193solib_name_from_address (struct program_space *pspace, CORE_ADDR address)
c906108c 1194{
6c95b8df 1195 struct so_list *so = NULL;
c5aa993b 1196
6c95b8df 1197 for (so = pspace->so_list; so; so = so->next)
5fd1a349
PP
1198 if (solib_contains_address_p (so, address))
1199 return (so->so_name);
07cd4b97 1200
c906108c
SS
1201 return (0);
1202}
1203
5b89c67a 1204/* See solib.h. */
de18c1d8 1205
5b89c67a 1206bool
de18c1d8
JM
1207solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
1208{
9e468e95 1209 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
de18c1d8
JM
1210
1211 if (ops->keep_data_in_core)
5b89c67a 1212 return ops->keep_data_in_core (vaddr, size) != 0;
de18c1d8 1213 else
5b89c67a 1214 return false;
de18c1d8
JM
1215}
1216
c906108c
SS
1217/* Called by free_all_symtabs */
1218
c5aa993b 1219void
fba45db2 1220clear_solib (void)
c906108c 1221{
9e468e95 1222 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
66aba65d 1223
1736a7bd 1224 disable_breakpoints_in_shlibs ();
085dd6e6 1225
a1fd1ac9 1226 while (current_program_space->so_list)
c906108c 1227 {
a1fd1ac9 1228 struct so_list *so = current_program_space->so_list;
433759f7 1229
a1fd1ac9 1230 current_program_space->so_list = so->next;
76727919 1231 gdb::observers::solib_unloaded.notify (so);
2a3f84af 1232 current_program_space->remove_target_sections (so);
07cd4b97 1233 free_so (so);
c906108c 1234 }
07cd4b97 1235
66aba65d 1236 ops->clear_solib ();
c906108c
SS
1237}
1238
7f86f058
PA
1239/* Shared library startup support. When GDB starts up the inferior,
1240 it nurses it along (through the shell) until it is ready to execute
1241 its first instruction. At this point, this function gets
1242 called. */
c5aa993b
JM
1243
1244void
268a4a75 1245solib_create_inferior_hook (int from_tty)
c906108c 1246{
9e468e95 1247 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
433759f7 1248
268a4a75 1249 ops->solib_create_inferior_hook (from_tty);
c906108c
SS
1250}
1251
5b89c67a 1252/* See solib.h. */
d7fa2ae2 1253
5b89c67a 1254bool
d7fa2ae2
KB
1255in_solib_dynsym_resolve_code (CORE_ADDR pc)
1256{
9e468e95 1257 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
433759f7 1258
5b89c67a 1259 return ops->in_dynsym_resolve_code (pc) != 0;
d7fa2ae2 1260}
c906108c 1261
7f86f058 1262/* Implements the "sharedlibrary" command. */
c906108c
SS
1263
1264static void
0b39b52e 1265sharedlibrary_command (const char *args, int from_tty)
c906108c
SS
1266{
1267 dont_repeat ();
e696b3ad 1268 solib_add (args, from_tty, 1);
c906108c
SS
1269}
1270
7f86f058 1271/* Implements the command "nosharedlibrary", which discards symbols
cb0ba49e
MS
1272 that have been auto-loaded from shared libraries. Symbols from
1273 shared libraries that were added by explicit request of the user
1274 are not discarded. Also called from remote.c. */
1275
c60a7562 1276void
0b39b52e 1277no_shared_libraries (const char *ignored, int from_tty)
c60a7562 1278{
a3247a22
PP
1279 /* The order of the two routines below is important: clear_solib notifies
1280 the solib_unloaded observers, and some of these observers might need
1281 access to their associated objfiles. Therefore, we can not purge the
1282 solibs' objfiles before clear_solib has been called. */
1283
615b9dba 1284 clear_solib ();
a3247a22 1285 objfile_purge_solibs ();
c60a7562 1286}
c906108c 1287
f9e14852
GB
1288/* See solib.h. */
1289
1290void
1291update_solib_breakpoints (void)
1292{
9e468e95 1293 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
f9e14852
GB
1294
1295 if (ops->update_breakpoints != NULL)
1296 ops->update_breakpoints ();
1297}
1298
1299/* See solib.h. */
1300
1301void
1302handle_solib_event (void)
1303{
9e468e95 1304 const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ());
f9e14852
GB
1305
1306 if (ops->handle_event != NULL)
1307 ops->handle_event ();
1308
e39fb971 1309 current_inferior ()->pspace->clear_solib_cache ();
f9e14852
GB
1310
1311 /* Check for any newly added shared libraries if we're supposed to
1312 be adding them automatically. Switch terminal for any messages
1313 produced by breakpoint_re_set. */
223ffa71 1314 target_terminal::ours_for_output ();
e696b3ad 1315 solib_add (NULL, 0, auto_solib_add);
223ffa71 1316 target_terminal::inferior ();
f9e14852
GB
1317}
1318
a86988f2
PA
1319/* Reload shared libraries, but avoid reloading the same symbol file
1320 we already have loaded. */
1321
1322static void
1323reload_shared_libraries_1 (int from_tty)
1324{
770e7fc7 1325 if (print_symbol_loading_p (from_tty, 0, 0))
6cb06a8c 1326 gdb_printf (_("Loading symbols for shared libraries.\n"));
770e7fc7 1327
a1fd1ac9 1328 for (struct so_list *so : current_program_space->solibs ())
a86988f2 1329 {
b16c44de 1330 const char *found_pathname = NULL;
5b89c67a 1331 bool was_loaded = so->symbols_loaded != 0;
b15cc25c
PA
1332 symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
1333
1334 if (from_tty)
1335 add_flags |= SYMFILE_VERBOSE;
a86988f2 1336
ee0c3293
TT
1337 gdb::unique_xmalloc_ptr<char> filename
1338 (tilde_expand (so->so_original_name));
1339 gdb_bfd_ref_ptr abfd (solib_bfd_open (filename.get ()));
a86988f2 1340 if (abfd != NULL)
ee0c3293 1341 found_pathname = bfd_get_filename (abfd.get ());
a86988f2
PA
1342
1343 /* If this shared library is no longer associated with its previous
1344 symbol file, close that. */
1345 if ((found_pathname == NULL && was_loaded)
1346 || (found_pathname != NULL
0ba1096a 1347 && filename_cmp (found_pathname, so->so_name) != 0))
a86988f2 1348 {
59145f8c
AR
1349 if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
1350 && !solib_used (so))
268e4f09 1351 so->objfile->unlink ();
2a3f84af 1352 current_program_space->remove_target_sections (so);
0892cb63 1353 clear_so (so);
a86988f2
PA
1354 }
1355
1356 /* If this shared library is now associated with a new symbol
1357 file, open it. */
1358 if (found_pathname != NULL
1359 && (!was_loaded
0ba1096a 1360 || filename_cmp (found_pathname, so->so_name) != 0))
a86988f2 1361 {
5b89c67a 1362 bool got_error = false;
a86988f2 1363
a70b8144 1364 try
492d29ea
PA
1365 {
1366 solib_map_sections (so);
1367 }
1368
230d2906 1369 catch (const gdb_exception_error &e)
492d29ea
PA
1370 {
1371 exception_fprintf (gdb_stderr, e,
1372 _("Error while mapping "
1373 "shared library sections:\n"));
5b89c67a 1374 got_error = true;
492d29ea 1375 }
a86988f2 1376
492d29ea
PA
1377 if (!got_error
1378 && (auto_solib_add || was_loaded || libpthread_solib_p (so)))
b15cc25c 1379 solib_read_symbols (so, add_flags);
a86988f2
PA
1380 }
1381 }
a86988f2
PA
1382}
1383
cf466558 1384static void
eb4c3f4a 1385reload_shared_libraries (const char *ignored, int from_tty,
f397e303 1386 struct cmd_list_element *e)
cf466558 1387{
3641da11 1388 const struct target_so_ops *ops;
a86988f2
PA
1389
1390 reload_shared_libraries_1 (from_tty);
1391
9e468e95 1392 ops = gdbarch_so_ops (target_gdbarch ());
a86988f2 1393
c378eb4e 1394 /* Creating inferior hooks here has two purposes. First, if we reload
c8fa6cdd
VP
1395 shared libraries then the address of solib breakpoint we've computed
1396 previously might be no longer valid. For example, if we forgot to set
1397 solib-absolute-prefix and are setting it right now, then the previous
1398 breakpoint address is plain wrong. Second, installing solib hooks
1399 also implicitly figures were ld.so is and loads symbols for it.
1400 Absent this call, if we've just connected to a target and set
1401 solib-absolute-prefix or solib-search-path, we'll lose all information
1402 about ld.so. */
55f6301a 1403 if (target_has_execution ())
c8fa6cdd 1404 {
a86988f2
PA
1405 /* Reset or free private data structures not associated with
1406 so_list entries. */
1407 ops->clear_solib ();
1408
1409 /* Remove any previous solib event breakpoint. This is usually
1410 done in common code, at breakpoint_init_inferior time, but
1411 we're not really starting up the inferior here. */
1412 remove_solib_event_breakpoints ();
1413
268a4a75 1414 solib_create_inferior_hook (from_tty);
c8fa6cdd 1415 }
268a4a75
JK
1416
1417 /* Sometimes the platform-specific hook loads initial shared
1418 libraries, and sometimes it doesn't. If it doesn't FROM_TTY will be
1419 incorrectly 0 but such solib targets should be fixed anyway. If we
1420 made all the inferior hook methods consistent, this call could be
1421 removed. Call it only after the solib target has been initialized by
1422 solib_create_inferior_hook. */
1423
e696b3ad 1424 solib_add (NULL, 0, auto_solib_add);
268a4a75 1425
a86988f2
PA
1426 breakpoint_re_set ();
1427
1428 /* We may have loaded or unloaded debug info for some (or all)
1429 shared libraries. However, frames may still reference them. For
1430 example, a frame's unwinder might still point at DWARF FDE
1431 structures that are now freed. Also, getting new symbols may
1432 change our opinion about what is frameless. */
c8fa6cdd 1433 reinit_frame_cache ();
cf466558
KB
1434}
1435
2938e6cf
GB
1436/* Wrapper for reload_shared_libraries that replaces "remote:"
1437 at the start of gdb_sysroot with "target:". */
1438
1439static void
eb4c3f4a 1440gdb_sysroot_changed (const char *ignored, int from_tty,
2938e6cf
GB
1441 struct cmd_list_element *e)
1442{
1443 const char *old_prefix = "remote:";
1444 const char *new_prefix = TARGET_SYSROOT_PREFIX;
1445
e0700ba4 1446 if (startswith (gdb_sysroot.c_str (), old_prefix))
2938e6cf 1447 {
5b89c67a 1448 static bool warning_issued = false;
2938e6cf
GB
1449
1450 gdb_assert (strlen (old_prefix) == strlen (new_prefix));
e0700ba4 1451 gdb_sysroot = new_prefix + gdb_sysroot.substr (strlen (old_prefix));
2938e6cf
GB
1452
1453 if (!warning_issued)
1454 {
1455 warning (_("\"%s\" is deprecated, use \"%s\" instead."),
1456 old_prefix, new_prefix);
e0700ba4 1457 warning (_("sysroot set to \"%s\"."), gdb_sysroot.c_str ());
2938e6cf 1458
5b89c67a 1459 warning_issued = true;
2938e6cf
GB
1460 }
1461 }
1462
1463 reload_shared_libraries (ignored, from_tty, e);
1464}
1465
920d2a44
AC
1466static void
1467show_auto_solib_add (struct ui_file *file, int from_tty,
1468 struct cmd_list_element *c, const char *value)
1469{
6cb06a8c
TT
1470 gdb_printf (file, _("Autoloading of shared library symbols is %s.\n"),
1471 value);
920d2a44
AC
1472}
1473
1474
cb457ae2
YQ
1475/* Lookup the value for a specific symbol from dynamic symbol table. Look
1476 up symbol from ABFD. MATCH_SYM is a callback function to determine
1477 whether to pick up a symbol. DATA is the input of this callback
1478 function. Return NULL if symbol is not found. */
1479
1480CORE_ADDR
1481gdb_bfd_lookup_symbol_from_symtab (bfd *abfd,
3953f15c
SM
1482 int (*match_sym) (const asymbol *,
1483 const void *),
1484 const void *data)
cb457ae2
YQ
1485{
1486 long storage_needed = bfd_get_symtab_upper_bound (abfd);
1487 CORE_ADDR symaddr = 0;
1488
1489 if (storage_needed > 0)
1490 {
1491 unsigned int i;
1492
1cb1f3da
TT
1493 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1494 asymbol **symbol_table = storage.data ();
cb457ae2
YQ
1495 unsigned int number_of_symbols =
1496 bfd_canonicalize_symtab (abfd, symbol_table);
1497
1498 for (i = 0; i < number_of_symbols; i++)
1499 {
1500 asymbol *sym = *symbol_table++;
1501
1502 if (match_sym (sym, data))
1503 {
3e29f34a
MR
1504 struct gdbarch *gdbarch = target_gdbarch ();
1505 symaddr = sym->value;
1506
1507 /* Some ELF targets fiddle with addresses of symbols they
dda83cd7
SM
1508 consider special. They use minimal symbols to do that
1509 and this is needed for correct breakpoint placement,
1510 but we do not have full data here to build a complete
1511 minimal symbol, so just set the address and let the
1512 targets cope with that. */
3e29f34a
MR
1513 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1514 && gdbarch_elf_make_msymbol_special_p (gdbarch))
1515 {
eefba3da 1516 struct minimal_symbol msym {};
3e29f34a 1517
4aeddc50 1518 msym.set_value_address (symaddr);
3e29f34a 1519 gdbarch_elf_make_msymbol_special (gdbarch, sym, &msym);
4aeddc50 1520 symaddr = msym.value_raw_address ();
3e29f34a
MR
1521 }
1522
cb457ae2 1523 /* BFD symbols are section relative. */
3e29f34a 1524 symaddr += sym->section->vma;
cb457ae2
YQ
1525 break;
1526 }
1527 }
cb457ae2
YQ
1528 }
1529
1530 return symaddr;
1531}
1532
8ddf4645
AM
1533/* See solib.h. */
1534
1535int
1536gdb_bfd_scan_elf_dyntag (const int desired_dyntag, bfd *abfd, CORE_ADDR *ptr,
1537 CORE_ADDR *ptr_addr)
1538{
1539 int arch_size, step, sect_size;
1540 long current_dyntag;
1541 CORE_ADDR dyn_ptr, dyn_addr;
1542 gdb_byte *bufend, *bufstart, *buf;
1543 Elf32_External_Dyn *x_dynp_32;
1544 Elf64_External_Dyn *x_dynp_64;
1545 struct bfd_section *sect;
1546
1547 if (abfd == NULL)
1548 return 0;
1549
1550 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1551 return 0;
1552
1553 arch_size = bfd_get_arch_size (abfd);
1554 if (arch_size == -1)
1555 return 0;
1556
1557 /* Find the start address of the .dynamic section. */
1558 sect = bfd_get_section_by_name (abfd, ".dynamic");
1559 if (sect == NULL)
1560 return 0;
1561
1562 bool found = false;
1563 for (const target_section &target_section
1564 : current_program_space->target_sections ())
1565 if (sect == target_section.the_bfd_section)
1566 {
1567 dyn_addr = target_section.addr;
1568 found = true;
1569 break;
1570 }
1571 if (!found)
1572 {
1573 /* ABFD may come from OBJFILE acting only as a symbol file without being
1574 loaded into the target (see add_symbol_file_command). This case is
1575 such fallback to the file VMA address without the possibility of
1576 having the section relocated to its actual in-memory address. */
1577
1578 dyn_addr = bfd_section_vma (sect);
1579 }
1580
1581 /* Read in .dynamic from the BFD. We will get the actual value
1582 from memory later. */
1583 sect_size = bfd_section_size (sect);
1584 buf = bufstart = (gdb_byte *) alloca (sect_size);
1585 if (!bfd_get_section_contents (abfd, sect,
1586 buf, 0, sect_size))
1587 return 0;
1588
1589 /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
1590 step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
1591 : sizeof (Elf64_External_Dyn);
1592 for (bufend = buf + sect_size;
1593 buf < bufend;
1594 buf += step)
1595 {
1596 if (arch_size == 32)
1597 {
1598 x_dynp_32 = (Elf32_External_Dyn *) buf;
1599 current_dyntag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
1600 dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
1601 }
1602 else
1603 {
1604 x_dynp_64 = (Elf64_External_Dyn *) buf;
1605 current_dyntag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
1606 dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr);
1607 }
1608 if (current_dyntag == DT_NULL)
1609 return 0;
1610 if (current_dyntag == desired_dyntag)
1611 {
1612 /* If requested, try to read the runtime value of this .dynamic
1613 entry. */
1614 if (ptr)
1615 {
1616 struct type *ptr_type;
1617 gdb_byte ptr_buf[8];
1618 CORE_ADDR ptr_addr_1;
1619
1620 ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
1621 ptr_addr_1 = dyn_addr + (buf - bufstart) + arch_size / 8;
1622 if (target_read_memory (ptr_addr_1, ptr_buf, arch_size / 8) == 0)
1623 dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
1624 *ptr = dyn_ptr;
1625 if (ptr_addr)
1626 *ptr_addr = dyn_addr + (buf - bufstart);
1627 }
1628 return 1;
1629 }
1630 }
1631
1632 return 0;
1633}
1634
39f53acb
AM
1635/* See solib.h. */
1636
1637gdb::unique_xmalloc_ptr<char>
1638gdb_bfd_read_elf_soname (const char *filename)
1639{
1640 gdb_bfd_ref_ptr abfd = gdb_bfd_open (filename, gnutarget);
1641
1642 if (abfd == nullptr)
1643 return {};
1644
1645 /* Check that ABFD is an ET_DYN ELF file. */
1646 if (!bfd_check_format (abfd.get (), bfd_object)
1647 || !(bfd_get_file_flags (abfd.get ()) & DYNAMIC))
1648 return {};
1649
1650 CORE_ADDR idx;
1651 if (!gdb_bfd_scan_elf_dyntag (DT_SONAME, abfd.get (), &idx, nullptr))
1652 return {};
1653
1654 struct bfd_section *dynstr = bfd_get_section_by_name (abfd.get (), ".dynstr");
1655 int sect_size = bfd_section_size (dynstr);
1656 if (dynstr == nullptr || sect_size <= idx)
1657 return {};
1658
1659 /* Read soname from the string table. */
1660 gdb::byte_vector dynstr_buf;
1661 if (!gdb_bfd_get_full_section_contents (abfd.get (), dynstr, &dynstr_buf))
1662 return {};
1663
1664 /* Ensure soname is null-terminated before returning a copy. */
1665 char *soname = (char *) dynstr_buf.data () + idx;
1666 if (strnlen (soname, sect_size - idx) == sect_size - idx)
1667 return {};
1668
1669 return make_unique_xstrdup (soname);
1670}
1671
cb457ae2
YQ
1672/* Lookup the value for a specific symbol from symbol table. Look up symbol
1673 from ABFD. MATCH_SYM is a callback function to determine whether to pick
1674 up a symbol. DATA is the input of this callback function. Return NULL
1675 if symbol is not found. */
1676
1677static CORE_ADDR
1678bfd_lookup_symbol_from_dyn_symtab (bfd *abfd,
3953f15c
SM
1679 int (*match_sym) (const asymbol *,
1680 const void *),
1681 const void *data)
cb457ae2
YQ
1682{
1683 long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
1684 CORE_ADDR symaddr = 0;
1685
1686 if (storage_needed > 0)
1687 {
1688 unsigned int i;
1cb1f3da
TT
1689 gdb::def_vector<asymbol *> storage (storage_needed / sizeof (asymbol *));
1690 asymbol **symbol_table = storage.data ();
cb457ae2
YQ
1691 unsigned int number_of_symbols =
1692 bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
1693
1694 for (i = 0; i < number_of_symbols; i++)
1695 {
1696 asymbol *sym = *symbol_table++;
1697
1698 if (match_sym (sym, data))
1699 {
1700 /* BFD symbols are section relative. */
1701 symaddr = sym->value + sym->section->vma;
1702 break;
1703 }
1704 }
cb457ae2
YQ
1705 }
1706 return symaddr;
1707}
1708
1709/* Lookup the value for a specific symbol from symbol table and dynamic
1710 symbol table. Look up symbol from ABFD. MATCH_SYM is a callback
1711 function to determine whether to pick up a symbol. DATA is the
1712 input of this callback function. Return NULL if symbol is not
1713 found. */
1714
1715CORE_ADDR
1716gdb_bfd_lookup_symbol (bfd *abfd,
3953f15c
SM
1717 int (*match_sym) (const asymbol *, const void *),
1718 const void *data)
cb457ae2
YQ
1719{
1720 CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym, data);
1721
1722 /* On FreeBSD, the dynamic linker is stripped by default. So we'll
1723 have to check the dynamic string table too. */
1724 if (symaddr == 0)
1725 symaddr = bfd_lookup_symbol_from_dyn_symtab (abfd, match_sym, data);
1726
1727 return symaddr;
1728}
3a40aaa0 1729
a1fd1ac9
TT
1730/* The shared library list may contain user-loaded object files that
1731 can be removed out-of-band by the user. So upon notification of
1732 free_objfile remove all references to any user-loaded file that is
1733 about to be freed. */
63644780
NB
1734
1735static void
1736remove_user_added_objfile (struct objfile *objfile)
1737{
63644780
NB
1738 if (objfile != 0 && objfile->flags & OBJF_USERLOADED)
1739 {
a1fd1ac9 1740 for (struct so_list *so : current_program_space->solibs ())
63644780
NB
1741 if (so->objfile == objfile)
1742 so->objfile = NULL;
1743 }
1744}
1745
6c265988 1746void _initialize_solib ();
c906108c 1747void
6c265988 1748_initialize_solib ()
c906108c 1749{
c90e7d63
SM
1750 gdb::observers::free_objfile.attach (remove_user_added_objfile,
1751 "solib");
42a4fec5
SM
1752 gdb::observers::inferior_execd.attach ([] (inferior *inf)
1753 {
1754 solib_create_inferior_hook (0);
c90e7d63 1755 }, "solib");
63644780 1756
c906108c 1757 add_com ("sharedlibrary", class_files, sharedlibrary_command,
1bedd215 1758 _("Load shared object library symbols for files matching REGEXP."));
e0f25bd9
SM
1759 cmd_list_element *info_sharedlibrary_cmd
1760 = add_info ("sharedlibrary", info_sharedlibrary_command,
1761 _("Status of loaded shared object libraries."));
1762 add_info_alias ("dll", info_sharedlibrary_cmd, 1);
c60a7562 1763 add_com ("nosharedlibrary", class_files, no_shared_libraries,
1bedd215 1764 _("Unload all shared object library symbols."));
c906108c 1765
5bf193a2
AC
1766 add_setshow_boolean_cmd ("auto-solib-add", class_support,
1767 &auto_solib_add, _("\
1768Set autoloading of shared library symbols."), _("\
1769Show autoloading of shared library symbols."), _("\
b7209cb4
FF
1770If \"on\", symbols from all shared object libraries will be loaded\n\
1771automatically when the inferior begins execution, when the dynamic linker\n\
1772informs gdb that a new library has been loaded, or when attaching to the\n\
3e43a32a
MS
1773inferior. Otherwise, symbols must be loaded manually, using \
1774`sharedlibrary'."),
5bf193a2 1775 NULL,
920d2a44 1776 show_auto_solib_add,
5bf193a2 1777 &setlist, &showlist);
c906108c 1778
5e84b7ee
SM
1779 set_show_commands sysroot_cmds
1780 = add_setshow_optional_filename_cmd ("sysroot", class_support,
1781 &gdb_sysroot, _("\
f822c95b
DJ
1782Set an alternate system root."), _("\
1783Show the current system root."), _("\
1784The system root is used to load absolute shared library symbol files.\n\
1785For other (relative) files, you can add directories using\n\
1786`set solib-search-path'."),
5e84b7ee
SM
1787 gdb_sysroot_changed,
1788 NULL,
1789 &setlist, &showlist);
c906108c 1790
5e84b7ee 1791 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.set, class_support, 0,
f822c95b 1792 &setlist);
5e84b7ee 1793 add_alias_cmd ("solib-absolute-prefix", sysroot_cmds.show, class_support, 0,
f822c95b 1794 &showlist);
030292b7 1795
525226b5
AC
1796 add_setshow_optional_filename_cmd ("solib-search-path", class_support,
1797 &solib_search_path, _("\
3e43a32a
MS
1798Set the search path for loading non-absolute shared library symbol files."),
1799 _("\
1800Show the search path for loading non-absolute shared library symbol files."),
1801 _("\
1802This takes precedence over the environment variables \
1803PATH and LD_LIBRARY_PATH."),
525226b5 1804 reload_shared_libraries,
920d2a44 1805 show_solib_search_path,
525226b5 1806 &setlist, &showlist);
e26d0dab
SM
1807
1808 add_setshow_boolean_cmd ("solib", class_maintenance,
1809 &debug_solib, _("\
1810Set solib debugging."), _("\
1811Show solib debugging."), _("\
1812When true, solib-related debugging output is enabled."),
1813 nullptr, nullptr,
1814 &setdebuglist, &showdebuglist);
c906108c 1815}