Mention new PowerPC GNU/Linux native configuration.
[deliverable/binutils-gdb.git] / gdb / osfsolib.c
CommitLineData
c906108c
SS
1/* Handle OSF/1 shared libraries for GDB, the GNU Debugger.
2 Copyright 1993, 94, 95, 96, 98, 1999 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
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.
c906108c 10
c5aa993b
JM
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. */
c906108c
SS
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
c5aa993b 44#define MAX_PATH_SIZE 1024 /* FIXME: Should be dynamic */
c906108c
SS
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.
c5aa993b
JM
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.
c906108c 57 2) Use the undocumented libxproc.a library, which contains the
c5aa993b
JM
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.
c906108c
SS
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
71typedef struct
c5aa993b
JM
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 }
84ldr_module_info_t;
c906108c
SS
85
86typedef struct
c5aa993b
JM
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 }
96ldr_region_info_t;
c906108c
SS
97
98typedef struct
c5aa993b
JM
99 {
100 CORE_ADDR unknown1;
101 CORE_ADDR unknown2;
102 CORE_ADDR head;
103 CORE_ADDR tail;
104 }
105ldr_context_t;
c906108c
SS
106
107static ldr_context_t ldr_context;
108
109#else
110
111#include <loader.h>
112static ldr_process_t fake_ldr_process;
113
114/* Called by ldr_* routines to read memory from the current target. */
115
116static int ldr_read_memory PARAMS ((CORE_ADDR, char *, int, int));
117
118static int
119ldr_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)
c5aa993b 132 strcpy (myaddr, buffer);
c906108c
SS
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
c5aa993b
JM
148struct link_map
149{
150 CORE_ADDR l_offset; /* prelink to load address offset */
151 char *l_name; /* full name of loaded object */
c906108c
SS
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
c5aa993b
JM
158struct 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 };
c906108c
SS
173
174static struct so_list *so_list_head; /* List of known shared objects */
175
176extern int
c5aa993b 177fdmatch PARAMS ((int, int)); /* In libiberty */
c906108c
SS
178
179/* Local function prototypes */
180
181static void
182sharedlibrary_command PARAMS ((char *, int));
183
184static void
185info_sharedlibrary_command PARAMS ((char *, int));
186
187static int
188symbol_add_stub PARAMS ((char *));
189
190static struct so_list *
c5aa993b 191 find_solib PARAMS ((struct so_list *));
c906108c
SS
192
193static struct link_map *
c5aa993b 194 first_link_map_member PARAMS ((void));
c906108c
SS
195
196static struct link_map *
c5aa993b 197 next_link_map_member PARAMS ((struct so_list *));
c906108c
SS
198
199static void
200xfer_link_map_member PARAMS ((struct so_list *, struct link_map *));
201
202static int
203solib_map_sections PARAMS ((char *));
204
205/*
206
c5aa993b 207 LOCAL FUNCTION
c906108c 208
c5aa993b 209 solib_map_sections -- open bfd and build sections for shared lib
c906108c 210
c5aa993b 211 SYNOPSIS
c906108c 212
c5aa993b 213 static int solib_map_sections (struct so_list *so)
c906108c 214
c5aa993b 215 DESCRIPTION
c906108c 216
c5aa993b
JM
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.
c906108c 222
c5aa993b 223 FIXMES
c906108c 224
c5aa993b
JM
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?).
c906108c
SS
230 */
231
232static int
233solib_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;
c5aa993b
JM
243
244 filename = tilde_expand (so->so_name);
c906108c 245 old_chain = make_cleanup (free, filename);
c5aa993b 246
c906108c
SS
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. */
c5aa993b
JM
268 so->abfd = abfd;
269 abfd->cacheable = true;
c906108c
SS
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 }
c5aa993b 276 if (build_section_table (abfd, &so->sections, &so->sections_end))
c906108c 277 {
c5aa993b 278 error ("Can't find the file sections in `%s': %s",
c906108c
SS
279 bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
280 }
281
c5aa993b 282 for (p = so->sections; p < so->sections_end; p++)
c906108c
SS
283 {
284 /* Relocate the section binding addresses as recorded in the shared
c5aa993b
JM
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"))
c906108c 291 {
c5aa993b 292 so->textsection = p;
c906108c
SS
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
c5aa993b 304 LOCAL FUNCTION
c906108c 305
c5aa993b 306 first_link_map_member -- locate first member in dynamic linker's map
c906108c 307
c5aa993b 308 SYNOPSIS
c906108c 309
c5aa993b 310 static struct link_map *first_link_map_member (void)
c906108c 311
c5aa993b 312 DESCRIPTION
c906108c 313
c5aa993b
JM
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 */
c906108c
SS
318
319static struct link_map *
320first_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
c5aa993b 333 || ldr_next_module (fake_ldr_process, &mod_id) != 0
c906108c 334 || mod_id == LDR_NULL_MODULE
c5aa993b
JM
335 || ldr_inq_module (fake_ldr_process, mod_id,
336 &first_lm.module_info, sizeof (ldr_module_info_t),
337 &retsize) != 0)
c906108c
SS
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
362static struct link_map *
363next_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
c5aa993b 372 if (ldr_next_module (fake_ldr_process, &mod_id) != 0
c906108c 373 || mod_id == LDR_NULL_MODULE
c5aa993b
JM
374 || ldr_inq_module (fake_ldr_process, mod_id,
375 &next_lm.module_info, sizeof (ldr_module_info_t),
376 &retsize) != 0)
c906108c
SS
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
404static void
405xfer_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
c5aa993b 449 - (CORE_ADDR) region_info.lri_vaddr;
c906108c
SS
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
c5aa993b 474 + i * sizeof (region_info),
c906108c
SS
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)",
c5aa993b 491 so_list_ptr->so_name, region_name);
c906108c
SS
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
c5aa993b 505 LOCAL FUNCTION
c906108c 506
c5aa993b 507 find_solib -- step through list of shared objects
c906108c 508
c5aa993b 509 SYNOPSIS
c906108c 510
c5aa993b 511 struct so_list *find_solib (struct so_list *so_list_ptr)
c906108c 512
c5aa993b 513 DESCRIPTION
c906108c 514
c5aa993b
JM
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.
c906108c 521
c5aa993b
JM
522 The arg and return value are "struct link_map" pointers, as defined
523 in <link.h>.
c906108c
SS
524 */
525
526static struct so_list *
527find_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;
c5aa993b 533
c906108c
SS
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
c5aa993b 546 the shared library list. Advance to the next shared object. */
c906108c 547 lm = next_link_map_member (so_list_ptr);
c5aa993b 548 so_list_next = so_list_ptr->next;
c906108c
SS
549 }
550 if ((so_list_next == NULL) && (lm != NULL))
551 {
552 /* Get next link map structure from inferior image and build a local
c5aa993b 553 abbreviated load_map structure */
c906108c
SS
554 new = (struct so_list *) xmalloc (sizeof (struct so_list));
555 memset ((char *) new, 0, sizeof (struct so_list));
c5aa993b 556 new->lmaddr = lm;
c906108c 557 /* Add the new node as the next node in the list, or as the root
c5aa993b 558 node if this is the first one. */
c906108c
SS
559 if (so_list_ptr != NULL)
560 {
c5aa993b 561 so_list_ptr->next = new;
c906108c
SS
562 }
563 else
564 {
565 so_list_head = new;
c5aa993b 566 }
c906108c
SS
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
575static int
576symbol_add_stub (arg)
577 char *arg;
578{
c5aa993b 579 register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
c906108c 580 CORE_ADDR text_addr = 0;
2acceee2 581 struct section_addr_info section_addrs;
c906108c 582
2acceee2 583 memset (&section_addrs, 0, sizeof (section_addrs));
c5aa993b
JM
584 if (so->textsection)
585 text_addr = so->textsection->addr;
586 else if (so->abfd != NULL)
c906108c
SS
587 {
588 asection *lowest_sect;
589
590 /* If we didn't find a mapped non zero sized .text section, set up
c5aa993b 591 text_addr so that the relocation in symbol_file_add does no harm. */
c906108c 592
c5aa993b 593 lowest_sect = bfd_get_section_by_name (so->abfd, ".text");
c906108c 594 if (lowest_sect == NULL)
c5aa993b 595 bfd_map_over_sections (so->abfd, find_lowest_section,
96baa820 596 (PTR) &lowest_sect);
c906108c 597 if (lowest_sect)
c5aa993b 598 text_addr = bfd_section_vma (so->abfd, lowest_sect) + LM_OFFSET (so);
c906108c 599 }
c5aa993b 600
2acceee2 601 section_addrs.text_addr = text_addr;
c5aa993b 602 so->objfile = symbol_file_add (so->so_name, so->from_tty,
2df3850c 603 &section_addrs, 0, OBJF_SHARED);
c906108c
SS
604 return (1);
605}
606
607/*
608
c5aa993b 609 GLOBAL FUNCTION
c906108c 610
c5aa993b 611 solib_add -- add a shared library file to the symtab and section list
c906108c 612
c5aa993b 613 SYNOPSIS
c906108c 614
c5aa993b
JM
615 void solib_add (char *arg_string, int from_tty,
616 struct target_ops *target)
c906108c 617
c5aa993b 618 DESCRIPTION
c906108c 619
c5aa993b 620 */
c906108c
SS
621
622void
623solib_add (arg_string, from_tty, target)
624 char *arg_string;
625 int from_tty;
626 struct target_ops *target;
c5aa993b
JM
627{
628 register struct so_list *so = NULL; /* link map state variable */
c906108c
SS
629
630 /* Last shared library that we read. */
631 struct so_list *so_last = NULL;
632
633 char *re_err;
634 int count;
635 int old;
c5aa993b 636
c906108c
SS
637 if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
638 {
639 error ("Invalid regexp: %s", re_err);
640 }
c5aa993b
JM
641
642
c906108c
SS
643 /* Add the shared library sections to the section table of the
644 specified target, if any. */
645 if (target)
646 {
647 /* Count how many new section_table entries there are. */
648 so = NULL;
649 count = 0;
650 while ((so = find_solib (so)) != NULL)
651 {
c5aa993b 652 if (so->so_name[0])
c906108c 653 {
c5aa993b 654 count += so->sections_end - so->sections;
c906108c
SS
655 }
656 }
c5aa993b 657
c906108c
SS
658 if (count)
659 {
c906108c 660 /* Add these section table entries to the target's table. */
6426a772
JM
661
662 old = target_resize_to_sections (target, count);
663
c906108c
SS
664 while ((so = find_solib (so)) != NULL)
665 {
c5aa993b 666 if (so->so_name[0])
c906108c 667 {
c5aa993b
JM
668 count = so->sections_end - so->sections;
669 memcpy ((char *) (target->to_sections + old),
670 so->sections,
c906108c
SS
671 (sizeof (struct section_table)) * count);
672 old += count;
673 }
674 }
675 }
676 }
c5aa993b 677
c906108c
SS
678 /* Now add the symbol files. */
679 so = NULL;
680 while ((so = find_solib (so)) != NULL)
681 {
c5aa993b 682 if (so->so_name[0] && re_exec (so->so_name))
c906108c 683 {
c5aa993b
JM
684 so->from_tty = from_tty;
685 if (so->symbols_loaded)
c906108c
SS
686 {
687 if (from_tty)
688 {
c5aa993b 689 printf_unfiltered ("Symbols already loaded for %s\n", so->so_name);
c906108c
SS
690 }
691 }
692 else if (catch_errors
693 (symbol_add_stub, (char *) so,
694 "Error while reading shared library symbols:\n",
695 RETURN_MASK_ALL))
696 {
697 so_last = so;
c5aa993b 698 so->symbols_loaded = 1;
c906108c
SS
699 }
700 }
701 }
702
703 /* Getting new symbols may change our opinion about what is
704 frameless. */
705 if (so_last)
706 reinit_frame_cache ();
707}
708
709/*
710
c5aa993b 711 LOCAL FUNCTION
c906108c 712
c5aa993b 713 info_sharedlibrary_command -- code for "info sharedlibrary"
c906108c 714
c5aa993b 715 SYNOPSIS
c906108c 716
c5aa993b 717 static void info_sharedlibrary_command ()
c906108c 718
c5aa993b 719 DESCRIPTION
c906108c 720
c5aa993b
JM
721 Walk through the shared library list and print information
722 about each attached library.
723 */
c906108c
SS
724
725static void
726info_sharedlibrary_command (ignore, from_tty)
727 char *ignore;
728 int from_tty;
729{
c5aa993b 730 register struct so_list *so = NULL; /* link map state variable */
c906108c 731 int header_done = 0;
c5aa993b 732
c906108c
SS
733 if (exec_bfd == NULL)
734 {
4ce44c66 735 printf_unfiltered ("No executable file.\n");
c906108c
SS
736 return;
737 }
738 while ((so = find_solib (so)) != NULL)
739 {
c5aa993b 740 if (so->so_name[0])
c906108c
SS
741 {
742 unsigned long txt_start = 0;
743 unsigned long txt_end = 0;
744
745 if (!header_done)
746 {
c5aa993b
JM
747 printf_unfiltered ("%-20s%-20s%-12s%s\n", "From", "To", "Syms Read",
748 "Shared Object Library");
c906108c
SS
749 header_done++;
750 }
c5aa993b 751 if (so->textsection)
c906108c 752 {
c5aa993b
JM
753 txt_start = (unsigned long) so->textsection->addr;
754 txt_end = (unsigned long) so->textsection->endaddr;
c906108c
SS
755 }
756 printf_unfiltered ("%-20s", local_hex_string_custom (txt_start, "08l"));
757 printf_unfiltered ("%-20s", local_hex_string_custom (txt_end, "08l"));
c5aa993b
JM
758 printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
759 printf_unfiltered ("%s\n", so->so_name);
c906108c
SS
760 }
761 }
762 if (so_list_head == NULL)
763 {
c5aa993b 764 printf_unfiltered ("No shared libraries loaded at this time.\n");
c906108c
SS
765 }
766}
767
768/*
769
c5aa993b 770 GLOBAL FUNCTION
c906108c 771
c5aa993b 772 solib_address -- check to see if an address is in a shared lib
c906108c 773
c5aa993b 774 SYNOPSIS
c906108c 775
c5aa993b 776 char *solib_address (CORE_ADDR address)
c906108c 777
c5aa993b 778 DESCRIPTION
c906108c 779
c5aa993b
JM
780 Provides a hook for other gdb routines to discover whether or
781 not a particular address is within the mapped address space of
782 a shared library. Any address between the base mapping address
783 and the first address beyond the end of the last mapping, is
784 considered to be within the shared library address space, for
785 our purposes.
c906108c 786
c5aa993b
JM
787 For example, this routine is called at one point to disable
788 breakpoints which are in shared libraries that are not currently
789 mapped in.
c906108c
SS
790 */
791
792char *
793solib_address (address)
794 CORE_ADDR address;
795{
c5aa993b
JM
796 register struct so_list *so = 0; /* link map state variable */
797
c906108c
SS
798 while ((so = find_solib (so)) != NULL)
799 {
c5aa993b 800 if (so->so_name[0] && so->textsection)
c906108c 801 {
c5aa993b
JM
802 if ((address >= (CORE_ADDR) so->textsection->addr) &&
803 (address < (CORE_ADDR) so->textsection->endaddr))
c906108c
SS
804 return (so->so_name);
805 }
806 }
807 return (0);
808}
809
810/* Called by free_all_symtabs */
811
c5aa993b
JM
812void
813clear_solib ()
c906108c
SS
814{
815 struct so_list *next;
816 char *bfd_filename;
c5aa993b 817
c906108c
SS
818 disable_breakpoints_in_shlibs (1);
819
820 while (so_list_head)
821 {
c5aa993b 822 if (so_list_head->sections)
c906108c 823 {
c5aa993b 824 free ((PTR) so_list_head->sections);
c906108c 825 }
c5aa993b 826 if (so_list_head->abfd)
c906108c 827 {
c5aa993b
JM
828 bfd_filename = bfd_get_filename (so_list_head->abfd);
829 if (!bfd_close (so_list_head->abfd))
c906108c
SS
830 warning ("cannot close \"%s\": %s",
831 bfd_filename, bfd_errmsg (bfd_get_error ()));
832 }
833 else
834 /* This happens for the executable on SVR4. */
835 bfd_filename = NULL;
836
c5aa993b 837 next = so_list_head->next;
c906108c 838 if (bfd_filename)
c5aa993b
JM
839 free ((PTR) bfd_filename);
840 free ((PTR) so_list_head);
c906108c
SS
841 so_list_head = next;
842 }
843}
c5aa993b 844
c906108c 845/*
c5aa993b
JM
846
847 GLOBAL FUNCTION
848
849 solib_create_inferior_hook -- shared library startup support
850
851 SYNOPSIS
852
853 void solib_create_inferior_hook()
854
855 DESCRIPTION
856
857 When gdb starts up the inferior, it nurses it along (through the
858 shell) until it is ready to execute it's first instruction. At this
859 point, this function gets called via expansion of the macro
860 SOLIB_CREATE_INFERIOR_HOOK.
861 For a statically bound executable, this first instruction is the
862 one at "_start", or a similar text label. No further processing is
863 needed in that case.
864 For a dynamically bound executable, this first instruction is somewhere
865 in the rld, and the actual user executable is not yet mapped in.
866 We continue the inferior again, rld then maps in the actual user
867 executable and any needed shared libraries and then sends
868 itself a SIGTRAP.
869 At that point we discover the names of all shared libraries and
870 read their symbols in.
871
872 FIXME
873
874 This code does not properly handle hitting breakpoints which the
875 user might have set in the rld itself. Proper handling would have
876 to check if the SIGTRAP happened due to a kill call.
877
878 Also, what if child has exit()ed? Must exit loop somehow.
879 */
c906108c
SS
880
881void
c5aa993b 882solib_create_inferior_hook ()
c906108c
SS
883{
884
885 /* Nothing to do for statically bound executables. */
886
887 if (symfile_objfile == NULL
888 || symfile_objfile->obfd == NULL
889 || ((bfd_get_file_flags (symfile_objfile->obfd) & DYNAMIC) == 0))
890 return;
891
892 /* Now run the target. It will eventually get a SIGTRAP, at
893 which point all of the libraries will have been mapped in and we
894 can go groveling around in the rld structures to find
895 out what we need to know about them. */
c5aa993b 896
c906108c
SS
897 clear_proceed_status ();
898 stop_soon_quietly = 1;
899 stop_signal = TARGET_SIGNAL_0;
900 do
901 {
902 target_resume (-1, 0, stop_signal);
903 wait_for_inferior ();
904 }
905 while (stop_signal != TARGET_SIGNAL_TRAP);
906
907 /* solib_add will call reinit_frame_cache.
c5aa993b
JM
908 But we are stopped in the runtime loader and we do not have symbols
909 for the runtime loader. So heuristic_proc_start will be called
910 and will put out an annoying warning.
911 Delaying the resetting of stop_soon_quietly until after symbol loading
912 suppresses the warning. */
c906108c
SS
913 if (auto_solib_add)
914 solib_add ((char *) 0, 0, (struct target_ops *) 0);
915 stop_soon_quietly = 0;
916}
917
918
919/*
920
c5aa993b 921 LOCAL FUNCTION
c906108c 922
c5aa993b 923 sharedlibrary_command -- handle command to explicitly add library
c906108c 924
c5aa993b 925 SYNOPSIS
c906108c 926
c5aa993b 927 static void sharedlibrary_command (char *args, int from_tty)
c906108c 928
c5aa993b 929 DESCRIPTION
c906108c 930
c5aa993b 931 */
c906108c
SS
932
933static void
934sharedlibrary_command (args, from_tty)
c5aa993b
JM
935 char *args;
936 int from_tty;
c906108c
SS
937{
938 dont_repeat ();
939 solib_add (args, from_tty, (struct target_ops *) 0);
940}
941
942void
c5aa993b 943_initialize_solib ()
c906108c
SS
944{
945 add_com ("sharedlibrary", class_files, sharedlibrary_command,
946 "Load shared object library symbols for files matching REGEXP.");
c5aa993b 947 add_info ("sharedlibrary", info_sharedlibrary_command,
c906108c
SS
948 "Status of loaded shared object libraries.");
949
950 add_show_from_set
951 (add_set_cmd ("auto-solib-add", class_support, var_zinteger,
952 (char *) &auto_solib_add,
953 "Set autoloading of shared library symbols.\n\
954If nonzero, symbols from all shared object libraries will be loaded\n\
955automatically when the inferior begins execution or when the dynamic linker\n\
956informs gdb that a new library has been loaded. Otherwise, symbols\n\
957must be loaded manually, using `sharedlibrary'.",
958 &setlist),
959 &showlist);
960}
This page took 0.142111 seconds and 4 git commands to generate.