OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [somsolib.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.