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