Bug Summary

File:src/gnu/usr.bin/binutils/gdb/solib.c
Warning:line 248, column 10
1st function call argument is an uninitialized value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name solib.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/binutils/obj/gdb -resource-dir /usr/local/lib/clang/13.0.0 -D PIE_DEFAULT=1 -I . -I /usr/src/gnu/usr.bin/binutils/gdb -I /usr/src/gnu/usr.bin/binutils/gdb/config -D LOCALEDIR="/usr/share/locale" -D HAVE_CONFIG_H -I /usr/src/gnu/usr.bin/binutils/gdb/../include/opcode -I ../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../bfd -I /usr/src/gnu/usr.bin/binutils/gdb/../include -I ../intl -I /usr/src/gnu/usr.bin/binutils/gdb/../intl -D MI_OUT=1 -D TUI=1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/gnu/usr.bin/binutils/obj/gdb -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -fcommon -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/gnu/usr.bin/binutils/gdb/solib.c
1/* Handle shared libraries for GDB, the GNU Debugger.
2
3 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23#include "defs.h"
24
25#include <sys/types.h>
26#include <fcntl.h>
27#include "gdb_string.h"
28#include "symtab.h"
29#include "bfd.h"
30#include "symfile.h"
31#include "objfiles.h"
32#include "gdbcore.h"
33#include "command.h"
34#include "target.h"
35#include "frame.h"
36#include "gdb_regex.h"
37#include "inferior.h"
38#include "environ.h"
39#include "language.h"
40#include "gdbcmd.h"
41#include "completer.h"
42#include "filenames.h" /* for DOSish file names */
43#include "exec.h"
44#include "solist.h"
45#include "observer.h"
46#include "readline/readline.h"
47
48/* external data declarations */
49
50/* FIXME: gdbarch needs to control this variable */
51struct target_so_ops *current_target_so_ops;
52
53/* local data declarations */
54
55static struct so_list *so_list_head; /* List of known shared objects */
56
57static int solib_cleanup_queued = 0; /* make_run_cleanup called */
58
59/* Local function prototypes */
60
61static void do_clear_solib (void *);
62
63/* If non-zero, this is a prefix that will be added to the front of the name
64 shared libraries with an absolute filename for loading. */
65static char *solib_absolute_prefix = NULL((void*)0);
66
67/* If non-empty, this is a search path for loading non-absolute shared library
68 symbol files. This takes precedence over the environment variables PATH
69 and LD_LIBRARY_PATH. */
70static char *solib_search_path = NULL((void*)0);
71
72void add_to_target_sections (int, struct target_ops *, struct so_list *);
73
74/*
75
76 GLOBAL FUNCTION
77
78 solib_open -- Find a shared library file and open it.
79
80 SYNOPSIS
81
82 int solib_open (char *in_patname, char **found_pathname);
83
84 DESCRIPTION
85
86 Global variable SOLIB_ABSOLUTE_PREFIX is used as a prefix directory
87 to search for shared libraries if they have an absolute path.
88
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 SOLIB_ABSOLUTE_PREFIX.
92
93 Search algorithm:
94 * If there is a solib_absolute_prefix and path is absolute:
95 * Search for solib_absolute_prefix/path.
96 * else
97 * Look for it literally (unmodified).
98 * Look in SOLIB_SEARCH_PATH.
99 * If available, use target defined search function.
100 * If solib_absolute_prefix is NOT set, perform the following two searches:
101 * Look in inferior's $PATH.
102 * Look in inferior's $LD_LIBRARY_PATH.
103 *
104 * The last check avoids doing this search when targetting remote
105 * machines since solib_absolute_prefix will almost always be set.
106
107 RETURNS
108
109 file handle for opened solib, or -1 for failure. */
110
111int
112solib_open (char *in_pathname, char **found_pathname)
113{
114 int found_file = -1;
115 char *temp_pathname = NULL((void*)0);
116 char *p = in_pathname;
117
118 while (*p && !IS_DIR_SEPARATOR (*p)((*p) == '/'))
3
Assuming the condition is false
119 p++;
120
121 if (*p)
4
Taking false branch
122 {
123 if (! IS_ABSOLUTE_PATH (in_pathname)((((in_pathname)[0]) == '/')) || solib_absolute_prefix == NULL((void*)0))
124 temp_pathname = in_pathname;
125 else
126 {
127 int prefix_len = strlen (solib_absolute_prefix);
128
129 /* Remove trailing slashes from absolute prefix. */
130 while (prefix_len > 0
131 && IS_DIR_SEPARATOR (solib_absolute_prefix[prefix_len - 1])((solib_absolute_prefix[prefix_len - 1]) == '/'))
132 prefix_len--;
133
134 /* Cat the prefixed pathname together. */
135 temp_pathname = alloca (prefix_len + strlen (in_pathname) + 1)__builtin_alloca(prefix_len + strlen (in_pathname) + 1);
136 strncpy (temp_pathname, solib_absolute_prefix, prefix_len);
137 temp_pathname[prefix_len] = '\0';
138 strcat (temp_pathname, in_pathname);
139 }
140
141 /* Now see if we can open it. */
142 found_file = open (temp_pathname, O_RDONLY0x0000, 0);
143 }
144
145 /* If the search in solib_absolute_prefix failed, and the path name is
146 absolute at this point, make it relative. (openp will try and open the
147 file according to its absolute path otherwise, which is not what we want.)
148 Affects subsequent searches for this solib. */
149 if (found_file
4.1
'found_file' is < 0
< 0 && IS_ABSOLUTE_PATH (in_pathname)((((in_pathname)[0]) == '/')))
5
Taking false branch
150 {
151 /* First, get rid of any drive letters etc. */
152 while (!IS_DIR_SEPARATOR (*in_pathname)((*in_pathname) == '/'))
153 in_pathname++;
154
155 /* Next, get rid of all leading dir separators. */
156 while (IS_DIR_SEPARATOR (*in_pathname)((*in_pathname) == '/'))
157 in_pathname++;
158 }
159
160 /* If not found, search the solib_search_path (if any). */
161 if (found_file
5.1
'found_file' is < 0
< 0 && solib_search_path != NULL((void*)0))
6
Assuming 'solib_search_path' is not equal to NULL
7
Taking true branch
162 found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST0x01,
163 in_pathname, O_RDONLY0x0000, 0, &temp_pathname);
164
165 /* If not found, next search the solib_search_path (if any) for the basename
166 only (ignoring the path). This is to allow reading solibs from a path
167 that differs from the opened path. */
168 if (found_file < 0 && solib_search_path != NULL((void*)0))
8
Assuming 'found_file' is >= 0
169 found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST0x01,
170 lbasename (in_pathname), O_RDONLY0x0000, 0,
171 &temp_pathname);
172
173 /* If not found, try to use target supplied solib search method */
174 if (found_file
8.1
'found_file' is >= 0
< 0 && TARGET_SO_FIND_AND_OPEN_SOLIB(current_target_so_ops->find_and_open_solib) != NULL((void*)0))
175 found_file = TARGET_SO_FIND_AND_OPEN_SOLIB(current_target_so_ops->find_and_open_solib)
176 (in_pathname, O_RDONLY0x0000, &temp_pathname);
177
178 /* If not found, next search the inferior's $PATH environment variable. */
179 if (found_file
8.2
'found_file' is >= 0
< 0 && solib_absolute_prefix == NULL((void*)0))
180 found_file = openp (get_in_environ (inferior_environ, "PATH"),
181 OPF_TRY_CWD_FIRST0x01, in_pathname, O_RDONLY0x0000, 0,
182 &temp_pathname);
183
184 /* If not found, next search the inferior's $LD_LIBRARY_PATH
185 environment variable. */
186 if (found_file
8.3
'found_file' is >= 0
< 0 && solib_absolute_prefix == NULL((void*)0))
187 found_file = openp (get_in_environ (inferior_environ, "LD_LIBRARY_PATH"),
188 OPF_TRY_CWD_FIRST0x01, in_pathname, O_RDONLY0x0000, 0,
189 &temp_pathname);
190
191 /* Done. If not found, tough luck. Return found_file and
192 (optionally) found_pathname. */
193 if (found_pathname
8.4
'found_pathname' is not equal to NULL
!= NULL((void*)0) && temp_pathname != NULL((void*)0))
9
Assuming 'temp_pathname' is equal to NULL
10
Taking false branch
194 *found_pathname = xstrdup (temp_pathname);
195 return found_file;
11
Returning without writing to '*found_pathname'
196}
197
198
199/*
200
201 LOCAL FUNCTION
202
203 solib_map_sections -- open bfd and build sections for shared lib
204
205 SYNOPSIS
206
207 static int solib_map_sections (struct so_list *so)
208
209 DESCRIPTION
210
211 Given a pointer to one of the shared objects in our list
212 of mapped objects, use the recorded name to open a bfd
213 descriptor for the object, build a section table, and then
214 relocate all the section addresses by the base address at
215 which the shared object was mapped.
216
217 FIXMES
218
219 In most (all?) cases the shared object file name recorded in the
220 dynamic linkage tables will be a fully qualified pathname. For
221 cases where it isn't, do we really mimic the systems search
222 mechanism correctly in the below code (particularly the tilde
223 expansion stuff?).
224 */
225
226static int
227solib_map_sections (void *arg)
228{
229 struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
230 char *filename;
231 char *scratch_pathname;
1
'scratch_pathname' declared without an initial value
232 int scratch_chan;
233 struct section_table *p;
234 struct cleanup *old_chain;
235 bfd *abfd;
236
237 filename = tilde_expand (so->so_name);
238
239 old_chain = make_cleanup (xfree, filename);
240 scratch_chan = solib_open (filename, &scratch_pathname);
2
Calling 'solib_open'
12
Returning from 'solib_open'
241
242 if (scratch_chan
12.1
'scratch_chan' is >= 0
< 0)
13
Taking false branch
243 {
244 perror_with_name (filename);
245 }
246
247 /* Leave scratch_pathname allocated. abfd->name will point to it. */
248 abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
14
1st function call argument is an uninitialized value
249 if (!abfd)
250 {
251 close (scratch_chan);
252 error ("Could not open `%s' as an executable file: %s",
253 scratch_pathname, bfd_errmsg (bfd_get_error ()));
254 }
255
256 /* Leave bfd open, core_xfer_memory and "info files" need it. */
257 so->abfd = abfd;
258 bfd_set_cacheable (abfd, 1)(((abfd)->cacheable = 1), 1);
259
260 /* copy full path name into so_name, so that later symbol_file_add
261 can find it */
262 if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE512)
263 error ("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure.");
264 strcpy (so->so_name, scratch_pathname);
265
266 if (!bfd_check_format (abfd, bfd_object))
267 {
268 error ("\"%s\": not in executable format: %s.",
269 scratch_pathname, bfd_errmsg (bfd_get_error ()));
270 }
271 if (build_section_table (abfd, &so->sections, &so->sections_end))
272 {
273 error ("Can't find the file sections in `%s': %s",
274 bfd_get_filename (abfd)((char *) (abfd)->filename), bfd_errmsg (bfd_get_error ()));
275 }
276
277 for (p = so->sections; p < so->sections_end; p++)
278 {
279 /* Relocate the section binding addresses as recorded in the shared
280 object's file by the base address to which the object was actually
281 mapped. */
282 TARGET_SO_RELOCATE_SECTION_ADDRESSES(current_target_so_ops->relocate_section_addresses) (so, p);
283 if (strcmp (p->the_bfd_section->name, ".text") == 0)
284 {
285 so->textsection = p;
286 }
287 }
288
289 /* Free the file names, close the file now. */
290 do_cleanups (old_chain);
291
292 return (1);
293}
294
295/* LOCAL FUNCTION
296
297 free_so --- free a `struct so_list' object
298
299 SYNOPSIS
300
301 void free_so (struct so_list *so)
302
303 DESCRIPTION
304
305 Free the storage associated with the `struct so_list' object SO.
306 If we have opened a BFD for SO, close it.
307
308 The caller is responsible for removing SO from whatever list it is
309 a member of. If we have placed SO's sections in some target's
310 section table, the caller is responsible for removing them.
311
312 This function doesn't mess with objfiles at all. If there is an
313 objfile associated with SO that needs to be removed, the caller is
314 responsible for taking care of that. */
315
316void
317free_so (struct so_list *so)
318{
319 char *bfd_filename = 0;
320
321 if (so->sections)
322 xfree (so->sections);
323
324 if (so->abfd)
325 {
326 bfd_filename = bfd_get_filename (so->abfd)((char *) (so->abfd)->filename);
327 if (! bfd_close (so->abfd))
328 warning ("cannot close \"%s\": %s",
329 bfd_filename, bfd_errmsg (bfd_get_error ()));
330 }
331
332 if (bfd_filename)
333 xfree (bfd_filename);
334
335 TARGET_SO_FREE_SO(current_target_so_ops->free_so) (so);
336
337 xfree (so);
338}
339
340
341/* Return address of first so_list entry in master shared object list. */
342struct so_list *
343master_so_list (void)
344{
345 return so_list_head;
346}
347
348
349/* A small stub to get us past the arg-passing pinhole of catch_errors. */
350
351static int
352symbol_add_stub (void *arg)
353{
354 struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
355 struct section_addr_info *sap;
356
357 /* Have we already loaded this shared object? */
358 ALL_OBJFILES (so->objfile)for ((so->objfile) = object_files; (so->objfile) != ((void
*)0); (so->objfile) = (so->objfile)->next)
359 {
360 /* Found an already loaded shared library. */
361 if (strcmp (so->objfile->name, so->so_name) == 0
362 && !so->main)
363 return 1;
364 /* Found an already loaded main executable. This could happen in
365 two circumstances.
366 First case: the main file has already been read in
367 as the first thing that gdb does at startup, and the file
368 hasn't been relocated properly yet. Therefor we need to read
369 it in with the proper section info.
370 Second case: it has been read in with the correct relocation,
371 and therefore we need to skip it. */
372 if (strcmp (so->objfile->name, so->so_name) == 0
373 && so->main
374 && so->main_relocated)
375 return 1;
376 }
377
378 sap = build_section_addr_info_from_section_table (so->sections,
379 so->sections_end);
380
381 if (so->main)
382 {
383 so->objfile = symbol_file_add (so->so_name, /*so->from_tty*/ 0,
384 sap, 1, 0);
385 so->main_relocated = 1;
386 }
387 else
388 so->objfile = symbol_file_add (so->so_name, so->from_tty,
389 sap, 0, OBJF_SHARED(1 << 3));
390
391 free_section_addr_info (sap);
392
393 return (1);
394}
395
396/* Read in symbols for shared object SO. If FROM_TTY is non-zero, be
397 chatty about it. Return non-zero if any symbols were actually
398 loaded. */
399
400int
401solib_read_symbols (struct so_list *so, int from_tty)
402{
403 if (so->symbols_loaded)
404 {
405 if (from_tty)
406 printf_unfiltered (_("Symbols already loaded for %s\n")("Symbols already loaded for %s\n"), so->so_name);
407 }
408 else
409 {
410 if (catch_errors (symbol_add_stub, so,
411 "Error while reading shared library symbols:\n",
412 RETURN_MASK_ALL((1 << (int)(-RETURN_QUIT)) | (1 << (int)(-RETURN_ERROR
)))
))
413 {
414 if (from_tty)
415 printf_unfiltered (_("Loaded symbols for %s\n")("Loaded symbols for %s\n"), so->so_name);
416 so->symbols_loaded = 1;
417 return 1;
418 }
419 }
420
421 return 0;
422}
423
424/* LOCAL FUNCTION
425
426 update_solib_list --- synchronize GDB's shared object list with inferior's
427
428 SYNOPSIS
429
430 void update_solib_list (int from_tty, struct target_ops *TARGET)
431
432 Extract the list of currently loaded shared objects from the
433 inferior, and compare it with the list of shared objects currently
434 in GDB's so_list_head list. Edit so_list_head to bring it in sync
435 with the inferior's new list.
436
437 If we notice that the inferior has unloaded some shared objects,
438 free any symbolic info GDB had read about those shared objects.
439
440 Don't load symbolic info for any new shared objects; just add them
441 to the list, and leave their symbols_loaded flag clear.
442
443 If FROM_TTY is non-null, feel free to print messages about what
444 we're doing.
445
446 If TARGET is non-null, add the sections of all new shared objects
447 to TARGET's section table. Note that this doesn't remove any
448 sections for shared objects that have been unloaded, and it
449 doesn't check to see if the new shared objects are already present in
450 the section table. But we only use this for core files and
451 processes we've just attached to, so that's okay. */
452
453static void
454update_solib_list (int from_tty, struct target_ops *target)
455{
456 struct so_list *inferior = TARGET_SO_CURRENT_SOS(current_target_so_ops->current_sos) ();
457 struct so_list *gdb, **gdb_link;
458
459 /* If we are attaching to a running process for which we
460 have not opened a symbol file, we may be able to get its
461 symbols now! */
462 if (attach_flag &&
463 symfile_objfile == NULL((void*)0))
464 catch_errors (TARGET_SO_OPEN_SYMBOL_FILE_OBJECT(current_target_so_ops->open_symbol_file_object), &from_tty,
465 "Error reading attached process's symbol file.\n",
466 RETURN_MASK_ALL((1 << (int)(-RETURN_QUIT)) | (1 << (int)(-RETURN_ERROR
)))
);
467
468 /* Since this function might actually add some elements to the
469 so_list_head list, arrange for it to be cleaned up when
470 appropriate. */
471 if (!solib_cleanup_queued)
472 {
473 make_run_cleanup (do_clear_solib, NULL((void*)0));
474 solib_cleanup_queued = 1;
475 }
476
477 /* GDB and the inferior's dynamic linker each maintain their own
478 list of currently loaded shared objects; we want to bring the
479 former in sync with the latter. Scan both lists, seeing which
480 shared objects appear where. There are three cases:
481
482 - A shared object appears on both lists. This means that GDB
483 knows about it already, and it's still loaded in the inferior.
484 Nothing needs to happen.
485
486 - A shared object appears only on GDB's list. This means that
487 the inferior has unloaded it. We should remove the shared
488 object from GDB's tables.
489
490 - A shared object appears only on the inferior's list. This
491 means that it's just been loaded. We should add it to GDB's
492 tables.
493
494 So we walk GDB's list, checking each entry to see if it appears
495 in the inferior's list too. If it does, no action is needed, and
496 we remove it from the inferior's list. If it doesn't, the
497 inferior has unloaded it, and we remove it from GDB's list. By
498 the time we're done walking GDB's list, the inferior's list
499 contains only the new shared objects, which we then add. */
500
501 gdb = so_list_head;
502 gdb_link = &so_list_head;
503 while (gdb)
504 {
505 struct so_list *i = inferior;
506 struct so_list **i_link = &inferior;
507
508 /* Check to see whether the shared object *gdb also appears in
509 the inferior's current list. */
510 while (i)
511 {
512 if (! strcmp (gdb->so_original_name, i->so_original_name))
513 break;
514
515 i_link = &i->next;
516 i = *i_link;
517 }
518
519 /* If the shared object appears on the inferior's list too, then
520 it's still loaded, so we don't need to do anything. Delete
521 it from the inferior's list, and leave it on GDB's list. */
522 if (i)
523 {
524 *i_link = i->next;
525 free_so (i);
526 gdb_link = &gdb->next;
527 gdb = *gdb_link;
528 }
529
530 /* If it's not on the inferior's list, remove it from GDB's tables. */
531 else
532 {
533 /* Notify any observer that the SO has been unloaded
534 before we remove it from the gdb tables. */
535 observer_notify_solib_unloaded (gdb);
536
537 *gdb_link = gdb->next;
538
539 /* Unless the user loaded it explicitly, free SO's objfile. */
540 if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED(1 << 5)))
541 free_objfile (gdb->objfile);
542
543 /* Some targets' section tables might be referring to
544 sections from so->abfd; remove them. */
545 remove_target_sections (gdb->abfd);
546
547 free_so (gdb);
548 gdb = *gdb_link;
549 }
550 }
551
552 /* Now the inferior's list contains only shared objects that don't
553 appear in GDB's list --- those that are newly loaded. Add them
554 to GDB's shared object list. */
555 if (inferior)
556 {
557 struct so_list *i;
558
559 /* Add the new shared objects to GDB's list. */
560 *gdb_link = inferior;
561
562 /* Fill in the rest of each of the `struct so_list' nodes. */
563 for (i = inferior; i; i = i->next)
564 {
565 add_to_target_sections (from_tty, target, i);
566 }
567 }
568}
569
570void
571add_to_target_sections (int from_tty, struct target_ops *target, struct so_list *solib)
572{
573 /* If this is set, then the sections have been already added to the
574 target list. */
575 if (solib->main)
576 return;
577
578 solib->from_tty = from_tty;
579
580 /* Fill in the rest of the `struct so_list' node. */
581 catch_errors (solib_map_sections, solib,
582 "Error while mapping shared library sections:\n",
583 RETURN_MASK_ALL((1 << (int)(-RETURN_QUIT)) | (1 << (int)(-RETURN_ERROR
)))
);
584
585 /* If requested, add the shared object's sections to the TARGET's
586 section table. Do this immediately after mapping the object so
587 that later nodes in the list can query this object, as is needed
588 in solib-osf.c. */
589 if (target)
590 {
591 int count = (solib->sections_end - solib->sections);
592 if (count > 0)
593 {
594 int space = target_resize_to_sections (target, count);
595 memcpy (target->to_sections + space,
596 solib->sections,
597 count * sizeof (solib->sections[0]));
598 }
599 }
600 /* Notify any observer that the shared object has been
601 loaded now that we've added it to GDB's tables. */
602 observer_notify_solib_loaded (solib);
603}
604
605
606/* GLOBAL FUNCTION
607
608 solib_add -- read in symbol info for newly added shared libraries
609
610 SYNOPSIS
611
612 void solib_add (char *pattern, int from_tty, struct target_ops
613 *TARGET, int readsyms)
614
615 DESCRIPTION
616
617 Read in symbolic information for any shared objects whose names
618 match PATTERN. (If we've already read a shared object's symbol
619 info, leave it alone.) If PATTERN is zero, read them all.
620
621 If READSYMS is 0, defer reading symbolic information until later
622 but still do any needed low level processing.
623
624 FROM_TTY and TARGET are as described for update_solib_list, above. */
625
626void
627solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
628{
629 struct so_list *gdb;
630
631 if (pattern)
632 {
633 char *re_err = re_compxre_comp (pattern);
634
635 if (re_err)
636 error ("Invalid regexp: %s", re_err);
637 }
638
639 update_solib_list (from_tty, target);
640
641 /* Walk the list of currently loaded shared libraries, and read
642 symbols for any that match the pattern --- or any whose symbols
643 aren't already loaded, if no pattern was given. */
644 {
645 int any_matches = 0;
646 int loaded_any_symbols = 0;
647
648 for (gdb = so_list_head; gdb; gdb = gdb->next)
649 if (! pattern || re_execxre_exec (gdb->so_name))
650 {
651 any_matches = 1;
652 if (readsyms && solib_read_symbols (gdb, from_tty))
653 loaded_any_symbols = 1;
654 }
655
656 if (from_tty && pattern && ! any_matches)
657 printf_unfiltered
658 ("No loaded shared libraries match the pattern `%s'.\n", pattern);
659
660 if (loaded_any_symbols)
661 {
662 /* Getting new symbols may change our opinion about what is
663 frameless. */
664 reinit_frame_cache ();
665
666 TARGET_SO_SPECIAL_SYMBOL_HANDLING(current_target_so_ops->special_symbol_handling) ();
667 }
668 }
669}
670
671
672/*
673
674 LOCAL FUNCTION
675
676 info_sharedlibrary_command -- code for "info sharedlibrary"
677
678 SYNOPSIS
679
680 static void info_sharedlibrary_command ()
681
682 DESCRIPTION
683
684 Walk through the shared library list and print information
685 about each attached library.
686 */
687
688static void
689info_sharedlibrary_command (char *ignore, int from_tty)
690{
691 struct so_list *so = NULL((void*)0); /* link map state variable */
692 int header_done = 0;
693 int addr_width;
694
695 if (TARGET_PTR_BIT(gdbarch_ptr_bit (current_gdbarch)) == 32)
696 addr_width = 8 + 4;
697 else if (TARGET_PTR_BIT(gdbarch_ptr_bit (current_gdbarch)) == 64)
698 addr_width = 16 + 4;
699 else
700 {
701 internal_error (__FILE__"/usr/src/gnu/usr.bin/binutils/gdb/solib.c", __LINE__701,
702 "TARGET_PTR_BIT returned unknown size %d",
703 TARGET_PTR_BIT(gdbarch_ptr_bit (current_gdbarch)));
704 }
705
706 update_solib_list (from_tty, 0);
707
708 for (so = so_list_head; so; so = so->next)
709 {
710 if (so->so_name[0])
711 {
712 if (!header_done)
713 {
714 printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
715 addr_width, "To", "Syms Read",
716 "Shared Object Library");
717 header_done++;
718 }
719
720 printf_unfiltered ("%-*s", addr_width,
721 so->textsection != NULL((void*)0)
722 ? hex_string_custom (
723 (LONGESTlong) so->textsection->addr,
724 addr_width - 4)
725 : "");
726 printf_unfiltered ("%-*s", addr_width,
727 so->textsection != NULL((void*)0)
728 ? hex_string_custom (
729 (LONGESTlong) so->textsection->endaddr,
730 addr_width - 4)
731 : "");
732 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
733 printf_unfiltered ("%s\n", so->so_name);
734 }
735 }
736 if (so_list_head == NULL((void*)0))
737 {
738 printf_unfiltered ("No shared libraries loaded at this time.\n");
739 }
740}
741
742/*
743
744 GLOBAL FUNCTION
745
746 solib_address -- check to see if an address is in a shared lib
747
748 SYNOPSIS
749
750 char * solib_address (CORE_ADDR address)
751
752 DESCRIPTION
753
754 Provides a hook for other gdb routines to discover whether or
755 not a particular address is within the mapped address space of
756 a shared library.
757
758 For example, this routine is called at one point to disable
759 breakpoints which are in shared libraries that are not currently
760 mapped in.
761 */
762
763char *
764solib_address (CORE_ADDR address)
765{
766 struct so_list *so = 0; /* link map state variable */
767
768 for (so = so_list_head; so; so = so->next)
769 {
770 struct section_table *p;
771
772 for (p = so->sections; p < so->sections_end; p++)
773 {
774 if (p->addr <= address && address < p->endaddr)
775 return (so->so_name);
776 }
777 }
778
779 return (0);
780}
781
782/* Called by free_all_symtabs */
783
784void
785clear_solib (void)
786{
787 /* This function is expected to handle ELF shared libraries. It is
788 also used on Solaris, which can run either ELF or a.out binaries
789 (for compatibility with SunOS 4), both of which can use shared
790 libraries. So we don't know whether we have an ELF executable or
791 an a.out executable until the user chooses an executable file.
792
793 ELF shared libraries don't get mapped into the address space
794 until after the program starts, so we'd better not try to insert
795 breakpoints in them immediately. We have to wait until the
796 dynamic linker has loaded them; we'll hit a bp_shlib_event
797 breakpoint (look for calls to create_solib_event_breakpoint) when
798 it's ready.
799
800 SunOS shared libraries seem to be different --- they're present
801 as soon as the process begins execution, so there's no need to
802 put off inserting breakpoints. There's also nowhere to put a
803 bp_shlib_event breakpoint, so if we put it off, we'll never get
804 around to it.
805
806 So: disable breakpoints only if we're using ELF shared libs. */
807 if (exec_bfd != NULL((void*)0)
808 && bfd_get_flavour (exec_bfd)((exec_bfd)->xvec->flavour) != bfd_target_aout_flavour)
809 disable_breakpoints_in_shlibs (1);
810
811 while (so_list_head)
812 {
813 struct so_list *so = so_list_head;
814 so_list_head = so->next;
815 if (so->abfd)
816 remove_target_sections (so->abfd);
817 free_so (so);
818 }
819
820 TARGET_SO_CLEAR_SOLIB(current_target_so_ops->clear_solib) ();
821}
822
823static void
824do_clear_solib (void *dummy)
825{
826 solib_cleanup_queued = 0;
827 clear_solib ();
828}
829
830/* GLOBAL FUNCTION
831
832 solib_create_inferior_hook -- shared library startup support
833
834 SYNOPSIS
835
836 void solib_create_inferior_hook()
837
838 DESCRIPTION
839
840 When gdb starts up the inferior, it nurses it along (through the
841 shell) until it is ready to execute it's first instruction. At this
842 point, this function gets called via expansion of the macro
843 SOLIB_CREATE_INFERIOR_HOOK. */
844
845void
846solib_create_inferior_hook (void)
847{
848 TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK(current_target_so_ops->solib_create_inferior_hook) ();
849}
850
851/* GLOBAL FUNCTION
852
853 in_solib_dynsym_resolve_code -- check to see if an address is in
854 dynamic loader's dynamic symbol
855 resolution code
856
857 SYNOPSIS
858
859 int in_solib_dynsym_resolve_code (CORE_ADDR pc)
860
861 DESCRIPTION
862
863 Determine if PC is in the dynamic linker's symbol resolution
864 code. Return 1 if so, 0 otherwise.
865*/
866
867int
868in_solib_dynsym_resolve_code (CORE_ADDR pc)
869{
870 return TARGET_SO_IN_DYNSYM_RESOLVE_CODE(current_target_so_ops->in_dynsym_resolve_code) (pc);
871}
872
873/*
874
875 LOCAL FUNCTION
876
877 sharedlibrary_command -- handle command to explicitly add library
878
879 SYNOPSIS
880
881 static void sharedlibrary_command (char *args, int from_tty)
882
883 DESCRIPTION
884
885 */
886
887static void
888sharedlibrary_command (char *args, int from_tty)
889{
890 dont_repeat ();
891 solib_add (args, from_tty, (struct target_ops *) 0, 1);
892}
893
894/* LOCAL FUNCTION
895
896 no_shared_libraries -- handle command to explicitly discard symbols
897 from shared libraries.
898
899 DESCRIPTION
900
901 Implements the command "nosharedlibrary", which discards symbols
902 that have been auto-loaded from shared libraries. Symbols from
903 shared libraries that were added by explicit request of the user
904 are not discarded. Also called from remote.c. */
905
906void
907no_shared_libraries (char *ignored, int from_tty)
908{
909 objfile_purge_solibs ();
910 do_clear_solib (NULL((void*)0));
911}
912
913static void
914reload_shared_libraries (char *ignored, int from_tty)
915{
916 no_shared_libraries (NULL((void*)0), from_tty);
917 solib_add (NULL((void*)0), from_tty, NULL((void*)0), auto_solib_add);
918}
919
920extern initialize_file_ftype _initialize_solib; /* -Wmissing-prototypes */
921
922void
923_initialize_solib (void)
924{
925 struct cmd_list_element *c;
926
927 add_com ("sharedlibrary", class_files, sharedlibrary_command,
928 "Load shared object library symbols for files matching REGEXP.");
929 add_info ("sharedlibrary", info_sharedlibrary_command,
930 "Status of loaded shared object libraries.");
931 add_com ("nosharedlibrary", class_files, no_shared_libraries,
932 "Unload all shared object library symbols.");
933
934 deprecated_add_show_from_set
935 (add_set_cmd ("auto-solib-add", class_support, var_boolean,
936 (char *) &auto_solib_add,
937 "Set autoloading of shared library symbols.\n\
938If \"on\", symbols from all shared object libraries will be loaded\n\
939automatically when the inferior begins execution, when the dynamic linker\n\
940informs gdb that a new library has been loaded, or when attaching to the\n\
941inferior. Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
942 &setlist),
943 &showlist);
944
945 c = add_set_cmd ("solib-absolute-prefix", class_support, var_filename,
946 (char *) &solib_absolute_prefix,
947 "Set prefix for loading absolute shared library symbol files.\n\
948For other (relative) files, you can add values using `set solib-search-path'.",
949 &setlist);
950 deprecated_add_show_from_set (c, &showlist);
951 set_cmd_cfunc (c, reload_shared_libraries);
952 set_cmd_completer (c, filename_completer);
953
954 /* Set the default value of "solib-absolute-prefix" from the sysroot, if
955 one is set. */
956 solib_absolute_prefix = xstrdup (gdb_sysroot);
957
958 c = add_set_cmd ("solib-search-path", class_support, var_string,
959 (char *) &solib_search_path,
960 "Set the search path for loading non-absolute shared library symbol files.\n\
961This takes precedence over the environment variables PATH and LD_LIBRARY_PATH.",
962 &setlist);
963 deprecated_add_show_from_set (c, &showlist);
964 set_cmd_cfunc (c, reload_shared_libraries);
965 set_cmd_completer (c, filename_completer);
966}