2003-02-20 David Carlton <carlton@math.stanford.edu>
[deliverable/binutils-gdb.git] / gdb / solib.c
... / ...
CommitLineData
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
44#include "solist.h"
45#include <readline/readline.h>
46
47/* external data declarations */
48
49/* FIXME: gdbarch needs to control this variable */
50struct target_so_ops *current_target_so_ops;
51
52/* local data declarations */
53
54static struct so_list *so_list_head; /* List of known shared objects */
55
56static int solib_cleanup_queued = 0; /* make_run_cleanup called */
57
58/* Local function prototypes */
59
60static void do_clear_solib (void *);
61
62/* If non-zero, this is a prefix that will be added to the front of the name
63 shared libraries with an absolute filename for loading. */
64static char *solib_absolute_prefix = NULL;
65
66/* If non-empty, this is a search path for loading non-absolute shared library
67 symbol files. This takes precedence over the environment variables PATH
68 and LD_LIBRARY_PATH. */
69static char *solib_search_path = NULL;
70
71/*
72
73 GLOBAL FUNCTION
74
75 solib_open -- Find a shared library file and open it.
76
77 SYNOPSIS
78
79 int solib_open (char *in_patname, char **found_pathname);
80
81 DESCRIPTION
82
83 Global variable SOLIB_ABSOLUTE_PREFIX is used as a prefix directory
84 to search for shared libraries if they have an absolute path.
85
86 Global variable SOLIB_SEARCH_PATH is used as a prefix directory
87 (or set of directories, as in LD_LIBRARY_PATH) to search for all
88 shared libraries if not found in SOLIB_ABSOLUTE_PREFIX.
89
90 Search order:
91 * If path is absolute, look in SOLIB_ABSOLUTE_PREFIX.
92 * If path is absolute or relative, look for it literally (unmodified).
93 * Look in SOLIB_SEARCH_PATH.
94 * Look in inferior's $PATH.
95 * Look in inferior's $LD_LIBRARY_PATH.
96
97 RETURNS
98
99 file handle for opened solib, or -1 for failure. */
100
101int
102solib_open (char *in_pathname, char **found_pathname)
103{
104 int found_file = -1;
105 char *temp_pathname = NULL;
106 char *p = in_pathname;
107
108 while (*p && !IS_DIR_SEPARATOR (*p))
109 p++;
110
111 if (*p)
112 {
113 if (! IS_ABSOLUTE_PATH (in_pathname) || solib_absolute_prefix == NULL)
114 temp_pathname = in_pathname;
115 else
116 {
117 int prefix_len = strlen (solib_absolute_prefix);
118
119 /* Remove trailing slashes from absolute prefix. */
120 while (prefix_len > 0
121 && IS_DIR_SEPARATOR (solib_absolute_prefix[prefix_len - 1]))
122 prefix_len--;
123
124 /* Cat the prefixed pathname together. */
125 temp_pathname = alloca (prefix_len + strlen (in_pathname) + 1);
126 strncpy (temp_pathname, solib_absolute_prefix, prefix_len);
127 temp_pathname[prefix_len] = '\0';
128 strcat (temp_pathname, in_pathname);
129 }
130
131 /* Now see if we can open it. */
132 found_file = open (temp_pathname, O_RDONLY, 0);
133 }
134
135 /* If the search in solib_absolute_prefix failed, and the path name is
136 absolute at this point, make it relative. (openp will try and open the
137 file according to its absolute path otherwise, which is not what we want.)
138 Affects subsequent searches for this solib. */
139 if (found_file < 0 && IS_ABSOLUTE_PATH (in_pathname))
140 {
141 /* First, get rid of any drive letters etc. */
142 while (!IS_DIR_SEPARATOR (*in_pathname))
143 in_pathname++;
144
145 /* Next, get rid of all leading dir separators. */
146 while (IS_DIR_SEPARATOR (*in_pathname))
147 in_pathname++;
148 }
149
150 /* If not found, next search the solib_search_path (if any). */
151 if (found_file < 0 && solib_search_path != NULL)
152 found_file = openp (solib_search_path,
153 1, in_pathname, O_RDONLY, 0, &temp_pathname);
154
155 /* If not found, next search the solib_search_path (if any) for the basename
156 only (ignoring the path). This is to allow reading solibs from a path
157 that differs from the opened path. */
158 if (found_file < 0 && solib_search_path != NULL)
159 found_file = openp (solib_search_path,
160 1, lbasename (in_pathname), O_RDONLY, 0,
161 &temp_pathname);
162
163 /* If not found, next search the inferior's $PATH environment variable. */
164 if (found_file < 0 && solib_search_path != NULL)
165 found_file = openp (get_in_environ (inferior_environ, "PATH"),
166 1, in_pathname, O_RDONLY, 0, &temp_pathname);
167
168 /* If not found, next search the inferior's $LD_LIBRARY_PATH
169 environment variable. */
170 if (found_file < 0 && solib_search_path != NULL)
171 found_file = openp (get_in_environ (inferior_environ, "LD_LIBRARY_PATH"),
172 1, in_pathname, O_RDONLY, 0, &temp_pathname);
173
174 /* Done. If not found, tough luck. Return found_file and
175 (optionally) found_pathname. */
176 if (found_pathname != NULL && temp_pathname != NULL)
177 *found_pathname = xstrdup (temp_pathname);
178 return found_file;
179}
180
181
182/*
183
184 LOCAL FUNCTION
185
186 solib_map_sections -- open bfd and build sections for shared lib
187
188 SYNOPSIS
189
190 static int solib_map_sections (struct so_list *so)
191
192 DESCRIPTION
193
194 Given a pointer to one of the shared objects in our list
195 of mapped objects, use the recorded name to open a bfd
196 descriptor for the object, build a section table, and then
197 relocate all the section addresses by the base address at
198 which the shared object was mapped.
199
200 FIXMES
201
202 In most (all?) cases the shared object file name recorded in the
203 dynamic linkage tables will be a fully qualified pathname. For
204 cases where it isn't, do we really mimic the systems search
205 mechanism correctly in the below code (particularly the tilde
206 expansion stuff?).
207 */
208
209static int
210solib_map_sections (void *arg)
211{
212 struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
213 char *filename;
214 char *scratch_pathname;
215 int scratch_chan;
216 struct section_table *p;
217 struct cleanup *old_chain;
218 bfd *abfd;
219
220 filename = tilde_expand (so->so_name);
221
222 old_chain = make_cleanup (xfree, filename);
223 scratch_chan = solib_open (filename, &scratch_pathname);
224
225 if (scratch_chan < 0)
226 {
227 perror_with_name (filename);
228 }
229
230 /* Leave scratch_pathname allocated. abfd->name will point to it. */
231 abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
232 if (!abfd)
233 {
234 close (scratch_chan);
235 error ("Could not open `%s' as an executable file: %s",
236 scratch_pathname, bfd_errmsg (bfd_get_error ()));
237 }
238
239 /* Leave bfd open, core_xfer_memory and "info files" need it. */
240 so->abfd = abfd;
241 abfd->cacheable = 1;
242
243 /* copy full path name into so_name, so that later symbol_file_add
244 can find it */
245 if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE)
246 error ("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure.");
247 strcpy (so->so_name, scratch_pathname);
248
249 if (!bfd_check_format (abfd, bfd_object))
250 {
251 error ("\"%s\": not in executable format: %s.",
252 scratch_pathname, bfd_errmsg (bfd_get_error ()));
253 }
254 if (build_section_table (abfd, &so->sections, &so->sections_end))
255 {
256 error ("Can't find the file sections in `%s': %s",
257 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
258 }
259
260 for (p = so->sections; p < so->sections_end; p++)
261 {
262 /* Relocate the section binding addresses as recorded in the shared
263 object's file by the base address to which the object was actually
264 mapped. */
265 TARGET_SO_RELOCATE_SECTION_ADDRESSES (so, p);
266 if (STREQ (p->the_bfd_section->name, ".text"))
267 {
268 so->textsection = p;
269 }
270 }
271
272 /* Free the file names, close the file now. */
273 do_cleanups (old_chain);
274
275 return (1);
276}
277
278/* LOCAL FUNCTION
279
280 free_so --- free a `struct so_list' object
281
282 SYNOPSIS
283
284 void free_so (struct so_list *so)
285
286 DESCRIPTION
287
288 Free the storage associated with the `struct so_list' object SO.
289 If we have opened a BFD for SO, close it.
290
291 The caller is responsible for removing SO from whatever list it is
292 a member of. If we have placed SO's sections in some target's
293 section table, the caller is responsible for removing them.
294
295 This function doesn't mess with objfiles at all. If there is an
296 objfile associated with SO that needs to be removed, the caller is
297 responsible for taking care of that. */
298
299void
300free_so (struct so_list *so)
301{
302 char *bfd_filename = 0;
303
304 if (so->sections)
305 xfree (so->sections);
306
307 if (so->abfd)
308 {
309 bfd_filename = bfd_get_filename (so->abfd);
310 if (! bfd_close (so->abfd))
311 warning ("cannot close \"%s\": %s",
312 bfd_filename, bfd_errmsg (bfd_get_error ()));
313 }
314
315 if (bfd_filename)
316 xfree (bfd_filename);
317
318 TARGET_SO_FREE_SO (so);
319
320 xfree (so);
321}
322
323
324/* A small stub to get us past the arg-passing pinhole of catch_errors. */
325
326static int
327symbol_add_stub (void *arg)
328{
329 register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
330 struct section_addr_info *sap;
331
332 /* Have we already loaded this shared object? */
333 ALL_OBJFILES (so->objfile)
334 {
335 if (strcmp (so->objfile->name, so->so_name) == 0)
336 return 1;
337 }
338
339 sap = build_section_addr_info_from_section_table (so->sections,
340 so->sections_end);
341
342 so->objfile = symbol_file_add (so->so_name, so->from_tty,
343 sap, 0, OBJF_SHARED);
344 free_section_addr_info (sap);
345
346 return (1);
347}
348
349
350/* LOCAL FUNCTION
351
352 update_solib_list --- synchronize GDB's shared object list with inferior's
353
354 SYNOPSIS
355
356 void update_solib_list (int from_tty, struct target_ops *TARGET)
357
358 Extract the list of currently loaded shared objects from the
359 inferior, and compare it with the list of shared objects currently
360 in GDB's so_list_head list. Edit so_list_head to bring it in sync
361 with the inferior's new list.
362
363 If we notice that the inferior has unloaded some shared objects,
364 free any symbolic info GDB had read about those shared objects.
365
366 Don't load symbolic info for any new shared objects; just add them
367 to the list, and leave their symbols_loaded flag clear.
368
369 If FROM_TTY is non-null, feel free to print messages about what
370 we're doing.
371
372 If TARGET is non-null, add the sections of all new shared objects
373 to TARGET's section table. Note that this doesn't remove any
374 sections for shared objects that have been unloaded, and it
375 doesn't check to see if the new shared objects are already present in
376 the section table. But we only use this for core files and
377 processes we've just attached to, so that's okay. */
378
379void
380update_solib_list (int from_tty, struct target_ops *target)
381{
382 struct so_list *inferior = TARGET_SO_CURRENT_SOS ();
383 struct so_list *gdb, **gdb_link;
384
385 /* If we are attaching to a running process for which we
386 have not opened a symbol file, we may be able to get its
387 symbols now! */
388 if (attach_flag &&
389 symfile_objfile == NULL)
390 catch_errors (TARGET_SO_OPEN_SYMBOL_FILE_OBJECT, &from_tty,
391 "Error reading attached process's symbol file.\n",
392 RETURN_MASK_ALL);
393
394 /* Since this function might actually add some elements to the
395 so_list_head list, arrange for it to be cleaned up when
396 appropriate. */
397 if (!solib_cleanup_queued)
398 {
399 make_run_cleanup (do_clear_solib, NULL);
400 solib_cleanup_queued = 1;
401 }
402
403 /* GDB and the inferior's dynamic linker each maintain their own
404 list of currently loaded shared objects; we want to bring the
405 former in sync with the latter. Scan both lists, seeing which
406 shared objects appear where. There are three cases:
407
408 - A shared object appears on both lists. This means that GDB
409 knows about it already, and it's still loaded in the inferior.
410 Nothing needs to happen.
411
412 - A shared object appears only on GDB's list. This means that
413 the inferior has unloaded it. We should remove the shared
414 object from GDB's tables.
415
416 - A shared object appears only on the inferior's list. This
417 means that it's just been loaded. We should add it to GDB's
418 tables.
419
420 So we walk GDB's list, checking each entry to see if it appears
421 in the inferior's list too. If it does, no action is needed, and
422 we remove it from the inferior's list. If it doesn't, the
423 inferior has unloaded it, and we remove it from GDB's list. By
424 the time we're done walking GDB's list, the inferior's list
425 contains only the new shared objects, which we then add. */
426
427 gdb = so_list_head;
428 gdb_link = &so_list_head;
429 while (gdb)
430 {
431 struct so_list *i = inferior;
432 struct so_list **i_link = &inferior;
433
434 /* Check to see whether the shared object *gdb also appears in
435 the inferior's current list. */
436 while (i)
437 {
438 if (! strcmp (gdb->so_original_name, i->so_original_name))
439 break;
440
441 i_link = &i->next;
442 i = *i_link;
443 }
444
445 /* If the shared object appears on the inferior's list too, then
446 it's still loaded, so we don't need to do anything. Delete
447 it from the inferior's list, and leave it on GDB's list. */
448 if (i)
449 {
450 *i_link = i->next;
451 free_so (i);
452 gdb_link = &gdb->next;
453 gdb = *gdb_link;
454 }
455
456 /* If it's not on the inferior's list, remove it from GDB's tables. */
457 else
458 {
459 *gdb_link = gdb->next;
460
461 /* Unless the user loaded it explicitly, free SO's objfile. */
462 if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED))
463 free_objfile (gdb->objfile);
464
465 /* Some targets' section tables might be referring to
466 sections from so->abfd; remove them. */
467 remove_target_sections (gdb->abfd);
468
469 free_so (gdb);
470 gdb = *gdb_link;
471 }
472 }
473
474 /* Now the inferior's list contains only shared objects that don't
475 appear in GDB's list --- those that are newly loaded. Add them
476 to GDB's shared object list. */
477 if (inferior)
478 {
479 struct so_list *i;
480
481 /* Add the new shared objects to GDB's list. */
482 *gdb_link = inferior;
483
484 /* Fill in the rest of each of the `struct so_list' nodes. */
485 for (i = inferior; i; i = i->next)
486 {
487 i->from_tty = from_tty;
488
489 /* Fill in the rest of the `struct so_list' node. */
490 catch_errors (solib_map_sections, i,
491 "Error while mapping shared library sections:\n",
492 RETURN_MASK_ALL);
493
494 /* If requested, add the shared object's sections to the TARGET's
495 section table. Do this immediately after mapping the object so
496 that later nodes in the list can query this object, as is needed
497 in solib-osf.c. */
498 if (target)
499 {
500 int count = (i->sections_end - i->sections);
501 if (count > 0)
502 {
503 int space = target_resize_to_sections (target, count);
504 memcpy (target->to_sections + space,
505 i->sections,
506 count * sizeof (i->sections[0]));
507 }
508 }
509 }
510 }
511}
512
513
514/* GLOBAL FUNCTION
515
516 solib_add -- read in symbol info for newly added shared libraries
517
518 SYNOPSIS
519
520 void solib_add (char *pattern, int from_tty, struct target_ops
521 *TARGET, int readsyms)
522
523 DESCRIPTION
524
525 Read in symbolic information for any shared objects whose names
526 match PATTERN. (If we've already read a shared object's symbol
527 info, leave it alone.) If PATTERN is zero, read them all.
528
529 If READSYMS is 0, defer reading symbolic information until later
530 but still do any needed low level processing.
531
532 FROM_TTY and TARGET are as described for update_solib_list, above. */
533
534void
535solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
536{
537 struct so_list *gdb;
538
539 if (pattern)
540 {
541 char *re_err = re_comp (pattern);
542
543 if (re_err)
544 error ("Invalid regexp: %s", re_err);
545 }
546
547 update_solib_list (from_tty, target);
548
549 /* Walk the list of currently loaded shared libraries, and read
550 symbols for any that match the pattern --- or any whose symbols
551 aren't already loaded, if no pattern was given. */
552 {
553 int any_matches = 0;
554 int loaded_any_symbols = 0;
555
556 for (gdb = so_list_head; gdb; gdb = gdb->next)
557 if (! pattern || re_exec (gdb->so_name))
558 {
559 any_matches = 1;
560
561 if (gdb->symbols_loaded)
562 {
563 if (from_tty)
564 printf_unfiltered ("Symbols already loaded for %s\n",
565 gdb->so_name);
566 }
567 else if (readsyms)
568 {
569 if (catch_errors
570 (symbol_add_stub, gdb,
571 "Error while reading shared library symbols:\n",
572 RETURN_MASK_ALL))
573 {
574 if (from_tty)
575 printf_unfiltered ("Loaded symbols for %s\n",
576 gdb->so_name);
577 gdb->symbols_loaded = 1;
578 loaded_any_symbols = 1;
579 }
580 }
581 }
582
583 if (from_tty && pattern && ! any_matches)
584 printf_unfiltered
585 ("No loaded shared libraries match the pattern `%s'.\n", pattern);
586
587 if (loaded_any_symbols)
588 {
589 /* Getting new symbols may change our opinion about what is
590 frameless. */
591 reinit_frame_cache ();
592
593 TARGET_SO_SPECIAL_SYMBOL_HANDLING ();
594 }
595 }
596}
597
598
599/*
600
601 LOCAL FUNCTION
602
603 info_sharedlibrary_command -- code for "info sharedlibrary"
604
605 SYNOPSIS
606
607 static void info_sharedlibrary_command ()
608
609 DESCRIPTION
610
611 Walk through the shared library list and print information
612 about each attached library.
613 */
614
615static void
616info_sharedlibrary_command (char *ignore, int from_tty)
617{
618 register struct so_list *so = NULL; /* link map state variable */
619 int header_done = 0;
620 int addr_width;
621 char *addr_fmt;
622
623 if (TARGET_PTR_BIT == 32)
624 {
625 addr_width = 8 + 4;
626 addr_fmt = "08l";
627 }
628 else if (TARGET_PTR_BIT == 64)
629 {
630 addr_width = 16 + 4;
631 addr_fmt = "016l";
632 }
633 else
634 {
635 internal_error (__FILE__, __LINE__,
636 "TARGET_PTR_BIT returned unknown size %d",
637 TARGET_PTR_BIT);
638 }
639
640 update_solib_list (from_tty, 0);
641
642 for (so = so_list_head; so; so = so->next)
643 {
644 if (so->so_name[0])
645 {
646 if (!header_done)
647 {
648 printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
649 addr_width, "To", "Syms Read",
650 "Shared Object Library");
651 header_done++;
652 }
653
654 printf_unfiltered ("%-*s", addr_width,
655 so->textsection != NULL
656 ? local_hex_string_custom (
657 (LONGEST) so->textsection->addr,
658 addr_fmt)
659 : "");
660 printf_unfiltered ("%-*s", addr_width,
661 so->textsection != NULL
662 ? local_hex_string_custom (
663 (LONGEST) so->textsection->endaddr,
664 addr_fmt)
665 : "");
666 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
667 printf_unfiltered ("%s\n", so->so_name);
668 }
669 }
670 if (so_list_head == NULL)
671 {
672 printf_unfiltered ("No shared libraries loaded at this time.\n");
673 }
674}
675
676/*
677
678 GLOBAL FUNCTION
679
680 solib_address -- check to see if an address is in a shared lib
681
682 SYNOPSIS
683
684 char * solib_address (CORE_ADDR address)
685
686 DESCRIPTION
687
688 Provides a hook for other gdb routines to discover whether or
689 not a particular address is within the mapped address space of
690 a shared library.
691
692 For example, this routine is called at one point to disable
693 breakpoints which are in shared libraries that are not currently
694 mapped in.
695 */
696
697char *
698solib_address (CORE_ADDR address)
699{
700 register struct so_list *so = 0; /* link map state variable */
701
702 for (so = so_list_head; so; so = so->next)
703 {
704 struct section_table *p;
705
706 for (p = so->sections; p < so->sections_end; p++)
707 {
708 if (p->addr <= address && address < p->endaddr)
709 return (so->so_name);
710 }
711 }
712
713 return (0);
714}
715
716/* Called by free_all_symtabs */
717
718void
719clear_solib (void)
720{
721 /* This function is expected to handle ELF shared libraries. It is
722 also used on Solaris, which can run either ELF or a.out binaries
723 (for compatibility with SunOS 4), both of which can use shared
724 libraries. So we don't know whether we have an ELF executable or
725 an a.out executable until the user chooses an executable file.
726
727 ELF shared libraries don't get mapped into the address space
728 until after the program starts, so we'd better not try to insert
729 breakpoints in them immediately. We have to wait until the
730 dynamic linker has loaded them; we'll hit a bp_shlib_event
731 breakpoint (look for calls to create_solib_event_breakpoint) when
732 it's ready.
733
734 SunOS shared libraries seem to be different --- they're present
735 as soon as the process begins execution, so there's no need to
736 put off inserting breakpoints. There's also nowhere to put a
737 bp_shlib_event breakpoint, so if we put it off, we'll never get
738 around to it.
739
740 So: disable breakpoints only if we're using ELF shared libs. */
741 if (exec_bfd != NULL
742 && bfd_get_flavour (exec_bfd) != bfd_target_aout_flavour)
743 disable_breakpoints_in_shlibs (1);
744
745 while (so_list_head)
746 {
747 struct so_list *so = so_list_head;
748 so_list_head = so->next;
749 if (so->abfd)
750 remove_target_sections (so->abfd);
751 free_so (so);
752 }
753
754 TARGET_SO_CLEAR_SOLIB ();
755}
756
757static void
758do_clear_solib (void *dummy)
759{
760 solib_cleanup_queued = 0;
761 clear_solib ();
762}
763
764/* GLOBAL FUNCTION
765
766 solib_create_inferior_hook -- shared library startup support
767
768 SYNOPSIS
769
770 void solib_create_inferior_hook()
771
772 DESCRIPTION
773
774 When gdb starts up the inferior, it nurses it along (through the
775 shell) until it is ready to execute it's first instruction. At this
776 point, this function gets called via expansion of the macro
777 SOLIB_CREATE_INFERIOR_HOOK. */
778
779void
780solib_create_inferior_hook (void)
781{
782 TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK ();
783}
784
785/* GLOBAL FUNCTION
786
787 in_solib_dynsym_resolve_code -- check to see if an address is in
788 dynamic loader's dynamic symbol
789 resolution code
790
791 SYNOPSIS
792
793 int in_solib_dynsym_resolve_code (CORE_ADDR pc)
794
795 DESCRIPTION
796
797 Determine if PC is in the dynamic linker's symbol resolution
798 code. Return 1 if so, 0 otherwise.
799*/
800
801int
802in_solib_dynsym_resolve_code (CORE_ADDR pc)
803{
804 return TARGET_SO_IN_DYNSYM_RESOLVE_CODE (pc);
805}
806
807/*
808
809 LOCAL FUNCTION
810
811 sharedlibrary_command -- handle command to explicitly add library
812
813 SYNOPSIS
814
815 static void sharedlibrary_command (char *args, int from_tty)
816
817 DESCRIPTION
818
819 */
820
821static void
822sharedlibrary_command (char *args, int from_tty)
823{
824 dont_repeat ();
825 solib_add (args, from_tty, (struct target_ops *) 0, 1);
826}
827
828/* LOCAL FUNCTION
829
830 no_shared_libraries -- handle command to explicitly discard symbols
831 from shared libraries.
832
833 DESCRIPTION
834
835 Implements the command "nosharedlibrary", which discards symbols
836 that have been auto-loaded from shared libraries. Symbols from
837 shared libraries that were added by explicit request of the user
838 are not discarded. Also called from remote.c. */
839
840void
841no_shared_libraries (char *ignored, int from_tty)
842{
843 objfile_purge_solibs ();
844 do_clear_solib (NULL);
845}
846
847void
848_initialize_solib (void)
849{
850 struct cmd_list_element *c;
851
852 add_com ("sharedlibrary", class_files, sharedlibrary_command,
853 "Load shared object library symbols for files matching REGEXP.");
854 add_info ("sharedlibrary", info_sharedlibrary_command,
855 "Status of loaded shared object libraries.");
856 add_com ("nosharedlibrary", class_files, no_shared_libraries,
857 "Unload all shared object library symbols.");
858
859 add_show_from_set
860 (add_set_cmd ("auto-solib-add", class_support, var_boolean,
861 (char *) &auto_solib_add,
862 "Set autoloading of shared library symbols.\n\
863If \"on\", symbols from all shared object libraries will be loaded\n\
864automatically when the inferior begins execution, when the dynamic linker\n\
865informs gdb that a new library has been loaded, or when attaching to the\n\
866inferior. Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
867 &setlist),
868 &showlist);
869
870 c = add_set_cmd ("solib-absolute-prefix", class_support, var_filename,
871 (char *) &solib_absolute_prefix,
872 "Set prefix for loading absolute shared library symbol files.\n\
873For other (relative) files, you can add values using `set solib-search-path'.",
874 &setlist);
875 add_show_from_set (c, &showlist);
876 set_cmd_completer (c, filename_completer);
877
878 /* Set the default value of "solib-absolute-prefix" from the sysroot, if
879 one is set. */
880 solib_absolute_prefix = xstrdup (gdb_sysroot);
881
882 c = add_set_cmd ("solib-search-path", class_support, var_string,
883 (char *) &solib_search_path,
884 "Set the search path for loading non-absolute shared library symbol files.\n\
885This takes precedence over the environment variables PATH and LD_LIBRARY_PATH.",
886 &setlist);
887 add_show_from_set (c, &showlist);
888 set_cmd_completer (c, filename_completer);
889}
This page took 0.026095 seconds and 4 git commands to generate.