1 /* Handle HP SOM shared libraries for GDB, the GNU Debugger.
2 
3    Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
4    2003, 2004 Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
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.
12 
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.
22 
23    Written by the Center for Software Science at the Univerity of Utah
24    and by Cygnus Support.  */
25 
26 
27 #include "defs.h"
28 
29 #include "frame.h"
30 #include "bfd.h"
31 #include "som.h"
32 #include "libhppa.h"
33 #include "gdbcore.h"
34 #include "symtab.h"
35 #include "breakpoint.h"
36 #include "symfile.h"
37 #include "objfiles.h"
38 #include "inferior.h"
39 #include "gdb-stabs.h"
40 #include "gdb_stat.h"
41 #include "gdbcmd.h"
42 #include "language.h"
43 #include "regcache.h"
44 #include "gdb_assert.h"
45 #include "exec.h"
46 #include "hppa-tdep.h"
47 
48 #include <fcntl.h>
49 
50 #ifndef O_BINARY
51 #define O_BINARY 0
52 #endif
53 
54 /* Uncomment this to turn on some debugging output.
55  */
56 
57 /* #define SOLIB_DEBUG
58  */
59 
60 /* This lives in hppa-tdep.c. */
61 extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc);
62 
63 /* These ought to be defined in some public interface, but aren't.  They
64    define the meaning of the various bits in the distinguished __dld_flags
65    variable that is declared in every debuggable a.out on HP-UX, and that
66    is shared between the debugger and the dynamic linker.
67  */
68 #define DLD_FLAGS_MAPPRIVATE    0x1
69 #define DLD_FLAGS_HOOKVALID     0x2
70 #define DLD_FLAGS_LISTVALID     0x4
71 #define DLD_FLAGS_BOR_ENABLE    0x8
72 
73 /* TODO:
74 
75    * Support for hpux8 dynamic linker.  */
76 
77 /* The basic structure which describes a dynamically loaded object.  This
78    data structure is private to the dynamic linker and isn't found in
79    any HPUX include file.  */
80 
81 struct som_solib_mapped_entry
82   {
83     /* The name of the library.  */
84     char *name;
85 
86     /* Version of this structure (it is expected to change again in hpux10).  */
87     unsigned char struct_version;
88 
89     /* Binding mode for this library.  */
90     unsigned char bind_mode;
91 
92     /* Version of this library.  */
93     short library_version;
94 
95     /* Start of text address,
96      * link-time text location (length of text area),
97      * end of text address.  */
98     CORE_ADDR text_addr;
99     CORE_ADDR text_link_addr;
100     CORE_ADDR text_end;
101 
102     /* Start of data, start of bss and end of data.  */
103     CORE_ADDR data_start;
104     CORE_ADDR bss_start;
105     CORE_ADDR data_end;
106 
107     /* Value of linkage pointer (%r19).  */
108     CORE_ADDR got_value;
109 
110     /* Next entry.  */
111     struct som_solib_mapped_entry *next;
112 
113     /* There are other fields, but I don't have information as to what is
114        contained in them.  */
115 
116     /* For versions from HPUX-10.30 and up */
117 
118     /* Address in target of offset from thread-local register of
119      * start of this thread's data.  I.e., the first thread-local
120      * variable in this shared library starts at *(tsd_start_addr)
121      * from that area pointed to by cr27 (mpsfu_hi).
122      *
123      * We do the indirection as soon as we read it, so from then
124      * on it's the offset itself.
125      */
126     CORE_ADDR tsd_start_addr;
127 
128     /* Following this are longwords holding:
129 
130      * ?, ?, ?, ptr to -1, ptr to-1, ptr to lib name (leaf name),
131      * ptr to __data_start, ptr to __data_end
132      */
133 
134 
135   };
136 
137 /* A structure to keep track of all the known shared objects.  */
138 struct so_list
139   {
140     struct som_solib_mapped_entry som_solib;
141     struct objfile *objfile;
142     bfd *abfd;
143     struct section_table *sections;
144     struct section_table *sections_end;
145 /* elz: added this field to store the address in target space (in the
146    library) of the library descriptor (handle) which we read into
147    som_solib_mapped_entry structure */
148     CORE_ADDR solib_addr;
149     struct so_list *next;
150 
151   };
152 
153 static struct so_list *so_list_head;
154 
155 
156 /* This is the cumulative size in bytes of the symbol tables of all
157    shared objects on the so_list_head list.  (When we say size, here
158    we mean of the information before it is brought into memory and
159    potentially expanded by GDB.)  When adding a new shlib, this value
160    is compared against the threshold size, held by auto_solib_limit
161    (in megabytes).  If adding symbols for the new shlib would cause
162    the total size to exceed the threshold, then the new shlib's
163    symbols are not loaded.  */
164 static LONGEST som_solib_total_st_size;
165 
166 /* When the threshold is reached for any shlib, we refuse to add
167    symbols for subsequent shlibs, even if those shlibs' symbols would
168    be small enough to fit under the threshold.  (Although this may
169    result in one, early large shlib preventing the loading of later,
170    smalller shlibs' symbols, it allows us to issue one informational
171    message.  The alternative, to issue a message for each shlib whose
172    symbols aren't loaded, could be a big annoyance where the threshold
173    is exceeded due to a very large number of shlibs.)
174  */
175 static int som_solib_st_size_threshold_exceeded;
176 
177 /* These addresses should be filled in by som_solib_create_inferior_hook.
178    They are also used elsewhere in this module.
179  */
180 typedef struct
181   {
182     CORE_ADDR address;
183     struct unwind_table_entry *unwind;
184   }
185 addr_and_unwind_t;
186 
187 /* When adding fields, be sure to clear them in _initialize_som_solib. */
188 static struct
189   {
190     int is_valid;
191     addr_and_unwind_t hook;
192     addr_and_unwind_t hook_stub;
193     addr_and_unwind_t load;
194     addr_and_unwind_t load_stub;
195     addr_and_unwind_t unload;
196     addr_and_unwind_t unload2;
197     addr_and_unwind_t unload_stub;
198   }
199 dld_cache;
200 
201 
202 
203 static void som_sharedlibrary_info_command (char *, int);
204 
205 static void som_solib_sharedlibrary_command (char *, int);
206 
207 static LONGEST
som_solib_sizeof_symbol_table(char * filename)208 som_solib_sizeof_symbol_table (char *filename)
209 {
210   bfd *abfd;
211   int desc;
212   char *absolute_name;
213   LONGEST st_size = (LONGEST) 0;
214   asection *sect;
215 
216   /* We believe that filename was handed to us by the dynamic linker, and
217      is therefore always an absolute path.
218    */
219   desc = openp (getenv ("PATH"), 1, filename, O_RDONLY | O_BINARY, 0, &absolute_name);
220   if (desc < 0)
221     {
222       perror_with_name (filename);
223     }
224   filename = absolute_name;
225 
226   abfd = bfd_fdopenr (filename, gnutarget, desc);
227   if (!abfd)
228     {
229       close (desc);
230       make_cleanup (xfree, filename);
231       error ("\"%s\": can't open to read symbols: %s.", filename,
232 	     bfd_errmsg (bfd_get_error ()));
233     }
234 
235   if (!bfd_check_format (abfd, bfd_object))	/* Reads in section info */
236     {
237       bfd_close (abfd);		/* This also closes desc */
238       make_cleanup (xfree, filename);
239       error ("\"%s\": can't read symbols: %s.", filename,
240 	     bfd_errmsg (bfd_get_error ()));
241     }
242 
243   /* Sum the sizes of the various sections that compose debug info. */
244 
245   /* This contains non-DOC information. */
246   sect = bfd_get_section_by_name (abfd, "$DEBUG$");
247   if (sect)
248     st_size += (LONGEST) bfd_section_size (abfd, sect);
249 
250   /* This contains DOC information. */
251   sect = bfd_get_section_by_name (abfd, "$PINFO$");
252   if (sect)
253     st_size += (LONGEST) bfd_section_size (abfd, sect);
254 
255   bfd_close (abfd);		/* This also closes desc */
256   xfree (filename);
257 
258   /* Unfortunately, just summing the sizes of various debug info
259      sections isn't a very accurate measurement of how much heap
260      space the debugger will need to hold them.  It also doesn't
261      account for space needed by linker (aka "minimal") symbols.
262 
263      Anecdotal evidence suggests that just summing the sizes of
264      debug-info-related sections understates the heap space needed
265      to represent it internally by about an order of magnitude.
266 
267      Since it's not exactly brain surgery we're doing here, rather
268      than attempt to more accurately measure the size of a shlib's
269      symbol table in GDB's heap, we'll just apply a 10x fudge-
270      factor to the debug info sections' size-sum.  No, this doesn't
271      account for minimal symbols in non-debuggable shlibs.  But it
272      all roughly washes out in the end.
273    */
274   return st_size * (LONGEST) 10;
275 }
276 
277 
278 static void
som_solib_add_solib_objfile(struct so_list * so,char * name,int from_tty,CORE_ADDR text_addr)279 som_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty,
280 			     CORE_ADDR text_addr)
281 {
282   struct hppa_objfile_private *obj_private;
283   struct obj_section *s;
284 
285   so->objfile = symbol_file_add (name, from_tty, NULL, 0, OBJF_SHARED);
286   so->abfd = so->objfile->obfd;
287 
288   /* syms_from_objfile has bizarre section offset code,
289      so I do my own right here.  */
290   for (s = so->objfile->sections; s < so->objfile->sections_end; s++)
291     {
292       flagword aflag = bfd_get_section_flags(so->abfd, s->the_bfd_section);
293       if (aflag & SEC_CODE)
294 	{
295 	  s->addr    += so->som_solib.text_addr - so->som_solib.text_link_addr;
296 	  s->endaddr += so->som_solib.text_addr - so->som_solib.text_link_addr;
297 	}
298       else if (aflag & SEC_DATA)
299 	{
300 	  s->addr    += so->som_solib.data_start;
301 	  s->endaddr += so->som_solib.data_start;
302 	}
303       else
304 	;
305     }
306 
307   /* Mark this as a shared library and save private data.
308    */
309   so->objfile->flags |= OBJF_SHARED;
310 
311   obj_private = (struct hppa_objfile_private *)
312 	        objfile_data (so->objfile, hppa_objfile_priv_data);
313   if (obj_private == NULL)
314     {
315       obj_private = (struct hppa_objfile_private *)
316 	obstack_alloc (&so->objfile->objfile_obstack,
317 		       sizeof (struct hppa_objfile_private));
318       set_objfile_data (so->objfile, hppa_objfile_priv_data, obj_private);
319       obj_private->unwind_info = NULL;
320       obj_private->so_info = NULL;
321     }
322 
323   obj_private->so_info = so;
324 
325   if (!bfd_check_format (so->abfd, bfd_object))
326     {
327       error ("\"%s\": not in executable format: %s.",
328 	     name, bfd_errmsg (bfd_get_error ()));
329     }
330 }
331 
332 
333 static void
som_solib_load_symbols(struct so_list * so,char * name,int from_tty,CORE_ADDR text_addr,struct target_ops * target)334 som_solib_load_symbols (struct so_list *so, char *name, int from_tty,
335 			CORE_ADDR text_addr, struct target_ops *target)
336 {
337   struct section_table *p;
338   int status;
339   char buf[4];
340   CORE_ADDR presumed_data_start;
341 
342 #ifdef SOLIB_DEBUG
343   printf ("--Adding symbols for shared library \"%s\"\n", name);
344 #endif
345 
346   som_solib_add_solib_objfile (so, name, from_tty, text_addr);
347 
348   /* Now we need to build a section table for this library since
349      we might be debugging a core file from a dynamically linked
350      executable in which the libraries were not privately mapped.  */
351   if (build_section_table (so->abfd,
352 			   &so->sections,
353 			   &so->sections_end))
354     {
355       error ("Unable to build section table for shared library\n.");
356       return;
357     }
358 
359   /* Relocate all the sections based on where they got loaded.  */
360   for (p = so->sections; p < so->sections_end; p++)
361     {
362       if (p->the_bfd_section->flags & SEC_CODE)
363 	{
364 	  p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
365 	  p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
366 	}
367       else if (p->the_bfd_section->flags & SEC_DATA)
368 	{
369 	  p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
370 	  p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
371 	}
372     }
373 
374   /* Now see if we need to map in the text and data for this shared
375      library (for example debugging a core file which does not use
376      private shared libraries.).
377 
378      Carefully peek at the first text address in the library.  If the
379      read succeeds, then the libraries were privately mapped and were
380      included in the core dump file.
381 
382      If the peek failed, then the libraries were not privately mapped
383      and are not in the core file, we'll have to read them in ourselves.  */
384   status = target_read_memory (text_addr, buf, 4);
385   if (status != 0)
386     {
387       int old, new;
388 
389       new = so->sections_end - so->sections;
390 
391       old = target_resize_to_sections (target, new);
392 
393       /* Copy over the old data before it gets clobbered.  */
394       memcpy ((char *) (target->to_sections + old),
395 	      so->sections,
396 	      ((sizeof (struct section_table)) * new));
397     }
398 }
399 
400 
401 /* FIXME: cagney/2003-02-01: This just isn't right.  Given an address
402    within the target's address space, this converts the value into an
403    address within the host's (i.e., GDB's) address space.  Given that
404    the host/target address spaces are separate, this can't be right.  */
405 
406 static void *
hpux_address_to_host_pointer_hack(CORE_ADDR addr)407 hpux_address_to_host_pointer_hack (CORE_ADDR addr)
408 {
409   void *ptr;
410 
411   gdb_assert (sizeof (ptr) == TYPE_LENGTH (builtin_type_void_data_ptr));
412   ADDRESS_TO_POINTER (builtin_type_void_data_ptr, &ptr, addr);
413   return ptr;
414 }
415 
416 /* Add symbols from shared libraries into the symtab list, unless the
417    size threshold specified by auto_solib_limit (in megabytes) would
418    be exceeded.  */
419 
420 void
som_solib_add(char * arg_string,int from_tty,struct target_ops * target,int readsyms)421 som_solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms)
422 {
423   struct minimal_symbol *msymbol;
424   struct so_list *so_list_tail;
425   CORE_ADDR addr;
426   asection *shlib_info;
427   int status;
428   unsigned int dld_flags;
429   char buf[4], *re_err;
430   int threshold_warning_given = 0;
431 
432   /* First validate our arguments.  */
433   re_err = re_comp (arg_string ? arg_string : ".");
434   if (re_err != NULL)
435     {
436       error ("Invalid regexp: %s", re_err);
437     }
438 
439   /* If we're debugging a core file, or have attached to a running
440      process, then som_solib_create_inferior_hook will not have been
441      called.
442 
443      We need to first determine if we're dealing with a dynamically
444      linked executable.  If not, then return without an error or warning.
445 
446      We also need to examine __dld_flags to determine if the shared library
447      list is valid and to determine if the libraries have been privately
448      mapped.  */
449   if (symfile_objfile == NULL)
450     return;
451 
452   /* First see if the objfile was dynamically linked.  */
453   shlib_info = bfd_get_section_by_name (symfile_objfile->obfd, "$SHLIB_INFO$");
454   if (!shlib_info)
455     return;
456 
457   /* It's got a $SHLIB_INFO$ section, make sure it's not empty.  */
458   if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0)
459     return;
460 
461   msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
462   if (msymbol == NULL)
463     {
464       error ("Unable to find __dld_flags symbol in object file.\n");
465       return;
466     }
467 
468   addr = SYMBOL_VALUE_ADDRESS (msymbol);
469   /* Read the current contents.  */
470   status = target_read_memory (addr, buf, 4);
471   if (status != 0)
472     {
473       error ("Unable to read __dld_flags\n");
474       return;
475     }
476   dld_flags = extract_unsigned_integer (buf, 4);
477 
478   /* __dld_list may not be valid.  If not, then we punt, warning the user if
479      we were called as a result of the add-symfile command.
480    */
481   if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
482     {
483       if (from_tty)
484 	error ("__dld_list is not valid according to __dld_flags.\n");
485       return;
486     }
487 
488   /* If the libraries were not mapped private, warn the user.  */
489   if ((dld_flags & DLD_FLAGS_MAPPRIVATE) == 0)
490     warning ("The shared libraries were not privately mapped; setting a\nbreakpoint in a shared library will not work until you rerun the program.\n");
491 
492   msymbol = lookup_minimal_symbol ("__dld_list", NULL, NULL);
493   if (!msymbol)
494     {
495       /* Older crt0.o files (hpux8) don't have __dld_list as a symbol,
496          but the data is still available if you know where to look.  */
497       msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
498       if (!msymbol)
499 	{
500 	  error ("Unable to find dynamic library list.\n");
501 	  return;
502 	}
503       addr = SYMBOL_VALUE_ADDRESS (msymbol) - 8;
504     }
505   else
506     addr = SYMBOL_VALUE_ADDRESS (msymbol);
507 
508   status = target_read_memory (addr, buf, 4);
509   if (status != 0)
510     {
511       error ("Unable to find dynamic library list.\n");
512       return;
513     }
514 
515   addr = extract_unsigned_integer (buf, 4);
516 
517   /* If addr is zero, then we're using an old dynamic loader which
518      doesn't maintain __dld_list.  We'll have to use a completely
519      different approach to get shared library information.  */
520   if (addr == 0)
521     goto old_dld;
522 
523   /* Using the information in __dld_list is the preferred method
524      to get at shared library information.  It doesn't depend on
525      any functions in /opt/langtools/lib/end.o and has a chance of working
526      with hpux10 when it is released.  */
527   status = target_read_memory (addr, buf, 4);
528   if (status != 0)
529     {
530       error ("Unable to find dynamic library list.\n");
531       return;
532     }
533 
534   /* addr now holds the address of the first entry in the dynamic
535      library list.  */
536   addr = extract_unsigned_integer (buf, 4);
537 
538   /* Now that we have a pointer to the dynamic library list, walk
539      through it and add the symbols for each library.  */
540 
541   so_list_tail = so_list_head;
542   /* Find the end of the list of shared objects.  */
543   while (so_list_tail && so_list_tail->next)
544     so_list_tail = so_list_tail->next;
545 
546 #ifdef SOLIB_DEBUG
547   printf ("--About to read shared library list data\n");
548 #endif
549 
550   /* "addr" will always point to the base of the
551    * current data entry describing the current
552    * shared library.
553    */
554   while (1)
555     {
556       CORE_ADDR name_addr, text_addr;
557       unsigned int name_len;
558       char *name;
559       struct so_list *new_so;
560       struct so_list *so_list = so_list_head;
561       struct stat statbuf;
562       LONGEST st_size;
563       int is_main_program;
564 
565       if (addr == 0)
566 	break;
567 
568       /* Get a pointer to the name of this library.  */
569       status = target_read_memory (addr, buf, 4);
570       if (status != 0)
571 	goto err;
572 
573       name_addr = extract_unsigned_integer (buf, 4);
574       name_len = 0;
575       while (1)
576 	{
577 	  target_read_memory (name_addr + name_len, buf, 1);
578 	  if (status != 0)
579 	    goto err;
580 
581 	  name_len++;
582 	  if (*buf == '\0')
583 	    break;
584 	}
585       name = alloca (name_len);
586       status = target_read_memory (name_addr, name, name_len);
587       if (status != 0)
588 	goto err;
589 
590       /* See if we've already loaded something with this name.  */
591       while (so_list)
592 	{
593 	  if (!strcmp (so_list->som_solib.name, name))
594 	    break;
595 	  so_list = so_list->next;
596 	}
597 
598       /* See if the file exists.  If not, give a warning, but don't
599          die.  */
600       status = stat (name, &statbuf);
601       if (status == -1)
602 	{
603 	  warning ("Can't find file %s referenced in dld_list.", name);
604 
605 	  status = target_read_memory (addr + 36, buf, 4);
606 	  if (status != 0)
607 	    goto err;
608 
609 	  addr = (CORE_ADDR) extract_unsigned_integer (buf, 4);
610 	  continue;
611 	}
612 
613       /* If we've already loaded this one or it's the main program, skip it.  */
614       is_main_program = (strcmp (name, symfile_objfile->name) == 0);
615       if (so_list || is_main_program)
616 	{
617 	  /* This is the "next" pointer in the strcuture.
618 	   */
619 	  status = target_read_memory (addr + 36, buf, 4);
620 	  if (status != 0)
621 	    goto err;
622 
623 	  addr = (CORE_ADDR) extract_unsigned_integer (buf, 4);
624 
625 	  /* Record the main program's symbol table size. */
626 	  if (is_main_program && !so_list)
627 	    {
628 	      st_size = som_solib_sizeof_symbol_table (name);
629 	      som_solib_total_st_size += st_size;
630 	    }
631 
632 	  /* Was this a shlib that we noted but didn't load the symbols for?
633 	     If so, were we invoked this time from the command-line, via
634 	     a 'sharedlibrary' or 'add-symbol-file' command?  If yes to
635 	     both, we'd better load the symbols this time.
636 	   */
637 	  if (from_tty && so_list && !is_main_program && (so_list->objfile == NULL))
638 	    som_solib_load_symbols (so_list,
639 				    name,
640 				    from_tty,
641 				    so_list->som_solib.text_addr,
642 				    target);
643 
644 	  continue;
645 	}
646 
647       name = obsavestring (name, name_len - 1,
648 			   &symfile_objfile->objfile_obstack);
649 
650       status = target_read_memory (addr + 8, buf, 4);
651       if (status != 0)
652 	goto err;
653 
654       text_addr = extract_unsigned_integer (buf, 4);
655 
656       new_so = (struct so_list *) xmalloc (sizeof (struct so_list));
657       memset ((char *) new_so, 0, sizeof (struct so_list));
658       if (so_list_head == NULL)
659 	{
660 	  so_list_head = new_so;
661 	  so_list_tail = new_so;
662 	}
663       else
664 	{
665 	  so_list_tail->next = new_so;
666 	  so_list_tail = new_so;
667 	}
668 
669       /* Fill in all the entries in GDB's shared library list.
670        */
671 
672       new_so->solib_addr = addr;
673       new_so->som_solib.name = name;
674       status = target_read_memory (addr + 4, buf, 4);
675       if (status != 0)
676 	goto err;
677 
678       new_so->som_solib.struct_version = extract_unsigned_integer (buf + 3, 1);
679       new_so->som_solib.bind_mode = extract_unsigned_integer (buf + 2, 1);
680       /* Following is "high water mark", highest version number
681        * seen, rather than plain version number.
682        */
683       new_so->som_solib.library_version = extract_unsigned_integer (buf, 2);
684       new_so->som_solib.text_addr = text_addr;
685 
686       /* Q: What about longword at "addr + 8"?
687        * A: It's read above, out of order, into "text_addr".
688        */
689 
690       status = target_read_memory (addr + 12, buf, 4);
691       if (status != 0)
692 	goto err;
693 
694       new_so->som_solib.text_link_addr = extract_unsigned_integer (buf, 4);
695 
696       status = target_read_memory (addr + 16, buf, 4);
697       if (status != 0)
698 	goto err;
699 
700       new_so->som_solib.text_end = extract_unsigned_integer (buf, 4);
701 
702       status = target_read_memory (addr + 20, buf, 4);
703       if (status != 0)
704 	goto err;
705 
706       new_so->som_solib.data_start = extract_unsigned_integer (buf, 4);
707 
708       status = target_read_memory (addr + 24, buf, 4);
709       if (status != 0)
710 	goto err;
711 
712       new_so->som_solib.bss_start = extract_unsigned_integer (buf, 4);
713 
714       status = target_read_memory (addr + 28, buf, 4);
715       if (status != 0)
716 	goto err;
717 
718       new_so->som_solib.data_end = extract_unsigned_integer (buf, 4);
719 
720       status = target_read_memory (addr + 32, buf, 4);
721       if (status != 0)
722 	goto err;
723 
724       new_so->som_solib.got_value = extract_unsigned_integer (buf, 4);
725 
726       status = target_read_memory (addr + 36, buf, 4);
727       if (status != 0)
728 	goto err;
729 
730       /* FIXME: cagney/2003-02-01: I think som_solib.next should be a
731          CORE_ADDR.  */
732       new_so->som_solib.next =
733 	hpux_address_to_host_pointer_hack (extract_unsigned_integer (buf, 4));
734 
735       /* Note that we don't re-set "addr" to the next pointer
736        * until after we've read the trailing data.
737        */
738 
739       status = target_read_memory (addr + 40, buf, 4);
740       new_so->som_solib.tsd_start_addr = extract_unsigned_integer (buf, 4);
741       if (status != 0)
742 	goto err;
743 
744       /* Now indirect via that value!
745        */
746       status = target_read_memory (new_so->som_solib.tsd_start_addr, buf, 4);
747       new_so->som_solib.tsd_start_addr = extract_unsigned_integer (buf, 4);
748       if (status != 0)
749 	goto err;
750 #ifdef SOLIB_DEBUG
751       printf ("\n+ library \"%s\" is described at 0x%x\n", name, addr);
752       printf ("  'version' is %d\n", new_so->som_solib.struct_version);
753       printf ("  'bind_mode' is %d\n", new_so->som_solib.bind_mode);
754       printf ("  'library_version' is %d\n", new_so->som_solib.library_version);
755       printf ("  'text_addr' is 0x%x\n", new_so->som_solib.text_addr);
756       printf ("  'text_link_addr' is 0x%x\n", new_so->som_solib.text_link_addr);
757       printf ("  'text_end' is 0x%x\n", new_so->som_solib.text_end);
758       printf ("  'data_start' is 0x%x\n", new_so->som_solib.data_start);
759       printf ("  'bss_start' is 0x%x\n", new_so->som_solib.bss_start);
760       printf ("  'data_end' is 0x%x\n", new_so->som_solib.data_end);
761       printf ("  'got_value' is %x\n", new_so->som_solib.got_value);
762       printf ("  'next' is 0x%x\n", new_so->som_solib.next);
763       printf ("  'tsd_start_addr' is 0x%x\n", new_so->som_solib.tsd_start_addr);
764 #endif
765 
766       /* Go on to the next shared library descriptor.
767        */
768       addr = (CORE_ADDR) new_so->som_solib.next;
769 
770 
771 
772       /* At this point, we have essentially hooked the shlib into the
773          "info share" command.  However, we haven't yet loaded its
774          symbol table.  We must now decide whether we ought to, i.e.,
775          whether doing so would exceed the symbol table size threshold.
776 
777          If the threshold has just now been exceeded, then we'll issue
778          a warning message (which explains how to load symbols manually,
779          if the user so desires).
780 
781          If the threshold has just now or previously been exceeded,
782          we'll just add the shlib to the list of object files, but won't
783          actually load its symbols.  (This is more useful than it might
784          sound, for it allows us to e.g., still load and use the shlibs'
785          unwind information for stack tracebacks.)
786        */
787 
788       /* Note that we DON'T want to preclude the user from using the
789          add-symbol-file command!  Thus, we only worry about the threshold
790          when we're invoked for other reasons.
791        */
792       st_size = som_solib_sizeof_symbol_table (name);
793       som_solib_st_size_threshold_exceeded =
794 	!from_tty &&
795 	auto_solib_limit > 0 &&
796 	readsyms &&
797 	((st_size + som_solib_total_st_size) > (auto_solib_limit * (LONGEST) (1024 * 1024)));
798 
799       if (som_solib_st_size_threshold_exceeded)
800 	{
801 	  if (!threshold_warning_given)
802 	    warning ("Symbols for some libraries have not been loaded, because\ndoing so would exceed the size threshold specified by auto-solib-limit.\nTo manually load symbols, use the 'sharedlibrary' command.\nTo raise the threshold, set auto-solib-limit to a larger value and rerun\nthe program.\n");
803 	  threshold_warning_given = 1;
804 
805 	  /* We'll still make note of this shlib, even if we don't
806 	     read its symbols.  This allows us to use its unwind
807 	     information well enough to know how to e.g., correctly
808 	     do a traceback from a PC within the shlib, even if we
809 	     can't symbolize those PCs...
810 	   */
811 	  som_solib_add_solib_objfile (new_so, name, from_tty, text_addr);
812 	  continue;
813 	}
814 
815       som_solib_total_st_size += st_size;
816 
817       /* This fills in new_so->objfile, among others. */
818       som_solib_load_symbols (new_so, name, from_tty, text_addr, target);
819     }
820 
821 #ifdef SOLIB_DEBUG
822   printf ("--Done reading shared library data\n");
823 #endif
824 
825   /* Getting new symbols may change our opinion about what is
826      frameless.  */
827   reinit_frame_cache ();
828   return;
829 
830 old_dld:
831   error ("Debugging dynamic executables loaded via the hpux8 dld.sl is not supported.\n");
832   return;
833 
834 err:
835   error ("Error while reading dynamic library list.\n");
836   return;
837 }
838 
839 
840 /* This hook gets called just before the first instruction in the
841    inferior process is executed.
842 
843    This is our opportunity to set magic flags in the inferior so
844    that GDB can be notified when a shared library is mapped in and
845    to tell the dynamic linker that a private copy of the library is
846    needed (so GDB can set breakpoints in the library).
847 
848    __dld_flags is the location of the magic flags; as of this implementation
849    there are 3 flags of interest:
850 
851    bit 0 when set indicates that private copies of the libraries are needed
852    bit 1 when set indicates that the callback hook routine is valid
853    bit 2 when set indicates that the dynamic linker should maintain the
854    __dld_list structure when loading/unloading libraries.
855 
856    Note that shared libraries are not mapped in at this time, so we have
857    run the inferior until the libraries are mapped in.  Typically this
858    means running until the "_start" is called.  */
859 
860 void
som_solib_create_inferior_hook(void)861 som_solib_create_inferior_hook (void)
862 {
863   struct minimal_symbol *msymbol;
864   unsigned int dld_flags, status, have_endo;
865   asection *shlib_info;
866   char buf[4];
867   struct objfile *objfile;
868   CORE_ADDR anaddr;
869 
870   /* First, remove all the solib event breakpoints.  Their addresses
871      may have changed since the last time we ran the program.  */
872   remove_solib_event_breakpoints ();
873 
874   if (symfile_objfile == NULL)
875     return;
876 
877   /* First see if the objfile was dynamically linked.  */
878   shlib_info = bfd_get_section_by_name (symfile_objfile->obfd, "$SHLIB_INFO$");
879   if (!shlib_info)
880     return;
881 
882   /* It's got a $SHLIB_INFO$ section, make sure it's not empty.  */
883   if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0)
884     return;
885 
886   have_endo = 0;
887   /* Slam the pid of the process into __d_pid.
888 
889      We used to warn when this failed, but that warning is only useful
890      on very old HP systems (hpux9 and older).  The warnings are an
891      annoyance to users of modern systems and foul up the testsuite as
892      well.  As a result, the warnings have been disabled.  */
893   msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile);
894   if (msymbol == NULL)
895     goto keep_going;
896 
897   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
898   store_unsigned_integer (buf, 4, PIDGET (inferior_ptid));
899   status = target_write_memory (anaddr, buf, 4);
900   if (status != 0)
901     {
902       warning ("Unable to write __d_pid");
903       warning ("Suggest linking with /opt/langtools/lib/end.o.");
904       warning ("GDB will be unable to track shl_load/shl_unload calls");
905       goto keep_going;
906     }
907 
908   /* Get the value of _DLD_HOOK (an export stub) and put it in __dld_hook;
909      This will force the dynamic linker to call __d_trap when significant
910      events occur.
911 
912      Note that the above is the pre-HP-UX 9.0 behaviour.  At 9.0 and above,
913      the dld provides an export stub named "__d_trap" as well as the
914      function named "__d_trap" itself, but doesn't provide "_DLD_HOOK".
915      We'll look first for the old flavor and then the new.
916    */
917   msymbol = lookup_minimal_symbol ("_DLD_HOOK", NULL, symfile_objfile);
918   if (msymbol == NULL)
919     msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
920   if (msymbol == NULL)
921     {
922       warning ("Unable to find _DLD_HOOK symbol in object file.");
923       warning ("Suggest linking with /opt/langtools/lib/end.o.");
924       warning ("GDB will be unable to track shl_load/shl_unload calls");
925       goto keep_going;
926     }
927   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
928   dld_cache.hook.address = anaddr;
929 
930   /* Grrr, this might not be an export symbol!  We have to find the
931      export stub.  */
932   ALL_OBJFILES (objfile)
933   {
934     struct unwind_table_entry *u;
935     struct minimal_symbol *msymbol2;
936 
937     /* What a crock.  */
938     msymbol2 = lookup_minimal_symbol_solib_trampoline (DEPRECATED_SYMBOL_NAME (msymbol),
939 						       objfile);
940     /* Found a symbol with the right name.  */
941     if (msymbol2)
942       {
943 	struct unwind_table_entry *u;
944 	/* It must be a shared library trampoline.  */
945 	if (SYMBOL_TYPE (msymbol2) != mst_solib_trampoline)
946 	  continue;
947 
948 	/* It must also be an export stub.  */
949 	u = find_unwind_entry (SYMBOL_VALUE (msymbol2));
950 	if (!u || u->stub_unwind.stub_type != EXPORT)
951 	  continue;
952 
953 	/* OK.  Looks like the correct import stub.  */
954 	anaddr = SYMBOL_VALUE (msymbol2);
955 	dld_cache.hook_stub.address = anaddr;
956       }
957   }
958   store_unsigned_integer (buf, 4, anaddr);
959 
960   msymbol = lookup_minimal_symbol ("__dld_hook", NULL, symfile_objfile);
961   if (msymbol == NULL)
962     {
963       warning ("Unable to find __dld_hook symbol in object file.");
964       warning ("Suggest linking with /opt/langtools/lib/end.o.");
965       warning ("GDB will be unable to track shl_load/shl_unload calls");
966       goto keep_going;
967     }
968   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
969   status = target_write_memory (anaddr, buf, 4);
970 
971   /* Now set a shlib_event breakpoint at __d_trap so we can track
972      significant shared library events.  */
973   msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
974   if (msymbol == NULL)
975     {
976       warning ("Unable to find __dld_d_trap symbol in object file.");
977       warning ("Suggest linking with /opt/langtools/lib/end.o.");
978       warning ("GDB will be unable to track shl_load/shl_unload calls");
979       goto keep_going;
980     }
981   create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
982 
983   /* We have all the support usually found in end.o, so we can track
984      shl_load and shl_unload calls.  */
985   have_endo = 1;
986 
987 keep_going:
988 
989   /* Get the address of __dld_flags, if no such symbol exists, then we can
990      not debug the shared code.  */
991   msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
992   if (msymbol == NULL)
993     {
994       error ("Unable to find __dld_flags symbol in object file.\n");
995     }
996 
997   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
998 
999   /* Read the current contents.  */
1000   status = target_read_memory (anaddr, buf, 4);
1001   if (status != 0)
1002     {
1003       error ("Unable to read __dld_flags\n");
1004     }
1005   dld_flags = extract_unsigned_integer (buf, 4);
1006 
1007   /* Turn on the flags we care about.  */
1008   dld_flags |= DLD_FLAGS_MAPPRIVATE;
1009   if (have_endo)
1010     dld_flags |= DLD_FLAGS_HOOKVALID;
1011   store_unsigned_integer (buf, 4, dld_flags);
1012   status = target_write_memory (anaddr, buf, 4);
1013   if (status != 0)
1014     {
1015       error ("Unable to write __dld_flags\n");
1016     }
1017 
1018   /* Now find the address of _start and set a breakpoint there.
1019      We still need this code for two reasons:
1020 
1021      * Not all sites have /opt/langtools/lib/end.o, so it's not always
1022      possible to track the dynamic linker's events.
1023 
1024      * At this time no events are triggered for shared libraries
1025      loaded at startup time (what a crock).  */
1026 
1027   msymbol = lookup_minimal_symbol ("_start", NULL, symfile_objfile);
1028   if (msymbol == NULL)
1029     {
1030       error ("Unable to find _start symbol in object file.\n");
1031     }
1032 
1033   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
1034 
1035   /* Make the breakpoint at "_start" a shared library event breakpoint.  */
1036   create_solib_event_breakpoint (anaddr);
1037 
1038   /* Wipe out all knowledge of old shared libraries since their
1039      mapping can change from one exec to another!  */
1040   while (so_list_head)
1041     {
1042       struct so_list *temp;
1043 
1044       temp = so_list_head;
1045       xfree (so_list_head);
1046       so_list_head = temp->next;
1047     }
1048   clear_symtab_users ();
1049 }
1050 
1051 /* This operation removes the "hook" between GDB and the dynamic linker,
1052    which causes the dld to notify GDB of shared library events.
1053 
1054    After this operation completes, the dld will no longer notify GDB of
1055    shared library events.  To resume notifications, GDB must call
1056    som_solib_create_inferior_hook.
1057 
1058    This operation does not remove any knowledge of shared libraries which
1059    GDB may already have been notified of.
1060  */
1061 void
som_solib_remove_inferior_hook(int pid)1062 som_solib_remove_inferior_hook (int pid)
1063 {
1064   CORE_ADDR addr;
1065   struct minimal_symbol *msymbol;
1066   int status;
1067   char dld_flags_buffer[4];
1068   unsigned int dld_flags_value;
1069   struct cleanup *old_cleanups = save_inferior_ptid ();
1070 
1071   /* Ensure that we're really operating on the specified process. */
1072   inferior_ptid = pid_to_ptid (pid);
1073 
1074   /* We won't bother to remove the solib breakpoints from this process.
1075 
1076      In fact, on PA64 the breakpoint is hard-coded into the dld callback,
1077      and thus we're not supposed to remove it.
1078 
1079      Rather, we'll merely clear the dld_flags bit that enables callbacks.
1080    */
1081   msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
1082 
1083   addr = SYMBOL_VALUE_ADDRESS (msymbol);
1084   status = target_read_memory (addr, dld_flags_buffer, 4);
1085 
1086   dld_flags_value = extract_unsigned_integer (dld_flags_buffer, 4);
1087 
1088   dld_flags_value &= ~DLD_FLAGS_HOOKVALID;
1089   store_unsigned_integer (dld_flags_buffer, 4, dld_flags_value);
1090   status = target_write_memory (addr, dld_flags_buffer, 4);
1091 
1092   do_cleanups (old_cleanups);
1093 }
1094 
1095 
1096 /* This function creates a breakpoint on the dynamic linker hook, which
1097    is called when e.g., a shl_load or shl_unload call is made.  This
1098    breakpoint will only trigger when a shl_load call is made.
1099 
1100    If filename is NULL, then loads of any dll will be caught.  Else,
1101    only loads of the file whose pathname is the string contained by
1102    filename will be caught.
1103 
1104    Undefined behaviour is guaranteed if this function is called before
1105    som_solib_create_inferior_hook.
1106  */
1107 void
som_solib_create_catch_load_hook(int pid,int tempflag,char * filename,char * cond_string)1108 som_solib_create_catch_load_hook (int pid, int tempflag, char *filename,
1109 				  char *cond_string)
1110 {
1111   create_solib_load_event_breakpoint ("__d_trap", tempflag, filename, cond_string);
1112 }
1113 
1114 /* This function creates a breakpoint on the dynamic linker hook, which
1115    is called when e.g., a shl_load or shl_unload call is made.  This
1116    breakpoint will only trigger when a shl_unload call is made.
1117 
1118    If filename is NULL, then unloads of any dll will be caught.  Else,
1119    only unloads of the file whose pathname is the string contained by
1120    filename will be caught.
1121 
1122    Undefined behaviour is guaranteed if this function is called before
1123    som_solib_create_inferior_hook.
1124  */
1125 void
som_solib_create_catch_unload_hook(int pid,int tempflag,char * filename,char * cond_string)1126 som_solib_create_catch_unload_hook (int pid, int tempflag, char *filename,
1127 				    char *cond_string)
1128 {
1129   create_solib_unload_event_breakpoint ("__d_trap", tempflag, filename, cond_string);
1130 }
1131 
1132 int
som_solib_have_load_event(int pid)1133 som_solib_have_load_event (int pid)
1134 {
1135   CORE_ADDR event_kind;
1136 
1137   event_kind = read_register (HPPA_ARG0_REGNUM);
1138   return (event_kind == SHL_LOAD);
1139 }
1140 
1141 int
som_solib_have_unload_event(int pid)1142 som_solib_have_unload_event (int pid)
1143 {
1144   CORE_ADDR event_kind;
1145 
1146   event_kind = read_register (HPPA_ARG0_REGNUM);
1147   return (event_kind == SHL_UNLOAD);
1148 }
1149 
1150 static char *
som_solib_library_pathname(int pid)1151 som_solib_library_pathname (int pid)
1152 {
1153   CORE_ADDR dll_handle_address;
1154   CORE_ADDR dll_pathname_address;
1155   struct som_solib_mapped_entry dll_descriptor;
1156   char *p;
1157   static char dll_pathname[1024];
1158 
1159   /* Read the descriptor of this newly-loaded library. */
1160   dll_handle_address = read_register (HPPA_ARG1_REGNUM);
1161   read_memory (dll_handle_address, (char *) &dll_descriptor, sizeof (dll_descriptor));
1162 
1163   /* We can find a pointer to the dll's pathname within the descriptor. */
1164   dll_pathname_address = (CORE_ADDR) dll_descriptor.name;
1165 
1166   /* Read the pathname, one byte at a time. */
1167   p = dll_pathname;
1168   for (;;)
1169     {
1170       char b;
1171       read_memory (dll_pathname_address++, (char *) &b, 1);
1172       *p++ = b;
1173       if (b == '\0')
1174 	break;
1175     }
1176 
1177   return dll_pathname;
1178 }
1179 
1180 char *
som_solib_loaded_library_pathname(int pid)1181 som_solib_loaded_library_pathname (int pid)
1182 {
1183   if (!som_solib_have_load_event (pid))
1184     error ("Must have a load event to use this query");
1185 
1186   return som_solib_library_pathname (pid);
1187 }
1188 
1189 char *
som_solib_unloaded_library_pathname(int pid)1190 som_solib_unloaded_library_pathname (int pid)
1191 {
1192   if (!som_solib_have_unload_event (pid))
1193     error ("Must have an unload event to use this query");
1194 
1195   return som_solib_library_pathname (pid);
1196 }
1197 
1198 static void
som_solib_desire_dynamic_linker_symbols(void)1199 som_solib_desire_dynamic_linker_symbols (void)
1200 {
1201   struct objfile *objfile;
1202   struct unwind_table_entry *u;
1203   struct minimal_symbol *dld_msymbol;
1204 
1205   /* Do we already know the value of these symbols?  If so, then
1206      we've no work to do.
1207 
1208      (If you add clauses to this test, be sure to likewise update the
1209      test within the loop.)
1210    */
1211   if (dld_cache.is_valid)
1212     return;
1213 
1214   ALL_OBJFILES (objfile)
1215   {
1216     dld_msymbol = lookup_minimal_symbol ("shl_load", NULL, objfile);
1217     if (dld_msymbol != NULL)
1218       {
1219 	dld_cache.load.address = SYMBOL_VALUE (dld_msymbol);
1220 	dld_cache.load.unwind = find_unwind_entry (dld_cache.load.address);
1221       }
1222 
1223     dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_load",
1224 							  objfile);
1225     if (dld_msymbol != NULL)
1226       {
1227 	if (SYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
1228 	  {
1229 	    u = find_unwind_entry (SYMBOL_VALUE (dld_msymbol));
1230 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
1231 	      {
1232 		dld_cache.load_stub.address = SYMBOL_VALUE (dld_msymbol);
1233 		dld_cache.load_stub.unwind = u;
1234 	      }
1235 	  }
1236       }
1237 
1238     dld_msymbol = lookup_minimal_symbol ("shl_unload", NULL, objfile);
1239     if (dld_msymbol != NULL)
1240       {
1241 	dld_cache.unload.address = SYMBOL_VALUE (dld_msymbol);
1242 	dld_cache.unload.unwind = find_unwind_entry (dld_cache.unload.address);
1243 
1244 	/* ??rehrauer: I'm not sure exactly what this is, but it appears
1245 	   that on some HPUX 10.x versions, there's two unwind regions to
1246 	   cover the body of "shl_unload", the second being 4 bytes past
1247 	   the end of the first.  This is a large hack to handle that
1248 	   case, but since I don't seem to have any legitimate way to
1249 	   look for this thing via the symbol table...
1250 	 */
1251 	if (dld_cache.unload.unwind != NULL)
1252 	  {
1253 	    u = find_unwind_entry (dld_cache.unload.unwind->region_end + 4);
1254 	    if (u != NULL)
1255 	      {
1256 		dld_cache.unload2.address = u->region_start;
1257 		dld_cache.unload2.unwind = u;
1258 	      }
1259 	  }
1260       }
1261 
1262     dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_unload",
1263 							  objfile);
1264     if (dld_msymbol != NULL)
1265       {
1266 	if (SYMBOL_TYPE (dld_msymbol) == mst_solib_trampoline)
1267 	  {
1268 	    u = find_unwind_entry (SYMBOL_VALUE (dld_msymbol));
1269 	    if ((u != NULL) && (u->stub_unwind.stub_type == EXPORT))
1270 	      {
1271 		dld_cache.unload_stub.address = SYMBOL_VALUE (dld_msymbol);
1272 		dld_cache.unload_stub.unwind = u;
1273 	      }
1274 	  }
1275       }
1276 
1277     /* Did we find everything we were looking for?  If so, stop. */
1278     if ((dld_cache.load.address != 0)
1279 	&& (dld_cache.load_stub.address != 0)
1280 	&& (dld_cache.unload.address != 0)
1281 	&& (dld_cache.unload_stub.address != 0))
1282       {
1283 	dld_cache.is_valid = 1;
1284 	break;
1285       }
1286   }
1287 
1288   dld_cache.hook.unwind = find_unwind_entry (dld_cache.hook.address);
1289   dld_cache.hook_stub.unwind = find_unwind_entry (dld_cache.hook_stub.address);
1290 
1291   /* We're prepared not to find some of these symbols, which is why
1292      this function is a "desire" operation, and not a "require".
1293    */
1294 }
1295 
1296 int
som_solib_in_dynamic_linker(int pid,CORE_ADDR pc)1297 som_solib_in_dynamic_linker (int pid, CORE_ADDR pc)
1298 {
1299   struct unwind_table_entry *u_pc;
1300 
1301   /* Are we in the dld itself?
1302 
1303      ??rehrauer: Large hack -- We'll assume that any address in a
1304      shared text region is the dld's text.  This would obviously
1305      fall down if the user attached to a process, whose shlibs
1306      weren't mapped to a (writeable) private region.  However, in
1307      that case the debugger probably isn't able to set the fundamental
1308      breakpoint in the dld callback anyways, so this hack should be
1309      safe.
1310    */
1311   if ((pc & (CORE_ADDR) 0xc0000000) == (CORE_ADDR) 0xc0000000)
1312     return 1;
1313 
1314   /* Cache the address of some symbols that are part of the dynamic
1315      linker, if not already known.
1316    */
1317   som_solib_desire_dynamic_linker_symbols ();
1318 
1319   /* Are we in the dld callback?  Or its export stub? */
1320   u_pc = find_unwind_entry (pc);
1321   if (u_pc == NULL)
1322     return 0;
1323 
1324   if ((u_pc == dld_cache.hook.unwind) || (u_pc == dld_cache.hook_stub.unwind))
1325     return 1;
1326 
1327   /* Or the interface of the dld (i.e., "shl_load" or friends)? */
1328   if ((u_pc == dld_cache.load.unwind)
1329       || (u_pc == dld_cache.unload.unwind)
1330       || (u_pc == dld_cache.unload2.unwind)
1331       || (u_pc == dld_cache.load_stub.unwind)
1332       || (u_pc == dld_cache.unload_stub.unwind))
1333     return 1;
1334 
1335   /* Apparently this address isn't part of the dld's text. */
1336   return 0;
1337 }
1338 
1339 
1340 /* Return the GOT value for the shared library in which ADDR belongs.  If
1341    ADDR isn't in any known shared library, return zero.  */
1342 
1343 CORE_ADDR
som_solib_get_got_by_pc(CORE_ADDR addr)1344 som_solib_get_got_by_pc (CORE_ADDR addr)
1345 {
1346   struct so_list *so_list = so_list_head;
1347   CORE_ADDR got_value = 0;
1348 
1349   while (so_list)
1350     {
1351       if (so_list->som_solib.text_addr <= addr
1352 	  && so_list->som_solib.text_end > addr)
1353 	{
1354 	  got_value = so_list->som_solib.got_value;
1355 	  break;
1356 	}
1357       so_list = so_list->next;
1358     }
1359   return got_value;
1360 }
1361 
1362 /*  elz:
1363    Return the address of the handle of the shared library
1364    in which ADDR belongs.  If
1365    ADDR isn't in any known shared library, return zero.  */
1366 /* this function is used in hppa_fix_call_dummy in hppa-tdep.c */
1367 
1368 CORE_ADDR
som_solib_get_solib_by_pc(CORE_ADDR addr)1369 som_solib_get_solib_by_pc (CORE_ADDR addr)
1370 {
1371   struct so_list *so_list = so_list_head;
1372 
1373   while (so_list)
1374     {
1375       if (so_list->som_solib.text_addr <= addr
1376 	  && so_list->som_solib.text_end > addr)
1377 	{
1378 	  break;
1379 	}
1380       so_list = so_list->next;
1381     }
1382   if (so_list)
1383     return so_list->solib_addr;
1384   else
1385     return 0;
1386 }
1387 
1388 
1389 int
som_solib_section_offsets(struct objfile * objfile,struct section_offsets * offsets)1390 som_solib_section_offsets (struct objfile *objfile,
1391 			   struct section_offsets *offsets)
1392 {
1393   struct so_list *so_list = so_list_head;
1394 
1395   while (so_list)
1396     {
1397       /* Oh what a pain!  We need the offsets before so_list->objfile
1398          is valid.  The BFDs will never match.  Make a best guess.  */
1399       if (strstr (objfile->name, so_list->som_solib.name))
1400 	{
1401 	  asection *private_section;
1402 
1403 	  /* The text offset is easy.  */
1404 	  offsets->offsets[SECT_OFF_TEXT (objfile)]
1405 	    = (so_list->som_solib.text_addr
1406 	       - so_list->som_solib.text_link_addr);
1407 	  offsets->offsets[SECT_OFF_RODATA (objfile)]
1408 	    = ANOFFSET (offsets, SECT_OFF_TEXT (objfile));
1409 
1410 	  /* We should look at presumed_dp in the SOM header, but
1411 	     that's not easily available.  This should be OK though.  */
1412 	  private_section = bfd_get_section_by_name (objfile->obfd,
1413 						     "$PRIVATE$");
1414 	  if (!private_section)
1415 	    {
1416 	      warning ("Unable to find $PRIVATE$ in shared library!");
1417 	      offsets->offsets[SECT_OFF_DATA (objfile)] = 0;
1418 	      offsets->offsets[SECT_OFF_BSS (objfile)] = 0;
1419 	      return 1;
1420 	    }
1421 	  offsets->offsets[SECT_OFF_DATA (objfile)]
1422 	    = (so_list->som_solib.data_start - private_section->vma);
1423 	  offsets->offsets[SECT_OFF_BSS (objfile)]
1424 	    = ANOFFSET (offsets, SECT_OFF_DATA (objfile));
1425 	  return 1;
1426 	}
1427       so_list = so_list->next;
1428     }
1429   return 0;
1430 }
1431 
1432 /* Dump information about all the currently loaded shared libraries.  */
1433 
1434 static void
som_sharedlibrary_info_command(char * ignore,int from_tty)1435 som_sharedlibrary_info_command (char *ignore, int from_tty)
1436 {
1437   struct so_list *so_list = so_list_head;
1438 
1439   if (exec_bfd == NULL)
1440     {
1441       printf_unfiltered ("No executable file.\n");
1442       return;
1443     }
1444 
1445   if (so_list == NULL)
1446     {
1447       printf_unfiltered ("No shared libraries loaded at this time.\n");
1448       return;
1449     }
1450 
1451   printf_unfiltered ("Shared Object Libraries\n");
1452   printf_unfiltered ("    %-12s%-12s%-12s%-12s%-12s%-12s\n",
1453 	 "  flags", "  tstart", "   tend", "  dstart", "   dend", "   dlt");
1454   while (so_list)
1455     {
1456       unsigned int flags;
1457 
1458       flags = so_list->som_solib.struct_version << 24;
1459       flags |= so_list->som_solib.bind_mode << 16;
1460       flags |= so_list->som_solib.library_version;
1461       printf_unfiltered ("%s", so_list->som_solib.name);
1462       if (so_list->objfile == NULL)
1463 	printf_unfiltered ("  (symbols not loaded)");
1464       printf_unfiltered ("\n");
1465       printf_unfiltered ("    %-12s", local_hex_string_custom (flags, "08l"));
1466       printf_unfiltered ("%-12s",
1467 	     local_hex_string_custom (so_list->som_solib.text_addr, "08l"));
1468       printf_unfiltered ("%-12s",
1469 	      local_hex_string_custom (so_list->som_solib.text_end, "08l"));
1470       printf_unfiltered ("%-12s",
1471 	    local_hex_string_custom (so_list->som_solib.data_start, "08l"));
1472       printf_unfiltered ("%-12s",
1473 	      local_hex_string_custom (so_list->som_solib.data_end, "08l"));
1474       printf_unfiltered ("%-12s\n",
1475 	     local_hex_string_custom (so_list->som_solib.got_value, "08l"));
1476       so_list = so_list->next;
1477     }
1478 }
1479 
1480 static void
som_solib_sharedlibrary_command(char * args,int from_tty)1481 som_solib_sharedlibrary_command (char *args, int from_tty)
1482 {
1483   dont_repeat ();
1484   som_solib_add (args, from_tty, (struct target_ops *) 0, 1);
1485 }
1486 
1487 
1488 
1489 char *
som_solib_address(CORE_ADDR addr)1490 som_solib_address (CORE_ADDR addr)
1491 {
1492   struct so_list *so = so_list_head;
1493 
1494   while (so)
1495     {
1496       /* Is this address within this shlib's text range?  If so,
1497          return the shlib's name.
1498        */
1499       if ((addr >= so->som_solib.text_addr) && (addr <= so->som_solib.text_end))
1500 	return so->som_solib.name;
1501 
1502       /* Nope, keep looking... */
1503       so = so->next;
1504     }
1505 
1506   /* No, we couldn't prove that the address is within a shlib. */
1507   return NULL;
1508 }
1509 
1510 
1511 void
som_solib_restart(void)1512 som_solib_restart (void)
1513 {
1514   struct so_list *sl = so_list_head;
1515 
1516   /* Before the shlib info vanishes, use it to disable any breakpoints
1517      that may still be active in those shlibs.
1518    */
1519   disable_breakpoints_in_shlibs (0);
1520 
1521   /* Discard all the shlib descriptors.
1522    */
1523   while (sl)
1524     {
1525       struct so_list *next_sl = sl->next;
1526       xfree (sl);
1527       sl = next_sl;
1528     }
1529   so_list_head = NULL;
1530 
1531   som_solib_total_st_size = (LONGEST) 0;
1532   som_solib_st_size_threshold_exceeded = 0;
1533 
1534   dld_cache.is_valid = 0;
1535 
1536   dld_cache.hook.address = 0;
1537   dld_cache.hook.unwind = NULL;
1538 
1539   dld_cache.hook_stub.address = 0;
1540   dld_cache.hook_stub.unwind = NULL;
1541 
1542   dld_cache.load.address = 0;
1543   dld_cache.load.unwind = NULL;
1544 
1545   dld_cache.load_stub.address = 0;
1546   dld_cache.load_stub.unwind = NULL;
1547 
1548   dld_cache.unload.address = 0;
1549   dld_cache.unload.unwind = NULL;
1550 
1551   dld_cache.unload2.address = 0;
1552   dld_cache.unload2.unwind = NULL;
1553 
1554   dld_cache.unload_stub.address = 0;
1555   dld_cache.unload_stub.unwind = NULL;
1556 }
1557 
1558 
1559 /* LOCAL FUNCTION
1560 
1561    no_shared_libraries -- handle command to explicitly discard symbols
1562    from shared libraries.
1563 
1564    DESCRIPTION
1565 
1566    Implements the command "nosharedlibrary", which discards symbols
1567    that have been auto-loaded from shared libraries.  Symbols from
1568    shared libraries that were added by explicit request of the user
1569    are not discarded.  Also called from remote.c.  */
1570 
1571 void
no_shared_libraries(char * ignored,int from_tty)1572 no_shared_libraries (char *ignored, int from_tty)
1573 {
1574   /* FIXME */
1575 }
1576 
1577 
1578 void
_initialize_som_solib(void)1579 _initialize_som_solib (void)
1580 {
1581   add_com ("sharedlibrary", class_files, som_solib_sharedlibrary_command,
1582 	   "Load shared object library symbols for files matching REGEXP.");
1583   add_info ("sharedlibrary", som_sharedlibrary_info_command,
1584 	    "Status of loaded shared object libraries.");
1585 
1586   add_show_from_set
1587     (add_set_cmd ("auto-solib-add", class_support, var_boolean,
1588 		  (char *) &auto_solib_add,
1589 		  "Set autoloading of shared library symbols.\n\
1590 If \"on\", symbols from all shared object libraries will be loaded\n\
1591 automatically when the inferior begins execution, when the dynamic linker\n\
1592 informs gdb that a new library has been loaded, or when attaching to the\n\
1593 inferior.  Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
1594 		  &setlist),
1595      &showlist);
1596 
1597   add_show_from_set
1598     (add_set_cmd ("auto-solib-limit", class_support, var_zinteger,
1599 		  (char *) &auto_solib_limit,
1600 		  "Set threshold (in Mb) for autoloading shared library symbols.\n\
1601 When shared library autoloading is enabled, new libraries will be loaded\n\
1602 only until the total size of shared library symbols exceeds this\n\
1603 threshold in megabytes.  Is ignored when using `sharedlibrary'.",
1604 		  &setlist),
1605      &showlist);
1606 
1607   /* ??rehrauer: On HP-UX, the kernel parameter MAXDSIZ limits how
1608      much data space a process can use.  We ought to be reading
1609      MAXDSIZ and setting auto_solib_limit to some large fraction of
1610      that value.  If not that, we maybe ought to be setting it smaller
1611      than the default for MAXDSIZ (that being 64Mb, I believe).
1612      However, [1] this threshold is only crudely approximated rather
1613      than actually measured, and [2] 50 Mbytes is too small for
1614      debugging gdb itself.  Thus, the arbitrary 100 figure.  */
1615   auto_solib_limit = 100;	/* Megabytes */
1616 
1617   som_solib_restart ();
1618 }
1619 
1620 /* Get some HPUX-specific data from a shared lib.
1621  */
1622 CORE_ADDR
so_lib_thread_start_addr(struct so_list * so)1623 so_lib_thread_start_addr (struct so_list *so)
1624 {
1625   return so->som_solib.tsd_start_addr;
1626 }
1627