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