2003-05-19 David Carlton <carlton@bactrian.org>
[deliverable/binutils-gdb.git] / gdb / solib.c
CommitLineData
13437d4b 1/* Handle shared libraries for GDB, the GNU Debugger.
14a5e767
AC
2
3 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
030292b7 4 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
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.
c906108c 12
c5aa993b
JM
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. */
c906108c 22
c906108c
SS
23#include "defs.h"
24
c906108c 25#include <sys/types.h>
c906108c 26#include <fcntl.h>
13437d4b 27#include "gdb_string.h"
c906108c
SS
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"
88987551 36#include "gdb_regex.h"
c906108c
SS
37#include "inferior.h"
38#include "environ.h"
39#include "language.h"
40#include "gdbcmd.h"
fa58ee11 41#include "completer.h"
fe4e3eb8 42#include "filenames.h" /* for DOSish file names */
c906108c 43
13437d4b 44#include "solist.h"
38017ce8 45#include <readline/readline.h>
c906108c 46
13437d4b 47/* external data declarations */
c906108c 48
13437d4b
KB
49/* FIXME: gdbarch needs to control this variable */
50struct target_so_ops *current_target_so_ops;
23e04971
MS
51
52/* local data declarations */
07cd4b97 53
c906108c 54static struct so_list *so_list_head; /* List of known shared objects */
23e04971 55
c5aa993b 56static int solib_cleanup_queued = 0; /* make_run_cleanup called */
c906108c 57
c906108c
SS
58/* Local function prototypes */
59
4efb68b1 60static void do_clear_solib (void *);
c906108c 61
c906108c
SS
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
e4f7b8c8
MS
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.
b21f0843 92 * If path is absolute or relative, look for it literally (unmodified).
e4f7b8c8
MS
93 * Look in SOLIB_SEARCH_PATH.
94 * Look in inferior's $PATH.
95 * Look in inferior's $LD_LIBRARY_PATH.
96
97 RETURNS
b21f0843 98
e4f7b8c8
MS
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;
fe4e3eb8 106 char *p = in_pathname;
e4f7b8c8 107
fe4e3eb8
EZ
108 while (*p && !IS_DIR_SEPARATOR (*p))
109 p++;
110
111 if (*p)
e4f7b8c8 112 {
fe4e3eb8 113 if (! IS_ABSOLUTE_PATH (in_pathname) || solib_absolute_prefix == NULL)
a7ec76fe
KB
114 temp_pathname = in_pathname;
115 else
116 {
b21f0843 117 int prefix_len = strlen (solib_absolute_prefix);
a7ec76fe
KB
118
119 /* Remove trailing slashes from absolute prefix. */
b21f0843 120 while (prefix_len > 0
fe4e3eb8 121 && IS_DIR_SEPARATOR (solib_absolute_prefix[prefix_len - 1]))
a7ec76fe
KB
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);
a7ec76fe 129 }
b21f0843 130
e4f7b8c8
MS
131 /* Now see if we can open it. */
132 found_file = open (temp_pathname, O_RDONLY, 0);
133 }
134
ba5f0d88
OF
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
e4f7b8c8
MS
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);
ba5f0d88
OF
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);
e4f7b8c8 162
2610b0bf
KW
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
e4f7b8c8
MS
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. */
a7ec76fe 181 if (found_pathname != NULL && temp_pathname != NULL)
4fcf66da 182 *found_pathname = xstrdup (temp_pathname);
e4f7b8c8
MS
183 return found_file;
184}
185
186
c906108c
SS
187/*
188
c5aa993b 189 LOCAL FUNCTION
c906108c 190
c5aa993b 191 solib_map_sections -- open bfd and build sections for shared lib
c906108c 192
c5aa993b 193 SYNOPSIS
c906108c 194
c5aa993b 195 static int solib_map_sections (struct so_list *so)
c906108c 196
c5aa993b 197 DESCRIPTION
c906108c 198
c5aa993b
JM
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.
c906108c 204
c5aa993b 205 FIXMES
c906108c 206
c5aa993b
JM
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?).
c906108c
SS
212 */
213
214static int
4efb68b1 215solib_map_sections (void *arg)
c906108c
SS
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;
c5aa993b
JM
224
225 filename = tilde_expand (so->so_name);
226
b8c9b27d 227 old_chain = make_cleanup (xfree, filename);
e4f7b8c8 228 scratch_chan = solib_open (filename, &scratch_pathname);
c906108c 229
c906108c
SS
230 if (scratch_chan < 0)
231 {
13437d4b
KB
232 perror_with_name (filename);
233 }
104c1213 234
e4f7b8c8 235 /* Leave scratch_pathname allocated. abfd->name will point to it. */
13437d4b
KB
236 abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
237 if (!abfd)
23e04971 238 {
13437d4b
KB
239 close (scratch_chan);
240 error ("Could not open `%s' as an executable file: %s",
241 scratch_pathname, bfd_errmsg (bfd_get_error ()));
242 }
e4f7b8c8 243
13437d4b
KB
244 /* Leave bfd open, core_xfer_memory and "info files" need it. */
245 so->abfd = abfd;
81a9a963 246 abfd->cacheable = 1;
23e04971 247
e4f7b8c8
MS
248 /* copy full path name into so_name, so that later symbol_file_add
249 can find it */
13437d4b
KB
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);
23e04971 253
13437d4b
KB
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 ()));
23e04971 258 }
13437d4b 259 if (build_section_table (abfd, &so->sections, &so->sections_end))
23e04971 260 {
13437d4b
KB
261 error ("Can't find the file sections in `%s': %s",
262 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
23e04971 263 }
104c1213 264
13437d4b 265 for (p = so->sections; p < so->sections_end; p++)
104c1213 266 {
13437d4b
KB
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. */
749499cb 270 TARGET_SO_RELOCATE_SECTION_ADDRESSES (so, p);
13437d4b
KB
271 if (STREQ (p->the_bfd_section->name, ".text"))
272 {
273 so->textsection = p;
274 }
104c1213
JM
275 }
276
13437d4b
KB
277 /* Free the file names, close the file now. */
278 do_cleanups (old_chain);
104c1213 279
13437d4b 280 return (1);
104c1213 281}
c906108c 282
07cd4b97 283/* LOCAL FUNCTION
c906108c 284
07cd4b97 285 free_so --- free a `struct so_list' object
c906108c 286
c5aa993b 287 SYNOPSIS
c906108c 288
07cd4b97 289 void free_so (struct so_list *so)
c906108c 290
c5aa993b 291 DESCRIPTION
c906108c 292
07cd4b97
JB
293 Free the storage associated with the `struct so_list' object SO.
294 If we have opened a BFD for SO, close it.
c906108c 295
07cd4b97
JB
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.
c906108c 299
07cd4b97
JB
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
13437d4b 304void
07cd4b97 305free_so (struct so_list *so)
c906108c 306{
07cd4b97 307 char *bfd_filename = 0;
c5aa993b 308
07cd4b97 309 if (so->sections)
b8c9b27d 310 xfree (so->sections);
07cd4b97
JB
311
312 if (so->abfd)
c906108c 313 {
07cd4b97
JB
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 ()));
c906108c 318 }
07cd4b97
JB
319
320 if (bfd_filename)
b8c9b27d 321 xfree (bfd_filename);
07cd4b97 322
13437d4b 323 TARGET_SO_FREE_SO (so);
07cd4b97 324
b8c9b27d 325 xfree (so);
c906108c
SS
326}
327
07cd4b97 328
c906108c
SS
329/* A small stub to get us past the arg-passing pinhole of catch_errors. */
330
331static int
4efb68b1 332symbol_add_stub (void *arg)
c906108c 333{
07cd4b97 334 register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
62557bbc 335 struct section_addr_info *sap;
c906108c 336
07cd4b97
JB
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
62557bbc
KB
344 sap = build_section_addr_info_from_section_table (so->sections,
345 so->sections_end);
e7cf9df1 346
62557bbc
KB
347 so->objfile = symbol_file_add (so->so_name, so->from_tty,
348 sap, 0, OBJF_SHARED);
349 free_section_addr_info (sap);
c906108c 350
07cd4b97 351 return (1);
c906108c
SS
352}
353
c906108c 354
07cd4b97 355/* LOCAL FUNCTION
c906108c 356
105b175f 357 update_solib_list --- synchronize GDB's shared object list with inferior's
c906108c 358
c5aa993b 359 SYNOPSIS
c906108c 360
105b175f 361 void update_solib_list (int from_tty, struct target_ops *TARGET)
c906108c 362
07cd4b97 363 Extract the list of currently loaded shared objects from the
105b175f
JB
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.
c906108c 367
105b175f
JB
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.
07cd4b97
JB
373
374 If FROM_TTY is non-null, feel free to print messages about what
375 we're doing.
c906108c 376
07cd4b97
JB
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. */
c906108c 383
07cd4b97 384void
105b175f 385update_solib_list (int from_tty, struct target_ops *target)
07cd4b97 386{
13437d4b 387 struct so_list *inferior = TARGET_SO_CURRENT_SOS ();
07cd4b97
JB
388 struct so_list *gdb, **gdb_link;
389
104c1213
JM
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)
4efb68b1 395 catch_errors (TARGET_SO_OPEN_SYMBOL_FILE_OBJECT, &from_tty,
104c1213
JM
396 "Error reading attached process's symbol file.\n",
397 RETURN_MASK_ALL);
398
07cd4b97
JB
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;
c906108c 406 }
c5aa993b 407
07cd4b97
JB
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
105b175f
JB
414 knows about it already, and it's still loaded in the inferior.
415 Nothing needs to happen.
07cd4b97
JB
416
417 - A shared object appears only on GDB's list. This means that
105b175f
JB
418 the inferior has unloaded it. We should remove the shared
419 object from GDB's tables.
07cd4b97
JB
420
421 - A shared object appears only on the inferior's list. This
105b175f
JB
422 means that it's just been loaded. We should add it to GDB's
423 tables.
07cd4b97
JB
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)
c906108c 435 {
07cd4b97
JB
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)
c906108c 442 {
07cd4b97
JB
443 if (! strcmp (gdb->so_original_name, i->so_original_name))
444 break;
445
446 i_link = &i->next;
447 i = *i_link;
c906108c 448 }
c5aa993b 449
07cd4b97
JB
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)
c906108c 454 {
07cd4b97 455 *i_link = i->next;
07cd4b97
JB
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;
07cd4b97
JB
465
466 /* Unless the user loaded it explicitly, free SO's objfile. */
e8930304 467 if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED))
07cd4b97
JB
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;
c906108c
SS
476 }
477 }
c5aa993b 478
07cd4b97
JB
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
e8930304 481 to GDB's shared object list. */
07cd4b97 482 if (inferior)
c906108c 483 {
07cd4b97
JB
484 struct so_list *i;
485
486 /* Add the new shared objects to GDB's list. */
487 *gdb_link = inferior;
488
e8930304 489 /* Fill in the rest of each of the `struct so_list' nodes. */
07cd4b97 490 for (i = inferior; i; i = i->next)
c906108c 491 {
07cd4b97
JB
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);
07cd4b97 498
b41be06e
ND
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)
c906108c 504 {
b41be06e
ND
505 int count = (i->sections_end - i->sections);
506 if (count > 0)
07cd4b97 507 {
b41be06e 508 int space = target_resize_to_sections (target, count);
07cd4b97
JB
509 memcpy (target->to_sections + space,
510 i->sections,
511 count * sizeof (i->sections[0]));
07cd4b97 512 }
c906108c
SS
513 }
514 }
e8930304 515 }
105b175f
JB
516}
517
518
519/* GLOBAL FUNCTION
520
521 solib_add -- read in symbol info for newly added shared libraries
522
523 SYNOPSIS
524
990f9fe3
FF
525 void solib_add (char *pattern, int from_tty, struct target_ops
526 *TARGET, int readsyms)
105b175f
JB
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
990f9fe3
FF
534 If READSYMS is 0, defer reading symbolic information until later
535 but still do any needed low level processing.
536
105b175f
JB
537 FROM_TTY and TARGET are as described for update_solib_list, above. */
538
539void
990f9fe3 540solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
105b175f
JB
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);
c906108c 553
105b175f
JB
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. */
e8930304
JB
557 {
558 int any_matches = 0;
559 int loaded_any_symbols = 0;
c906108c 560
e8930304
JB
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 }
990f9fe3 572 else if (readsyms)
e8930304
JB
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
13437d4b 598 TARGET_SO_SPECIAL_SYMBOL_HANDLING ();
e8930304
JB
599 }
600 }
c906108c
SS
601}
602
07cd4b97 603
c906108c
SS
604/*
605
c5aa993b 606 LOCAL FUNCTION
c906108c 607
c5aa993b 608 info_sharedlibrary_command -- code for "info sharedlibrary"
c906108c 609
c5aa993b 610 SYNOPSIS
c906108c 611
c5aa993b 612 static void info_sharedlibrary_command ()
c906108c 613
c5aa993b 614 DESCRIPTION
c906108c 615
c5aa993b
JM
616 Walk through the shared library list and print information
617 about each attached library.
618 */
c906108c
SS
619
620static void
fba45db2 621info_sharedlibrary_command (char *ignore, int from_tty)
c906108c 622{
c5aa993b 623 register struct so_list *so = NULL; /* link map state variable */
c906108c
SS
624 int header_done = 0;
625 int addr_width;
626 char *addr_fmt;
627
c7cccb76 628 if (TARGET_PTR_BIT == 32)
f5b8946c
MS
629 {
630 addr_width = 8 + 4;
631 addr_fmt = "08l";
632 }
c7cccb76 633 else if (TARGET_PTR_BIT == 64)
f5b8946c
MS
634 {
635 addr_width = 16 + 4;
636 addr_fmt = "016l";
637 }
7f7e9482
AC
638 else
639 {
8e65ff28 640 internal_error (__FILE__, __LINE__,
c7cccb76
MS
641 "TARGET_PTR_BIT returned unknown size %d",
642 TARGET_PTR_BIT);
7f7e9482 643 }
c906108c 644
105b175f 645 update_solib_list (from_tty, 0);
07cd4b97
JB
646
647 for (so = so_list_head; so; so = so->next)
c906108c 648 {
c5aa993b 649 if (so->so_name[0])
c906108c
SS
650 {
651 if (!header_done)
652 {
c5aa993b
JM
653 printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
654 addr_width, "To", "Syms Read",
655 "Shared Object Library");
c906108c
SS
656 header_done++;
657 }
658
659 printf_unfiltered ("%-*s", addr_width,
749499cb 660 so->textsection != NULL
14a5e767 661 ? local_hex_string_custom (
a43ad351 662 (LONGEST) so->textsection->addr,
749499cb
KB
663 addr_fmt)
664 : "");
c906108c 665 printf_unfiltered ("%-*s", addr_width,
749499cb 666 so->textsection != NULL
14a5e767 667 ? local_hex_string_custom (
a43ad351 668 (LONGEST) so->textsection->endaddr,
749499cb
KB
669 addr_fmt)
670 : "");
c5aa993b
JM
671 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
672 printf_unfiltered ("%s\n", so->so_name);
c906108c
SS
673 }
674 }
675 if (so_list_head == NULL)
676 {
c5aa993b 677 printf_unfiltered ("No shared libraries loaded at this time.\n");
c906108c
SS
678 }
679}
680
681/*
682
c5aa993b 683 GLOBAL FUNCTION
c906108c 684
c5aa993b 685 solib_address -- check to see if an address is in a shared lib
c906108c 686
c5aa993b 687 SYNOPSIS
c906108c 688
c5aa993b 689 char * solib_address (CORE_ADDR address)
c906108c 690
c5aa993b 691 DESCRIPTION
c906108c 692
c5aa993b
JM
693 Provides a hook for other gdb routines to discover whether or
694 not a particular address is within the mapped address space of
749499cb 695 a shared library.
c906108c 696
c5aa993b
JM
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.
c906108c
SS
700 */
701
702char *
fba45db2 703solib_address (CORE_ADDR address)
c906108c 704{
c5aa993b
JM
705 register struct so_list *so = 0; /* link map state variable */
706
07cd4b97 707 for (so = so_list_head; so; so = so->next)
c906108c 708 {
749499cb
KB
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 }
c906108c 716 }
07cd4b97 717
c906108c
SS
718 return (0);
719}
720
721/* Called by free_all_symtabs */
722
c5aa993b 723void
fba45db2 724clear_solib (void)
c906108c 725{
085dd6e6
JM
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
c906108c
SS
750 while (so_list_head)
751 {
07cd4b97
JB
752 struct so_list *so = so_list_head;
753 so_list_head = so->next;
2069d78d
KB
754 if (so->abfd)
755 remove_target_sections (so->abfd);
07cd4b97 756 free_so (so);
c906108c 757 }
07cd4b97 758
13437d4b 759 TARGET_SO_CLEAR_SOLIB ();
c906108c
SS
760}
761
762static void
4efb68b1 763do_clear_solib (void *dummy)
c906108c
SS
764{
765 solib_cleanup_queued = 0;
766 clear_solib ();
767}
768
13437d4b 769/* GLOBAL FUNCTION
c5aa993b
JM
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
13437d4b 782 SOLIB_CREATE_INFERIOR_HOOK. */
c5aa993b
JM
783
784void
fba45db2 785solib_create_inferior_hook (void)
c906108c 786{
13437d4b 787 TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK ();
c906108c
SS
788}
789
d7fa2ae2
KB
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
806int
807in_solib_dynsym_resolve_code (CORE_ADDR pc)
808{
809 return TARGET_SO_IN_DYNSYM_RESOLVE_CODE (pc);
810}
c906108c
SS
811
812/*
813
c5aa993b 814 LOCAL FUNCTION
c906108c 815
c5aa993b 816 sharedlibrary_command -- handle command to explicitly add library
c906108c 817
c5aa993b 818 SYNOPSIS
c906108c 819
c5aa993b 820 static void sharedlibrary_command (char *args, int from_tty)
c906108c 821
c5aa993b 822 DESCRIPTION
c906108c 823
c5aa993b 824 */
c906108c
SS
825
826static void
fba45db2 827sharedlibrary_command (char *args, int from_tty)
c906108c
SS
828{
829 dont_repeat ();
990f9fe3 830 solib_add (args, from_tty, (struct target_ops *) 0, 1);
c906108c
SS
831}
832
cb0ba49e
MS
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
c60a7562
MS
845void
846no_shared_libraries (char *ignored, int from_tty)
847{
848 objfile_purge_solibs ();
849 do_clear_solib (NULL);
850}
c906108c 851
cf466558
KB
852static void
853reload_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
c906108c 859void
fba45db2 860_initialize_solib (void)
c906108c 861{
fa58ee11
EZ
862 struct cmd_list_element *c;
863
c906108c
SS
864 add_com ("sharedlibrary", class_files, sharedlibrary_command,
865 "Load shared object library symbols for files matching REGEXP.");
c5aa993b 866 add_info ("sharedlibrary", info_sharedlibrary_command,
c906108c 867 "Status of loaded shared object libraries.");
c60a7562 868 add_com ("nosharedlibrary", class_files, no_shared_libraries,
e89a4777 869 "Unload all shared object library symbols.");
c906108c
SS
870
871 add_show_from_set
b7209cb4 872 (add_set_cmd ("auto-solib-add", class_support, var_boolean,
c906108c
SS
873 (char *) &auto_solib_add,
874 "Set autoloading of shared library symbols.\n\
b7209cb4
FF
875If \"on\", symbols from all shared object libraries will be loaded\n\
876automatically when the inferior begins execution, when the dynamic linker\n\
877informs gdb that a new library has been loaded, or when attaching to the\n\
878inferior. Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
c906108c
SS
879 &setlist),
880 &showlist);
881
fa58ee11
EZ
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\
c906108c 885For other (relative) files, you can add values using `set solib-search-path'.",
fa58ee11
EZ
886 &setlist);
887 add_show_from_set (c, &showlist);
cf466558 888 set_cmd_cfunc (c, reload_shared_libraries);
5ba2abeb 889 set_cmd_completer (c, filename_completer);
c906108c 890
030292b7
DJ
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
fa58ee11
EZ
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\
898This takes precedence over the environment variables PATH and LD_LIBRARY_PATH.",
899 &setlist);
900 add_show_from_set (c, &showlist);
cf466558 901 set_cmd_cfunc (c, reload_shared_libraries);
5ba2abeb 902 set_cmd_completer (c, filename_completer);
c906108c 903}
This page took 0.359026 seconds and 4 git commands to generate.