b9fba613304c378dcaf8873f73ed3781fb6077a1
[deliverable/binutils-gdb.git] / gdb / osfsolib.c
1 /* Handle OSF/1 shared libraries for GDB, the GNU Debugger.
2 Copyright 1993, 94, 95, 96, 98, 1999 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 /* FIXME: Most of this code could be merged with solib.c by using
22 next_link_map_member and xfer_link_map_member in solib.c. */
23
24 #include "defs.h"
25
26 #include <sys/types.h>
27 #include <signal.h>
28 #include "gdb_string.h"
29 #include <fcntl.h>
30
31 #include "symtab.h"
32 #include "bfd.h"
33 #include "symfile.h"
34 #include "objfiles.h"
35 #include "gdbcore.h"
36 #include "command.h"
37 #include "target.h"
38 #include "frame.h"
39 #include "gnu-regex.h"
40 #include "inferior.h"
41 #include "language.h"
42 #include "gdbcmd.h"
43
44 #define MAX_PATH_SIZE 1024 /* FIXME: Should be dynamic */
45
46 /* When handling shared libraries, GDB has to find out the pathnames
47 of all shared libraries that are currently loaded (to read in their
48 symbols) and where the shared libraries are loaded in memory
49 (to relocate them properly from their prelinked addresses to the
50 current load address).
51
52 Under OSF/1 there are two possibilities to get at this information:
53 1) Peek around in the runtime loader structures.
54 These are not documented, and they are not defined in the system
55 header files. The definitions below were obtained by experimentation,
56 but they seem stable enough.
57 2) Use the undocumented libxproc.a library, which contains the
58 equivalent ldr_* routines.
59 This approach is somewhat cleaner, but it requires that the GDB
60 executable is dynamically linked. In addition it requires a
61 NAT_CLIBS= -lxproc -Wl,-expect_unresolved,ldr_process_context
62 linker specification for GDB and all applications that are using
63 libgdb.
64 We will use the peeking approach until it becomes unwieldy. */
65
66 #ifndef USE_LDR_ROUTINES
67
68 /* Definition of runtime loader structures, found by experimentation. */
69 #define RLD_CONTEXT_ADDRESS 0x3ffc0000000
70
71 typedef struct
72 {
73 CORE_ADDR next;
74 CORE_ADDR previous;
75 CORE_ADDR unknown1;
76 char *module_name;
77 CORE_ADDR modinfo_addr;
78 long module_id;
79 CORE_ADDR unknown2;
80 CORE_ADDR unknown3;
81 long region_count;
82 CORE_ADDR regioninfo_addr;
83 }
84 ldr_module_info_t;
85
86 typedef struct
87 {
88 long unknown1;
89 CORE_ADDR regionname_addr;
90 long protection;
91 CORE_ADDR vaddr;
92 CORE_ADDR mapaddr;
93 long size;
94 long unknown2[5];
95 }
96 ldr_region_info_t;
97
98 typedef struct
99 {
100 CORE_ADDR unknown1;
101 CORE_ADDR unknown2;
102 CORE_ADDR head;
103 CORE_ADDR tail;
104 }
105 ldr_context_t;
106
107 static ldr_context_t ldr_context;
108
109 #else
110
111 #include <loader.h>
112 static ldr_process_t fake_ldr_process;
113
114 /* Called by ldr_* routines to read memory from the current target. */
115
116 static int ldr_read_memory PARAMS ((CORE_ADDR, char *, int, int));
117
118 static int
119 ldr_read_memory (memaddr, myaddr, len, readstring)
120 CORE_ADDR memaddr;
121 char *myaddr;
122 int len;
123 int readstring;
124 {
125 int result;
126 char *buffer;
127
128 if (readstring)
129 {
130 target_read_string (memaddr, &buffer, len, &result);
131 if (result == 0)
132 strcpy (myaddr, buffer);
133 free (buffer);
134 }
135 else
136 result = target_read_memory (memaddr, myaddr, len);
137
138 if (result != 0)
139 result = -result;
140 return result;
141 }
142
143 #endif
144
145 /* Define our own link_map structure.
146 This will help to share code with solib.c. */
147
148 struct link_map
149 {
150 CORE_ADDR l_offset; /* prelink to load address offset */
151 char *l_name; /* full name of loaded object */
152 ldr_module_info_t module_info; /* corresponding module info */
153 };
154
155 #define LM_OFFSET(so) ((so) -> lm.l_offset)
156 #define LM_NAME(so) ((so) -> lm.l_name)
157
158 struct so_list
159 {
160 struct so_list *next; /* next structure in linked list */
161 struct link_map lm; /* copy of link map from inferior */
162 struct link_map *lmaddr; /* addr in inferior lm was read from */
163 CORE_ADDR lmend; /* upper addr bound of mapped object */
164 char so_name[MAX_PATH_SIZE]; /* shared object lib name (FIXME) */
165 char symbols_loaded; /* flag: symbols read in yet? */
166 char from_tty; /* flag: print msgs? */
167 struct objfile *objfile; /* objfile for loaded lib */
168 struct section_table *sections;
169 struct section_table *sections_end;
170 struct section_table *textsection;
171 bfd *abfd;
172 };
173
174 static struct so_list *so_list_head; /* List of known shared objects */
175
176 extern int
177 fdmatch PARAMS ((int, int)); /* In libiberty */
178
179 /* Local function prototypes */
180
181 static void
182 sharedlibrary_command PARAMS ((char *, int));
183
184 static void
185 info_sharedlibrary_command PARAMS ((char *, int));
186
187 static int
188 symbol_add_stub PARAMS ((char *));
189
190 static struct so_list *
191 find_solib PARAMS ((struct so_list *));
192
193 static struct link_map *
194 first_link_map_member PARAMS ((void));
195
196 static struct link_map *
197 next_link_map_member PARAMS ((struct so_list *));
198
199 static void
200 xfer_link_map_member PARAMS ((struct so_list *, struct link_map *));
201
202 static int
203 solib_map_sections PARAMS ((char *));
204
205 /*
206
207 LOCAL FUNCTION
208
209 solib_map_sections -- open bfd and build sections for shared lib
210
211 SYNOPSIS
212
213 static int solib_map_sections (struct so_list *so)
214
215 DESCRIPTION
216
217 Given a pointer to one of the shared objects in our list
218 of mapped objects, use the recorded name to open a bfd
219 descriptor for the object, build a section table, and then
220 relocate all the section addresses by the base address at
221 which the shared object was mapped.
222
223 FIXMES
224
225 In most (all?) cases the shared object file name recorded in the
226 dynamic linkage tables will be a fully qualified pathname. For
227 cases where it isn't, do we really mimic the systems search
228 mechanism correctly in the below code (particularly the tilde
229 expansion stuff?).
230 */
231
232 static int
233 solib_map_sections (arg)
234 char *arg;
235 {
236 struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
237 char *filename;
238 char *scratch_pathname;
239 int scratch_chan;
240 struct section_table *p;
241 struct cleanup *old_chain;
242 bfd *abfd;
243
244 filename = tilde_expand (so->so_name);
245 old_chain = make_cleanup (free, filename);
246
247 scratch_chan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0,
248 &scratch_pathname);
249 if (scratch_chan < 0)
250 {
251 scratch_chan = openp (getenv ("LD_LIBRARY_PATH"), 1, filename,
252 O_RDONLY, 0, &scratch_pathname);
253 }
254 if (scratch_chan < 0)
255 {
256 perror_with_name (filename);
257 }
258 /* Leave scratch_pathname allocated. bfd->name will point to it. */
259
260 abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
261 if (!abfd)
262 {
263 close (scratch_chan);
264 error ("Could not open `%s' as an executable file: %s",
265 scratch_pathname, bfd_errmsg (bfd_get_error ()));
266 }
267 /* Leave bfd open, core_xfer_memory and "info files" need it. */
268 so->abfd = abfd;
269 abfd->cacheable = true;
270
271 if (!bfd_check_format (abfd, bfd_object))
272 {
273 error ("\"%s\": not in executable format: %s.",
274 scratch_pathname, bfd_errmsg (bfd_get_error ()));
275 }
276 if (build_section_table (abfd, &so->sections, &so->sections_end))
277 {
278 error ("Can't find the file sections in `%s': %s",
279 bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
280 }
281
282 for (p = so->sections; p < so->sections_end; p++)
283 {
284 /* Relocate the section binding addresses as recorded in the shared
285 object's file by the offset to get the address to which the
286 object was actually mapped. */
287 p->addr += LM_OFFSET (so);
288 p->endaddr += LM_OFFSET (so);
289 so->lmend = (CORE_ADDR) max (p->endaddr, so->lmend);
290 if (STREQ (p->the_bfd_section->name, ".text"))
291 {
292 so->textsection = p;
293 }
294 }
295
296 /* Free the file names, close the file now. */
297 do_cleanups (old_chain);
298
299 return (1);
300 }
301
302 /*
303
304 LOCAL FUNCTION
305
306 first_link_map_member -- locate first member in dynamic linker's map
307
308 SYNOPSIS
309
310 static struct link_map *first_link_map_member (void)
311
312 DESCRIPTION
313
314 Read in a copy of the first member in the inferior's dynamic
315 link map from the inferior's dynamic linker structures, and return
316 a pointer to the copy in our address space.
317 */
318
319 static struct link_map *
320 first_link_map_member ()
321 {
322 struct link_map *lm = NULL;
323 static struct link_map first_lm;
324
325 #ifdef USE_LDR_ROUTINES
326 ldr_module_t mod_id = LDR_NULL_MODULE;
327 size_t retsize;
328
329 fake_ldr_process = ldr_core_process ();
330 ldr_set_core_reader (ldr_read_memory);
331 ldr_xdetach (fake_ldr_process);
332 if (ldr_xattach (fake_ldr_process) != 0
333 || ldr_next_module (fake_ldr_process, &mod_id) != 0
334 || mod_id == LDR_NULL_MODULE
335 || ldr_inq_module (fake_ldr_process, mod_id,
336 &first_lm.module_info, sizeof (ldr_module_info_t),
337 &retsize) != 0)
338 return lm;
339 #else
340 CORE_ADDR ldr_context_addr;
341
342 if (target_read_memory ((CORE_ADDR) RLD_CONTEXT_ADDRESS,
343 (char *) &ldr_context_addr,
344 sizeof (CORE_ADDR)) != 0
345 || target_read_memory (ldr_context_addr,
346 (char *) &ldr_context,
347 sizeof (ldr_context_t)) != 0
348 || target_read_memory ((CORE_ADDR) ldr_context.head,
349 (char *) &first_lm.module_info,
350 sizeof (ldr_module_info_t)) != 0)
351 return lm;
352 #endif
353
354 lm = &first_lm;
355
356 /* The first entry is for the main program and should be skipped. */
357 lm->l_name = NULL;
358
359 return lm;
360 }
361
362 static struct link_map *
363 next_link_map_member (so_list_ptr)
364 struct so_list *so_list_ptr;
365 {
366 struct link_map *lm = NULL;
367 static struct link_map next_lm;
368 #ifdef USE_LDR_ROUTINES
369 ldr_module_t mod_id = so_list_ptr->lm.module_info.lmi_modid;
370 size_t retsize;
371
372 if (ldr_next_module (fake_ldr_process, &mod_id) != 0
373 || mod_id == LDR_NULL_MODULE
374 || ldr_inq_module (fake_ldr_process, mod_id,
375 &next_lm.module_info, sizeof (ldr_module_info_t),
376 &retsize) != 0)
377 return lm;
378
379 lm = &next_lm;
380 lm->l_name = lm->module_info.lmi_name;
381 #else
382 CORE_ADDR ldr_context_addr;
383
384 /* Reread context in case ldr_context.tail was updated. */
385
386 if (target_read_memory ((CORE_ADDR) RLD_CONTEXT_ADDRESS,
387 (char *) &ldr_context_addr,
388 sizeof (CORE_ADDR)) != 0
389 || target_read_memory (ldr_context_addr,
390 (char *) &ldr_context,
391 sizeof (ldr_context_t)) != 0
392 || so_list_ptr->lm.module_info.modinfo_addr == ldr_context.tail
393 || target_read_memory (so_list_ptr->lm.module_info.next,
394 (char *) &next_lm.module_info,
395 sizeof (ldr_module_info_t)) != 0)
396 return lm;
397
398 lm = &next_lm;
399 lm->l_name = lm->module_info.module_name;
400 #endif
401 return lm;
402 }
403
404 static void
405 xfer_link_map_member (so_list_ptr, lm)
406 struct so_list *so_list_ptr;
407 struct link_map *lm;
408 {
409 int i;
410 so_list_ptr->lm = *lm;
411
412 /* OSF/1 shared libraries are pre-linked to particular addresses,
413 but the runtime loader may have to relocate them if the
414 address ranges of the libraries used by the target executable clash,
415 or if the target executable is linked with the -taso option.
416 The offset is the difference between the address where the shared
417 library is mapped and the pre-linked address of the shared library.
418
419 FIXME: GDB is currently unable to relocate the shared library
420 sections by different offsets. If sections are relocated by
421 different offsets, put out a warning and use the offset of the
422 first section for all remaining sections. */
423 LM_OFFSET (so_list_ptr) = 0;
424
425 /* There is one entry that has no name (for the inferior executable)
426 since it is not a shared object. */
427 if (LM_NAME (so_list_ptr) != 0)
428 {
429
430 #ifdef USE_LDR_ROUTINES
431 int len = strlen (LM_NAME (so_list_ptr) + 1);
432
433 if (len > MAX_PATH_SIZE)
434 len = MAX_PATH_SIZE;
435 strncpy (so_list_ptr->so_name, LM_NAME (so_list_ptr), MAX_PATH_SIZE);
436 so_list_ptr->so_name[MAX_PATH_SIZE - 1] = '\0';
437
438 for (i = 0; i < lm->module_info.lmi_nregion; i++)
439 {
440 ldr_region_info_t region_info;
441 size_t retsize;
442 CORE_ADDR region_offset;
443
444 if (ldr_inq_region (fake_ldr_process, lm->module_info.lmi_modid,
445 i, &region_info, sizeof (region_info),
446 &retsize) != 0)
447 break;
448 region_offset = (CORE_ADDR) region_info.lri_mapaddr
449 - (CORE_ADDR) region_info.lri_vaddr;
450 if (i == 0)
451 LM_OFFSET (so_list_ptr) = region_offset;
452 else if (LM_OFFSET (so_list_ptr) != region_offset)
453 warning ("cannot handle shared library relocation for %s (%s)",
454 so_list_ptr->so_name, region_info.lri_name);
455 }
456 #else
457 int errcode;
458 char *buffer;
459 target_read_string ((CORE_ADDR) LM_NAME (so_list_ptr), &buffer,
460 MAX_PATH_SIZE - 1, &errcode);
461 if (errcode != 0)
462 error ("xfer_link_map_member: Can't read pathname for load map: %s\n",
463 safe_strerror (errcode));
464 strncpy (so_list_ptr->so_name, buffer, MAX_PATH_SIZE - 1);
465 free (buffer);
466 so_list_ptr->so_name[MAX_PATH_SIZE - 1] = '\0';
467
468 for (i = 0; i < lm->module_info.region_count; i++)
469 {
470 ldr_region_info_t region_info;
471 CORE_ADDR region_offset;
472
473 if (target_read_memory (lm->module_info.regioninfo_addr
474 + i * sizeof (region_info),
475 (char *) &region_info,
476 sizeof (region_info)) != 0)
477 break;
478 region_offset = region_info.mapaddr - region_info.vaddr;
479 if (i == 0)
480 LM_OFFSET (so_list_ptr) = region_offset;
481 else if (LM_OFFSET (so_list_ptr) != region_offset)
482 {
483 char *region_name;
484 target_read_string (region_info.regionname_addr, &buffer,
485 MAX_PATH_SIZE - 1, &errcode);
486 if (errcode == 0)
487 region_name = buffer;
488 else
489 region_name = "??";
490 warning ("cannot handle shared library relocation for %s (%s)",
491 so_list_ptr->so_name, region_name);
492 free (buffer);
493 }
494 }
495 #endif
496
497 catch_errors (solib_map_sections, (char *) so_list_ptr,
498 "Error while mapping shared library sections:\n",
499 RETURN_MASK_ALL);
500 }
501 }
502
503 /*
504
505 LOCAL FUNCTION
506
507 find_solib -- step through list of shared objects
508
509 SYNOPSIS
510
511 struct so_list *find_solib (struct so_list *so_list_ptr)
512
513 DESCRIPTION
514
515 This module contains the routine which finds the names of any
516 loaded "images" in the current process. The argument in must be
517 NULL on the first call, and then the returned value must be passed
518 in on subsequent calls. This provides the capability to "step" down
519 the list of loaded objects. On the last object, a NULL value is
520 returned.
521
522 The arg and return value are "struct link_map" pointers, as defined
523 in <link.h>.
524 */
525
526 static struct so_list *
527 find_solib (so_list_ptr)
528 struct so_list *so_list_ptr; /* Last lm or NULL for first one */
529 {
530 struct so_list *so_list_next = NULL;
531 struct link_map *lm = NULL;
532 struct so_list *new;
533
534 if (so_list_ptr == NULL)
535 {
536 /* We are setting up for a new scan through the loaded images. */
537 if ((so_list_next = so_list_head) == NULL)
538 {
539 /* Find the first link map list member. */
540 lm = first_link_map_member ();
541 }
542 }
543 else
544 {
545 /* We have been called before, and are in the process of walking
546 the shared library list. Advance to the next shared object. */
547 lm = next_link_map_member (so_list_ptr);
548 so_list_next = so_list_ptr->next;
549 }
550 if ((so_list_next == NULL) && (lm != NULL))
551 {
552 /* Get next link map structure from inferior image and build a local
553 abbreviated load_map structure */
554 new = (struct so_list *) xmalloc (sizeof (struct so_list));
555 memset ((char *) new, 0, sizeof (struct so_list));
556 new->lmaddr = lm;
557 /* Add the new node as the next node in the list, or as the root
558 node if this is the first one. */
559 if (so_list_ptr != NULL)
560 {
561 so_list_ptr->next = new;
562 }
563 else
564 {
565 so_list_head = new;
566 }
567 so_list_next = new;
568 xfer_link_map_member (new, lm);
569 }
570 return (so_list_next);
571 }
572
573 /* A small stub to get us past the arg-passing pinhole of catch_errors. */
574
575 static int
576 symbol_add_stub (arg)
577 char *arg;
578 {
579 register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
580 CORE_ADDR text_addr = 0;
581 struct section_addr_info section_addrs;
582
583 memset (&section_addrs, 0, sizeof (section_addrs));
584 if (so->textsection)
585 text_addr = so->textsection->addr;
586 else if (so->abfd != NULL)
587 {
588 asection *lowest_sect;
589
590 /* If we didn't find a mapped non zero sized .text section, set up
591 text_addr so that the relocation in symbol_file_add does no harm. */
592
593 lowest_sect = bfd_get_section_by_name (so->abfd, ".text");
594 if (lowest_sect == NULL)
595 bfd_map_over_sections (so->abfd, find_lowest_section,
596 (PTR) &lowest_sect);
597 if (lowest_sect)
598 text_addr = bfd_section_vma (so->abfd, lowest_sect) + LM_OFFSET (so);
599 }
600
601 section_addrs.text_addr = text_addr;
602 so->objfile = symbol_file_add (so->so_name, so->from_tty,
603 &section_addrs,
604 0, 0, 0, 1);
605 return (1);
606 }
607
608 /*
609
610 GLOBAL FUNCTION
611
612 solib_add -- add a shared library file to the symtab and section list
613
614 SYNOPSIS
615
616 void solib_add (char *arg_string, int from_tty,
617 struct target_ops *target)
618
619 DESCRIPTION
620
621 */
622
623 void
624 solib_add (arg_string, from_tty, target)
625 char *arg_string;
626 int from_tty;
627 struct target_ops *target;
628 {
629 register struct so_list *so = NULL; /* link map state variable */
630
631 /* Last shared library that we read. */
632 struct so_list *so_last = NULL;
633
634 char *re_err;
635 int count;
636 int old;
637
638 if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
639 {
640 error ("Invalid regexp: %s", re_err);
641 }
642
643
644 /* Add the shared library sections to the section table of the
645 specified target, if any. */
646 if (target)
647 {
648 /* Count how many new section_table entries there are. */
649 so = NULL;
650 count = 0;
651 while ((so = find_solib (so)) != NULL)
652 {
653 if (so->so_name[0])
654 {
655 count += so->sections_end - so->sections;
656 }
657 }
658
659 if (count)
660 {
661 /* Add these section table entries to the target's table. */
662
663 old = target_resize_to_sections (target, count);
664
665 while ((so = find_solib (so)) != NULL)
666 {
667 if (so->so_name[0])
668 {
669 count = so->sections_end - so->sections;
670 memcpy ((char *) (target->to_sections + old),
671 so->sections,
672 (sizeof (struct section_table)) * count);
673 old += count;
674 }
675 }
676 }
677 }
678
679 /* Now add the symbol files. */
680 so = NULL;
681 while ((so = find_solib (so)) != NULL)
682 {
683 if (so->so_name[0] && re_exec (so->so_name))
684 {
685 so->from_tty = from_tty;
686 if (so->symbols_loaded)
687 {
688 if (from_tty)
689 {
690 printf_unfiltered ("Symbols already loaded for %s\n", so->so_name);
691 }
692 }
693 else if (catch_errors
694 (symbol_add_stub, (char *) so,
695 "Error while reading shared library symbols:\n",
696 RETURN_MASK_ALL))
697 {
698 so_last = so;
699 so->symbols_loaded = 1;
700 }
701 }
702 }
703
704 /* Getting new symbols may change our opinion about what is
705 frameless. */
706 if (so_last)
707 reinit_frame_cache ();
708 }
709
710 /*
711
712 LOCAL FUNCTION
713
714 info_sharedlibrary_command -- code for "info sharedlibrary"
715
716 SYNOPSIS
717
718 static void info_sharedlibrary_command ()
719
720 DESCRIPTION
721
722 Walk through the shared library list and print information
723 about each attached library.
724 */
725
726 static void
727 info_sharedlibrary_command (ignore, from_tty)
728 char *ignore;
729 int from_tty;
730 {
731 register struct so_list *so = NULL; /* link map state variable */
732 int header_done = 0;
733
734 if (exec_bfd == NULL)
735 {
736 printf_unfiltered ("No exec file.\n");
737 return;
738 }
739 while ((so = find_solib (so)) != NULL)
740 {
741 if (so->so_name[0])
742 {
743 unsigned long txt_start = 0;
744 unsigned long txt_end = 0;
745
746 if (!header_done)
747 {
748 printf_unfiltered ("%-20s%-20s%-12s%s\n", "From", "To", "Syms Read",
749 "Shared Object Library");
750 header_done++;
751 }
752 if (so->textsection)
753 {
754 txt_start = (unsigned long) so->textsection->addr;
755 txt_end = (unsigned long) so->textsection->endaddr;
756 }
757 printf_unfiltered ("%-20s", local_hex_string_custom (txt_start, "08l"));
758 printf_unfiltered ("%-20s", local_hex_string_custom (txt_end, "08l"));
759 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
760 printf_unfiltered ("%s\n", so->so_name);
761 }
762 }
763 if (so_list_head == NULL)
764 {
765 printf_unfiltered ("No shared libraries loaded at this time.\n");
766 }
767 }
768
769 /*
770
771 GLOBAL FUNCTION
772
773 solib_address -- check to see if an address is in a shared lib
774
775 SYNOPSIS
776
777 char *solib_address (CORE_ADDR address)
778
779 DESCRIPTION
780
781 Provides a hook for other gdb routines to discover whether or
782 not a particular address is within the mapped address space of
783 a shared library. Any address between the base mapping address
784 and the first address beyond the end of the last mapping, is
785 considered to be within the shared library address space, for
786 our purposes.
787
788 For example, this routine is called at one point to disable
789 breakpoints which are in shared libraries that are not currently
790 mapped in.
791 */
792
793 char *
794 solib_address (address)
795 CORE_ADDR address;
796 {
797 register struct so_list *so = 0; /* link map state variable */
798
799 while ((so = find_solib (so)) != NULL)
800 {
801 if (so->so_name[0] && so->textsection)
802 {
803 if ((address >= (CORE_ADDR) so->textsection->addr) &&
804 (address < (CORE_ADDR) so->textsection->endaddr))
805 return (so->so_name);
806 }
807 }
808 return (0);
809 }
810
811 /* Called by free_all_symtabs */
812
813 void
814 clear_solib ()
815 {
816 struct so_list *next;
817 char *bfd_filename;
818
819 disable_breakpoints_in_shlibs (1);
820
821 while (so_list_head)
822 {
823 if (so_list_head->sections)
824 {
825 free ((PTR) so_list_head->sections);
826 }
827 if (so_list_head->abfd)
828 {
829 bfd_filename = bfd_get_filename (so_list_head->abfd);
830 if (!bfd_close (so_list_head->abfd))
831 warning ("cannot close \"%s\": %s",
832 bfd_filename, bfd_errmsg (bfd_get_error ()));
833 }
834 else
835 /* This happens for the executable on SVR4. */
836 bfd_filename = NULL;
837
838 next = so_list_head->next;
839 if (bfd_filename)
840 free ((PTR) bfd_filename);
841 free ((PTR) so_list_head);
842 so_list_head = next;
843 }
844 }
845
846 /*
847
848 GLOBAL FUNCTION
849
850 solib_create_inferior_hook -- shared library startup support
851
852 SYNOPSIS
853
854 void solib_create_inferior_hook()
855
856 DESCRIPTION
857
858 When gdb starts up the inferior, it nurses it along (through the
859 shell) until it is ready to execute it's first instruction. At this
860 point, this function gets called via expansion of the macro
861 SOLIB_CREATE_INFERIOR_HOOK.
862 For a statically bound executable, this first instruction is the
863 one at "_start", or a similar text label. No further processing is
864 needed in that case.
865 For a dynamically bound executable, this first instruction is somewhere
866 in the rld, and the actual user executable is not yet mapped in.
867 We continue the inferior again, rld then maps in the actual user
868 executable and any needed shared libraries and then sends
869 itself a SIGTRAP.
870 At that point we discover the names of all shared libraries and
871 read their symbols in.
872
873 FIXME
874
875 This code does not properly handle hitting breakpoints which the
876 user might have set in the rld itself. Proper handling would have
877 to check if the SIGTRAP happened due to a kill call.
878
879 Also, what if child has exit()ed? Must exit loop somehow.
880 */
881
882 void
883 solib_create_inferior_hook ()
884 {
885
886 /* Nothing to do for statically bound executables. */
887
888 if (symfile_objfile == NULL
889 || symfile_objfile->obfd == NULL
890 || ((bfd_get_file_flags (symfile_objfile->obfd) & DYNAMIC) == 0))
891 return;
892
893 /* Now run the target. It will eventually get a SIGTRAP, at
894 which point all of the libraries will have been mapped in and we
895 can go groveling around in the rld structures to find
896 out what we need to know about them. */
897
898 clear_proceed_status ();
899 stop_soon_quietly = 1;
900 stop_signal = TARGET_SIGNAL_0;
901 do
902 {
903 target_resume (-1, 0, stop_signal);
904 wait_for_inferior ();
905 }
906 while (stop_signal != TARGET_SIGNAL_TRAP);
907
908 /* solib_add will call reinit_frame_cache.
909 But we are stopped in the runtime loader and we do not have symbols
910 for the runtime loader. So heuristic_proc_start will be called
911 and will put out an annoying warning.
912 Delaying the resetting of stop_soon_quietly until after symbol loading
913 suppresses the warning. */
914 if (auto_solib_add)
915 solib_add ((char *) 0, 0, (struct target_ops *) 0);
916 stop_soon_quietly = 0;
917 }
918
919
920 /*
921
922 LOCAL FUNCTION
923
924 sharedlibrary_command -- handle command to explicitly add library
925
926 SYNOPSIS
927
928 static void sharedlibrary_command (char *args, int from_tty)
929
930 DESCRIPTION
931
932 */
933
934 static void
935 sharedlibrary_command (args, from_tty)
936 char *args;
937 int from_tty;
938 {
939 dont_repeat ();
940 solib_add (args, from_tty, (struct target_ops *) 0);
941 }
942
943 void
944 _initialize_solib ()
945 {
946 add_com ("sharedlibrary", class_files, sharedlibrary_command,
947 "Load shared object library symbols for files matching REGEXP.");
948 add_info ("sharedlibrary", info_sharedlibrary_command,
949 "Status of loaded shared object libraries.");
950
951 add_show_from_set
952 (add_set_cmd ("auto-solib-add", class_support, var_zinteger,
953 (char *) &auto_solib_add,
954 "Set autoloading of shared library symbols.\n\
955 If nonzero, symbols from all shared object libraries will be loaded\n\
956 automatically when the inferior begins execution or when the dynamic linker\n\
957 informs gdb that a new library has been loaded. Otherwise, symbols\n\
958 must be loaded manually, using `sharedlibrary'.",
959 &setlist),
960 &showlist);
961 }
This page took 0.065783 seconds and 3 git commands to generate.