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