2003-02-20 David Carlton <carlton@math.stanford.edu>
[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
MS
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. */
a7ec76fe 176 if (found_pathname != NULL && temp_pathname != NULL)
4fcf66da 177 *found_pathname = xstrdup (temp_pathname);
e4f7b8c8
MS
178 return found_file;
179}
180
181
c906108c
SS
182/*
183
c5aa993b 184 LOCAL FUNCTION
c906108c 185
c5aa993b 186 solib_map_sections -- open bfd and build sections for shared lib
c906108c 187
c5aa993b 188 SYNOPSIS
c906108c 189
c5aa993b 190 static int solib_map_sections (struct so_list *so)
c906108c 191
c5aa993b 192 DESCRIPTION
c906108c 193
c5aa993b
JM
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.
c906108c 199
c5aa993b 200 FIXMES
c906108c 201
c5aa993b
JM
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?).
c906108c
SS
207 */
208
209static int
4efb68b1 210solib_map_sections (void *arg)
c906108c
SS
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;
c5aa993b
JM
219
220 filename = tilde_expand (so->so_name);
221
b8c9b27d 222 old_chain = make_cleanup (xfree, filename);
e4f7b8c8 223 scratch_chan = solib_open (filename, &scratch_pathname);
c906108c 224
c906108c
SS
225 if (scratch_chan < 0)
226 {
13437d4b
KB
227 perror_with_name (filename);
228 }
104c1213 229
e4f7b8c8 230 /* Leave scratch_pathname allocated. abfd->name will point to it. */
13437d4b
KB
231 abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
232 if (!abfd)
23e04971 233 {
13437d4b
KB
234 close (scratch_chan);
235 error ("Could not open `%s' as an executable file: %s",
236 scratch_pathname, bfd_errmsg (bfd_get_error ()));
237 }
e4f7b8c8 238
13437d4b
KB
239 /* Leave bfd open, core_xfer_memory and "info files" need it. */
240 so->abfd = abfd;
81a9a963 241 abfd->cacheable = 1;
23e04971 242
e4f7b8c8
MS
243 /* copy full path name into so_name, so that later symbol_file_add
244 can find it */
13437d4b
KB
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);
23e04971 248
13437d4b
KB
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 ()));
23e04971 253 }
13437d4b 254 if (build_section_table (abfd, &so->sections, &so->sections_end))
23e04971 255 {
13437d4b
KB
256 error ("Can't find the file sections in `%s': %s",
257 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
23e04971 258 }
104c1213 259
13437d4b 260 for (p = so->sections; p < so->sections_end; p++)
104c1213 261 {
13437d4b
KB
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. */
749499cb 265 TARGET_SO_RELOCATE_SECTION_ADDRESSES (so, p);
13437d4b
KB
266 if (STREQ (p->the_bfd_section->name, ".text"))
267 {
268 so->textsection = p;
269 }
104c1213
JM
270 }
271
13437d4b
KB
272 /* Free the file names, close the file now. */
273 do_cleanups (old_chain);
104c1213 274
13437d4b 275 return (1);
104c1213 276}
c906108c 277
07cd4b97 278/* LOCAL FUNCTION
c906108c 279
07cd4b97 280 free_so --- free a `struct so_list' object
c906108c 281
c5aa993b 282 SYNOPSIS
c906108c 283
07cd4b97 284 void free_so (struct so_list *so)
c906108c 285
c5aa993b 286 DESCRIPTION
c906108c 287
07cd4b97
JB
288 Free the storage associated with the `struct so_list' object SO.
289 If we have opened a BFD for SO, close it.
c906108c 290
07cd4b97
JB
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.
c906108c 294
07cd4b97
JB
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
13437d4b 299void
07cd4b97 300free_so (struct so_list *so)
c906108c 301{
07cd4b97 302 char *bfd_filename = 0;
c5aa993b 303
07cd4b97 304 if (so->sections)
b8c9b27d 305 xfree (so->sections);
07cd4b97
JB
306
307 if (so->abfd)
c906108c 308 {
07cd4b97
JB
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 ()));
c906108c 313 }
07cd4b97
JB
314
315 if (bfd_filename)
b8c9b27d 316 xfree (bfd_filename);
07cd4b97 317
13437d4b 318 TARGET_SO_FREE_SO (so);
07cd4b97 319
b8c9b27d 320 xfree (so);
c906108c
SS
321}
322
07cd4b97 323
c906108c
SS
324/* A small stub to get us past the arg-passing pinhole of catch_errors. */
325
326static int
4efb68b1 327symbol_add_stub (void *arg)
c906108c 328{
07cd4b97 329 register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
62557bbc 330 struct section_addr_info *sap;
c906108c 331
07cd4b97
JB
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
62557bbc
KB
339 sap = build_section_addr_info_from_section_table (so->sections,
340 so->sections_end);
e7cf9df1 341
62557bbc
KB
342 so->objfile = symbol_file_add (so->so_name, so->from_tty,
343 sap, 0, OBJF_SHARED);
344 free_section_addr_info (sap);
c906108c 345
07cd4b97 346 return (1);
c906108c
SS
347}
348
c906108c 349
07cd4b97 350/* LOCAL FUNCTION
c906108c 351
105b175f 352 update_solib_list --- synchronize GDB's shared object list with inferior's
c906108c 353
c5aa993b 354 SYNOPSIS
c906108c 355
105b175f 356 void update_solib_list (int from_tty, struct target_ops *TARGET)
c906108c 357
07cd4b97 358 Extract the list of currently loaded shared objects from the
105b175f
JB
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.
c906108c 362
105b175f
JB
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.
07cd4b97
JB
368
369 If FROM_TTY is non-null, feel free to print messages about what
370 we're doing.
c906108c 371
07cd4b97
JB
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. */
c906108c 378
07cd4b97 379void
105b175f 380update_solib_list (int from_tty, struct target_ops *target)
07cd4b97 381{
13437d4b 382 struct so_list *inferior = TARGET_SO_CURRENT_SOS ();
07cd4b97
JB
383 struct so_list *gdb, **gdb_link;
384
104c1213
JM
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)
4efb68b1 390 catch_errors (TARGET_SO_OPEN_SYMBOL_FILE_OBJECT, &from_tty,
104c1213
JM
391 "Error reading attached process's symbol file.\n",
392 RETURN_MASK_ALL);
393
07cd4b97
JB
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;
c906108c 401 }
c5aa993b 402
07cd4b97
JB
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
105b175f
JB
409 knows about it already, and it's still loaded in the inferior.
410 Nothing needs to happen.
07cd4b97
JB
411
412 - A shared object appears only on GDB's list. This means that
105b175f
JB
413 the inferior has unloaded it. We should remove the shared
414 object from GDB's tables.
07cd4b97
JB
415
416 - A shared object appears only on the inferior's list. This
105b175f
JB
417 means that it's just been loaded. We should add it to GDB's
418 tables.
07cd4b97
JB
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)
c906108c 430 {
07cd4b97
JB
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)
c906108c 437 {
07cd4b97
JB
438 if (! strcmp (gdb->so_original_name, i->so_original_name))
439 break;
440
441 i_link = &i->next;
442 i = *i_link;
c906108c 443 }
c5aa993b 444
07cd4b97
JB
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)
c906108c 449 {
07cd4b97 450 *i_link = i->next;
07cd4b97
JB
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;
07cd4b97
JB
460
461 /* Unless the user loaded it explicitly, free SO's objfile. */
e8930304 462 if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED))
07cd4b97
JB
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;
c906108c
SS
471 }
472 }
c5aa993b 473
07cd4b97
JB
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
e8930304 476 to GDB's shared object list. */
07cd4b97 477 if (inferior)
c906108c 478 {
07cd4b97
JB
479 struct so_list *i;
480
481 /* Add the new shared objects to GDB's list. */
482 *gdb_link = inferior;
483
e8930304 484 /* Fill in the rest of each of the `struct so_list' nodes. */
07cd4b97 485 for (i = inferior; i; i = i->next)
c906108c 486 {
07cd4b97
JB
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);
07cd4b97 493
b41be06e
ND
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)
c906108c 499 {
b41be06e
ND
500 int count = (i->sections_end - i->sections);
501 if (count > 0)
07cd4b97 502 {
b41be06e 503 int space = target_resize_to_sections (target, count);
07cd4b97
JB
504 memcpy (target->to_sections + space,
505 i->sections,
506 count * sizeof (i->sections[0]));
07cd4b97 507 }
c906108c
SS
508 }
509 }
e8930304 510 }
105b175f
JB
511}
512
513
514/* GLOBAL FUNCTION
515
516 solib_add -- read in symbol info for newly added shared libraries
517
518 SYNOPSIS
519
990f9fe3
FF
520 void solib_add (char *pattern, int from_tty, struct target_ops
521 *TARGET, int readsyms)
105b175f
JB
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
990f9fe3
FF
529 If READSYMS is 0, defer reading symbolic information until later
530 but still do any needed low level processing.
531
105b175f
JB
532 FROM_TTY and TARGET are as described for update_solib_list, above. */
533
534void
990f9fe3 535solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
105b175f
JB
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);
c906108c 548
105b175f
JB
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. */
e8930304
JB
552 {
553 int any_matches = 0;
554 int loaded_any_symbols = 0;
c906108c 555
e8930304
JB
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 }
990f9fe3 567 else if (readsyms)
e8930304
JB
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
13437d4b 593 TARGET_SO_SPECIAL_SYMBOL_HANDLING ();
e8930304
JB
594 }
595 }
c906108c
SS
596}
597
07cd4b97 598
c906108c
SS
599/*
600
c5aa993b 601 LOCAL FUNCTION
c906108c 602
c5aa993b 603 info_sharedlibrary_command -- code for "info sharedlibrary"
c906108c 604
c5aa993b 605 SYNOPSIS
c906108c 606
c5aa993b 607 static void info_sharedlibrary_command ()
c906108c 608
c5aa993b 609 DESCRIPTION
c906108c 610
c5aa993b
JM
611 Walk through the shared library list and print information
612 about each attached library.
613 */
c906108c
SS
614
615static void
fba45db2 616info_sharedlibrary_command (char *ignore, int from_tty)
c906108c 617{
c5aa993b 618 register struct so_list *so = NULL; /* link map state variable */
c906108c
SS
619 int header_done = 0;
620 int addr_width;
621 char *addr_fmt;
622
c7cccb76 623 if (TARGET_PTR_BIT == 32)
f5b8946c
MS
624 {
625 addr_width = 8 + 4;
626 addr_fmt = "08l";
627 }
c7cccb76 628 else if (TARGET_PTR_BIT == 64)
f5b8946c
MS
629 {
630 addr_width = 16 + 4;
631 addr_fmt = "016l";
632 }
7f7e9482
AC
633 else
634 {
8e65ff28 635 internal_error (__FILE__, __LINE__,
c7cccb76
MS
636 "TARGET_PTR_BIT returned unknown size %d",
637 TARGET_PTR_BIT);
7f7e9482 638 }
c906108c 639
105b175f 640 update_solib_list (from_tty, 0);
07cd4b97
JB
641
642 for (so = so_list_head; so; so = so->next)
c906108c 643 {
c5aa993b 644 if (so->so_name[0])
c906108c
SS
645 {
646 if (!header_done)
647 {
c5aa993b
JM
648 printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
649 addr_width, "To", "Syms Read",
650 "Shared Object Library");
c906108c
SS
651 header_done++;
652 }
653
654 printf_unfiltered ("%-*s", addr_width,
749499cb 655 so->textsection != NULL
14a5e767 656 ? local_hex_string_custom (
a43ad351 657 (LONGEST) so->textsection->addr,
749499cb
KB
658 addr_fmt)
659 : "");
c906108c 660 printf_unfiltered ("%-*s", addr_width,
749499cb 661 so->textsection != NULL
14a5e767 662 ? local_hex_string_custom (
a43ad351 663 (LONGEST) so->textsection->endaddr,
749499cb
KB
664 addr_fmt)
665 : "");
c5aa993b
JM
666 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
667 printf_unfiltered ("%s\n", so->so_name);
c906108c
SS
668 }
669 }
670 if (so_list_head == NULL)
671 {
c5aa993b 672 printf_unfiltered ("No shared libraries loaded at this time.\n");
c906108c
SS
673 }
674}
675
676/*
677
c5aa993b 678 GLOBAL FUNCTION
c906108c 679
c5aa993b 680 solib_address -- check to see if an address is in a shared lib
c906108c 681
c5aa993b 682 SYNOPSIS
c906108c 683
c5aa993b 684 char * solib_address (CORE_ADDR address)
c906108c 685
c5aa993b 686 DESCRIPTION
c906108c 687
c5aa993b
JM
688 Provides a hook for other gdb routines to discover whether or
689 not a particular address is within the mapped address space of
749499cb 690 a shared library.
c906108c 691
c5aa993b
JM
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.
c906108c
SS
695 */
696
697char *
fba45db2 698solib_address (CORE_ADDR address)
c906108c 699{
c5aa993b
JM
700 register struct so_list *so = 0; /* link map state variable */
701
07cd4b97 702 for (so = so_list_head; so; so = so->next)
c906108c 703 {
749499cb
KB
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 }
c906108c 711 }
07cd4b97 712
c906108c
SS
713 return (0);
714}
715
716/* Called by free_all_symtabs */
717
c5aa993b 718void
fba45db2 719clear_solib (void)
c906108c 720{
085dd6e6
JM
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
c906108c
SS
745 while (so_list_head)
746 {
07cd4b97
JB
747 struct so_list *so = so_list_head;
748 so_list_head = so->next;
2069d78d
KB
749 if (so->abfd)
750 remove_target_sections (so->abfd);
07cd4b97 751 free_so (so);
c906108c 752 }
07cd4b97 753
13437d4b 754 TARGET_SO_CLEAR_SOLIB ();
c906108c
SS
755}
756
757static void
4efb68b1 758do_clear_solib (void *dummy)
c906108c
SS
759{
760 solib_cleanup_queued = 0;
761 clear_solib ();
762}
763
13437d4b 764/* GLOBAL FUNCTION
c5aa993b
JM
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
13437d4b 777 SOLIB_CREATE_INFERIOR_HOOK. */
c5aa993b
JM
778
779void
fba45db2 780solib_create_inferior_hook (void)
c906108c 781{
13437d4b 782 TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK ();
c906108c
SS
783}
784
d7fa2ae2
KB
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}
c906108c
SS
806
807/*
808
c5aa993b 809 LOCAL FUNCTION
c906108c 810
c5aa993b 811 sharedlibrary_command -- handle command to explicitly add library
c906108c 812
c5aa993b 813 SYNOPSIS
c906108c 814
c5aa993b 815 static void sharedlibrary_command (char *args, int from_tty)
c906108c 816
c5aa993b 817 DESCRIPTION
c906108c 818
c5aa993b 819 */
c906108c
SS
820
821static void
fba45db2 822sharedlibrary_command (char *args, int from_tty)
c906108c
SS
823{
824 dont_repeat ();
990f9fe3 825 solib_add (args, from_tty, (struct target_ops *) 0, 1);
c906108c
SS
826}
827
cb0ba49e
MS
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
c60a7562
MS
840void
841no_shared_libraries (char *ignored, int from_tty)
842{
843 objfile_purge_solibs ();
844 do_clear_solib (NULL);
845}
c906108c
SS
846
847void
fba45db2 848_initialize_solib (void)
c906108c 849{
fa58ee11
EZ
850 struct cmd_list_element *c;
851
c906108c
SS
852 add_com ("sharedlibrary", class_files, sharedlibrary_command,
853 "Load shared object library symbols for files matching REGEXP.");
c5aa993b 854 add_info ("sharedlibrary", info_sharedlibrary_command,
c906108c 855 "Status of loaded shared object libraries.");
c60a7562 856 add_com ("nosharedlibrary", class_files, no_shared_libraries,
e89a4777 857 "Unload all shared object library symbols.");
c906108c
SS
858
859 add_show_from_set
b7209cb4 860 (add_set_cmd ("auto-solib-add", class_support, var_boolean,
c906108c
SS
861 (char *) &auto_solib_add,
862 "Set autoloading of shared library symbols.\n\
b7209cb4
FF
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'.",
c906108c
SS
867 &setlist),
868 &showlist);
869
fa58ee11
EZ
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\
c906108c 873For other (relative) files, you can add values using `set solib-search-path'.",
fa58ee11
EZ
874 &setlist);
875 add_show_from_set (c, &showlist);
5ba2abeb 876 set_cmd_completer (c, filename_completer);
c906108c 877
030292b7
DJ
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
fa58ee11
EZ
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);
5ba2abeb 888 set_cmd_completer (c, filename_completer);
c906108c 889}
This page took 0.488829 seconds and 4 git commands to generate.