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. */
61extern 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
81struct 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.  */
138struct 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
153static 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.  */
164static 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 */
175static 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 */
180typedef struct
181  {
182    CORE_ADDR address;
183    struct unwind_table_entry *unwind;
184  }
185addr_and_unwind_t;
186
187/* When adding fields, be sure to clear them in _initialize_som_solib. */
188static 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  }
199dld_cache;
200
201
202
203static void som_sharedlibrary_info_command (char *, int);
204
205static void som_solib_sharedlibrary_command (char *, int);
206
207static LONGEST
208som_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
279static void
280som_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
334static void
335som_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
407static void *
408hpux_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
421void
422som_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
831old_dld:
832  error ("Debugging dynamic executables loaded via the hpux8 dld.sl is not supported.\n");
833  return;
834
835err:
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
861void
862som_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
988keep_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 */
1062void
1063som_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 */
1108void
1109som_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 */
1126void
1127som_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
1133int
1134som_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
1142int
1143som_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
1151static char *
1152som_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
1181char *
1182som_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
1190char *
1191som_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
1199static void
1200som_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
1297int
1298som_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
1344CORE_ADDR
1345som_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
1369CORE_ADDR
1370som_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
1390int
1391som_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
1435static void
1436som_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
1481static void
1482som_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
1490char *
1491som_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
1512void
1513som_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
1572void
1573no_shared_libraries (char *ignored, int from_tty)
1574{
1575  /* FIXME */
1576}
1577
1578
1579void
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\
1591If \"on\", symbols from all shared object libraries will be loaded\n\
1592automatically when the inferior begins execution, when the dynamic linker\n\
1593informs gdb that a new library has been loaded, or when attaching to the\n\
1594inferior.  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\
1602When shared library autoloading is enabled, new libraries will be loaded\n\
1603only until the total size of shared library symbols exceeds this\n\
1604threshold 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 */
1623CORE_ADDR
1624so_lib_thread_start_addr (struct so_list *so)
1625{
1626  return so->som_solib.tsd_start_addr;
1627}
1628