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