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

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [gdb/] [osfsolib.c] - Blame information for rev 1182

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Handle OSF/1 shared libraries for GDB, the GNU Debugger.
2
   Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000
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
/* FIXME: Most of this code could be merged with solib.c by using
23
   next_link_map_member and xfer_link_map_member in solib.c.  */
24
 
25
#include "defs.h"
26
 
27
#include <sys/types.h>
28
#include <signal.h>
29
#include "gdb_string.h"
30
#include <fcntl.h>
31
 
32
#include "symtab.h"
33
#include "bfd.h"
34
#include "symfile.h"
35
#include "objfiles.h"
36
#include "gdbcore.h"
37
#include "command.h"
38
#include "target.h"
39
#include "frame.h"
40
#include "gdb_regex.h"
41
#include "inferior.h"
42
#include "language.h"
43
#include "gdbcmd.h"
44
 
45
#define MAX_PATH_SIZE 1024      /* FIXME: Should be dynamic */
46
 
47
/* When handling shared libraries, GDB has to find out the pathnames
48
   of all shared libraries that are currently loaded (to read in their
49
   symbols) and where the shared libraries are loaded in memory
50
   (to relocate them properly from their prelinked addresses to the
51
   current load address).
52
 
53
   Under OSF/1 there are two possibilities to get at this information:
54
   1) Peek around in the runtime loader structures.
55
   These are not documented, and they are not defined in the system
56
   header files. The definitions below were obtained by experimentation,
57
   but they seem stable enough.
58
   2) Use the undocumented libxproc.a library, which contains the
59
   equivalent ldr_* routines.
60
   This approach is somewhat cleaner, but it requires that the GDB
61
   executable is dynamically linked. In addition it requires a
62
   NAT_CLIBS= -lxproc -Wl,-expect_unresolved,ldr_process_context
63
   linker specification for GDB and all applications that are using
64
   libgdb.
65
   We will use the peeking approach until it becomes unwieldy.  */
66
 
67
#ifndef USE_LDR_ROUTINES
68
 
69
/* Definition of runtime loader structures, found by experimentation.  */
70
#define RLD_CONTEXT_ADDRESS     0x3ffc0000000
71
 
72
typedef struct
73
  {
74
    CORE_ADDR next;
75
    CORE_ADDR previous;
76
    CORE_ADDR unknown1;
77
    char *module_name;
78
    CORE_ADDR modinfo_addr;
79
    long module_id;
80
    CORE_ADDR unknown2;
81
    CORE_ADDR unknown3;
82
    long region_count;
83
    CORE_ADDR regioninfo_addr;
84
  }
85
ldr_module_info_t;
86
 
87
typedef struct
88
  {
89
    long unknown1;
90
    CORE_ADDR regionname_addr;
91
    long protection;
92
    CORE_ADDR vaddr;
93
    CORE_ADDR mapaddr;
94
    long size;
95
    long unknown2[5];
96
  }
97
ldr_region_info_t;
98
 
99
typedef struct
100
  {
101
    CORE_ADDR unknown1;
102
    CORE_ADDR unknown2;
103
    CORE_ADDR head;
104
    CORE_ADDR tail;
105
  }
106
ldr_context_t;
107
 
108
static ldr_context_t ldr_context;
109
 
110
#else
111
 
112
#include <loader.h>
113
static ldr_process_t fake_ldr_process;
114
 
115
/* Called by ldr_* routines to read memory from the current target.  */
116
 
117
static int ldr_read_memory (CORE_ADDR, char *, int, int);
118
 
119
static int
120
ldr_read_memory (CORE_ADDR memaddr, char *myaddr, int len, int readstring)
121
{
122
  int result;
123
  char *buffer;
124
 
125
  if (readstring)
126
    {
127
      target_read_string (memaddr, &buffer, len, &result);
128
      if (result == 0)
129
        strcpy (myaddr, buffer);
130
      xfree (buffer);
131
    }
132
  else
133
    result = target_read_memory (memaddr, myaddr, len);
134
 
135
  if (result != 0)
136
    result = -result;
137
  return result;
138
}
139
 
140
#endif
141
 
142
/* Define our own link_map structure.
143
   This will help to share code with solib.c.  */
144
 
145
struct link_map
146
{
147
  CORE_ADDR l_offset;           /* prelink to load address offset */
148
  char *l_name;                 /* full name of loaded object */
149
  ldr_module_info_t module_info;        /* corresponding module info */
150
};
151
 
152
#define LM_OFFSET(so) ((so) -> lm.l_offset)
153
#define LM_NAME(so) ((so) -> lm.l_name)
154
 
155
struct so_list
156
  {
157
    struct so_list *next;       /* next structure in linked list */
158
    struct link_map lm;         /* copy of link map from inferior */
159
    struct link_map *lmaddr;    /* addr in inferior lm was read from */
160
    CORE_ADDR lmend;            /* upper addr bound of mapped object */
161
    char so_name[MAX_PATH_SIZE];        /* shared object lib name (FIXME) */
162
    char symbols_loaded;        /* flag: symbols read in yet? */
163
    char from_tty;              /* flag: print msgs? */
164
    struct objfile *objfile;    /* objfile for loaded lib */
165
    struct section_table *sections;
166
    struct section_table *sections_end;
167
    struct section_table *textsection;
168
    bfd *abfd;
169
  };
170
 
171
static struct so_list *so_list_head;    /* List of known shared objects */
172
 
173
extern int fdmatch (int, int);  /* In libiberty */
174
 
175
/* Local function prototypes */
176
 
177
static void sharedlibrary_command (char *, int);
178
 
179
static void info_sharedlibrary_command (char *, int);
180
 
181
static int symbol_add_stub (char *);
182
 
183
static struct so_list *find_solib (struct so_list *);
184
 
185
static struct link_map *first_link_map_member (void);
186
 
187
static struct link_map *next_link_map_member (struct so_list *);
188
 
189
static void xfer_link_map_member (struct so_list *, struct link_map *);
190
 
191
static int solib_map_sections (char *);
192
 
193
/*
194
 
195
   LOCAL FUNCTION
196
 
197
   solib_map_sections -- open bfd and build sections for shared lib
198
 
199
   SYNOPSIS
200
 
201
   static int solib_map_sections (struct so_list *so)
202
 
203
   DESCRIPTION
204
 
205
   Given a pointer to one of the shared objects in our list
206
   of mapped objects, use the recorded name to open a bfd
207
   descriptor for the object, build a section table, and then
208
   relocate all the section addresses by the base address at
209
   which the shared object was mapped.
210
 
211
   FIXMES
212
 
213
   In most (all?) cases the shared object file name recorded in the
214
   dynamic linkage tables will be a fully qualified pathname.  For
215
   cases where it isn't, do we really mimic the systems search
216
   mechanism correctly in the below code (particularly the tilde
217
   expansion stuff?).
218
 */
219
 
220
static int
221
solib_map_sections (char *arg)
222
{
223
  struct so_list *so = (struct so_list *) arg;  /* catch_errors bogon */
224
  char *filename;
225
  char *scratch_pathname;
226
  int scratch_chan;
227
  struct section_table *p;
228
  struct cleanup *old_chain;
229
  bfd *abfd;
230
 
231
  filename = tilde_expand (so->so_name);
232
  old_chain = make_cleanup (xfree, filename);
233
 
234
  scratch_chan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0,
235
                        &scratch_pathname);
236
  if (scratch_chan < 0)
237
    {
238
      scratch_chan = openp (getenv ("LD_LIBRARY_PATH"), 1, filename,
239
                            O_RDONLY, 0, &scratch_pathname);
240
    }
241
  if (scratch_chan < 0)
242
    {
243
      perror_with_name (filename);
244
    }
245
  /* Leave scratch_pathname allocated.  bfd->name will point to it.  */
246
 
247
  abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
248
  if (!abfd)
249
    {
250
      close (scratch_chan);
251
      error ("Could not open `%s' as an executable file: %s",
252
             scratch_pathname, bfd_errmsg (bfd_get_error ()));
253
    }
254
  /* Leave bfd open, core_xfer_memory and "info files" need it.  */
255
  so->abfd = abfd;
256
  abfd->cacheable = 1;
257
 
258
  if (!bfd_check_format (abfd, bfd_object))
259
    {
260
      error ("\"%s\": not in executable format: %s.",
261
             scratch_pathname, bfd_errmsg (bfd_get_error ()));
262
    }
263
  if (build_section_table (abfd, &so->sections, &so->sections_end))
264
    {
265
      error ("Can't find the file sections in `%s': %s",
266
             bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
267
    }
268
 
269
  for (p = so->sections; p < so->sections_end; p++)
270
    {
271
      /* Relocate the section binding addresses as recorded in the shared
272
         object's file by the offset to get the address to which the
273
         object was actually mapped.  */
274
      p->addr += LM_OFFSET (so);
275
      p->endaddr += LM_OFFSET (so);
276
      so->lmend = (CORE_ADDR) max (p->endaddr, so->lmend);
277
      if (STREQ (p->the_bfd_section->name, ".text"))
278
        {
279
          so->textsection = p;
280
        }
281
    }
282
 
283
  /* Free the file names, close the file now.  */
284
  do_cleanups (old_chain);
285
 
286
  return (1);
287
}
288
 
289
/*
290
 
291
   LOCAL FUNCTION
292
 
293
   first_link_map_member -- locate first member in dynamic linker's map
294
 
295
   SYNOPSIS
296
 
297
   static struct link_map *first_link_map_member (void)
298
 
299
   DESCRIPTION
300
 
301
   Read in a copy of the first member in the inferior's dynamic
302
   link map from the inferior's dynamic linker structures, and return
303
   a pointer to the copy in our address space.
304
 */
305
 
306
static struct link_map *
307
first_link_map_member (void)
308
{
309
  struct link_map *lm = NULL;
310
  static struct link_map first_lm;
311
 
312
#ifdef USE_LDR_ROUTINES
313
  ldr_module_t mod_id = LDR_NULL_MODULE;
314
  size_t retsize;
315
 
316
  fake_ldr_process = ldr_core_process ();
317
  ldr_set_core_reader (ldr_read_memory);
318
  ldr_xdetach (fake_ldr_process);
319
  if (ldr_xattach (fake_ldr_process) != 0
320
      || ldr_next_module (fake_ldr_process, &mod_id) != 0
321
      || mod_id == LDR_NULL_MODULE
322
      || ldr_inq_module (fake_ldr_process, mod_id,
323
                         &first_lm.module_info, sizeof (ldr_module_info_t),
324
                         &retsize) != 0)
325
    return lm;
326
#else
327
  CORE_ADDR ldr_context_addr;
328
 
329
  if (target_read_memory ((CORE_ADDR) RLD_CONTEXT_ADDRESS,
330
                          (char *) &ldr_context_addr,
331
                          sizeof (CORE_ADDR)) != 0
332
      || target_read_memory (ldr_context_addr,
333
                             (char *) &ldr_context,
334
                             sizeof (ldr_context_t)) != 0
335
      || target_read_memory ((CORE_ADDR) ldr_context.head,
336
                             (char *) &first_lm.module_info,
337
                             sizeof (ldr_module_info_t)) != 0)
338
    return lm;
339
#endif
340
 
341
  lm = &first_lm;
342
 
343
  /* The first entry is for the main program and should be skipped.  */
344
  lm->l_name = NULL;
345
 
346
  return lm;
347
}
348
 
349
static struct link_map *
350
next_link_map_member (struct so_list *so_list_ptr)
351
{
352
  struct link_map *lm = NULL;
353
  static struct link_map next_lm;
354
#ifdef USE_LDR_ROUTINES
355
  ldr_module_t mod_id = so_list_ptr->lm.module_info.lmi_modid;
356
  size_t retsize;
357
 
358
  if (ldr_next_module (fake_ldr_process, &mod_id) != 0
359
      || mod_id == LDR_NULL_MODULE
360
      || ldr_inq_module (fake_ldr_process, mod_id,
361
                         &next_lm.module_info, sizeof (ldr_module_info_t),
362
                         &retsize) != 0)
363
    return lm;
364
 
365
  lm = &next_lm;
366
  lm->l_name = lm->module_info.lmi_name;
367
#else
368
  CORE_ADDR ldr_context_addr;
369
 
370
  /* Reread context in case ldr_context.tail was updated.  */
371
 
372
  if (target_read_memory ((CORE_ADDR) RLD_CONTEXT_ADDRESS,
373
                          (char *) &ldr_context_addr,
374
                          sizeof (CORE_ADDR)) != 0
375
      || target_read_memory (ldr_context_addr,
376
                             (char *) &ldr_context,
377
                             sizeof (ldr_context_t)) != 0
378
      || so_list_ptr->lm.module_info.modinfo_addr == ldr_context.tail
379
      || target_read_memory (so_list_ptr->lm.module_info.next,
380
                             (char *) &next_lm.module_info,
381
                             sizeof (ldr_module_info_t)) != 0)
382
    return lm;
383
 
384
  lm = &next_lm;
385
  lm->l_name = lm->module_info.module_name;
386
#endif
387
  return lm;
388
}
389
 
390
static void
391
xfer_link_map_member (struct so_list *so_list_ptr, struct link_map *lm)
392
{
393
  int i;
394
  so_list_ptr->lm = *lm;
395
 
396
  /* OSF/1 shared libraries are pre-linked to particular addresses,
397
     but the runtime loader may have to relocate them if the
398
     address ranges of the libraries used by the target executable clash,
399
     or if the target executable is linked with the -taso option.
400
     The offset is the difference between the address where the shared
401
     library is mapped and the pre-linked address of the shared library.
402
 
403
     FIXME:  GDB is currently unable to relocate the shared library
404
     sections by different offsets. If sections are relocated by
405
     different offsets, put out a warning and use the offset of the
406
     first section for all remaining sections.  */
407
  LM_OFFSET (so_list_ptr) = 0;
408
 
409
  /* There is one entry that has no name (for the inferior executable)
410
     since it is not a shared object. */
411
  if (LM_NAME (so_list_ptr) != 0)
412
    {
413
 
414
#ifdef USE_LDR_ROUTINES
415
      int len = strlen (LM_NAME (so_list_ptr) + 1);
416
 
417
      if (len > MAX_PATH_SIZE)
418
        len = MAX_PATH_SIZE;
419
      strncpy (so_list_ptr->so_name, LM_NAME (so_list_ptr), MAX_PATH_SIZE);
420
      so_list_ptr->so_name[MAX_PATH_SIZE - 1] = '\0';
421
 
422
      for (i = 0; i < lm->module_info.lmi_nregion; i++)
423
        {
424
          ldr_region_info_t region_info;
425
          size_t retsize;
426
          CORE_ADDR region_offset;
427
 
428
          if (ldr_inq_region (fake_ldr_process, lm->module_info.lmi_modid,
429
                              i, &region_info, sizeof (region_info),
430
                              &retsize) != 0)
431
            break;
432
          region_offset = (CORE_ADDR) region_info.lri_mapaddr
433
            - (CORE_ADDR) region_info.lri_vaddr;
434
          if (i == 0)
435
            LM_OFFSET (so_list_ptr) = region_offset;
436
          else if (LM_OFFSET (so_list_ptr) != region_offset)
437
            warning ("cannot handle shared library relocation for %s (%s)",
438
                     so_list_ptr->so_name, region_info.lri_name);
439
        }
440
#else
441
      int errcode;
442
      char *buffer;
443
      target_read_string ((CORE_ADDR) LM_NAME (so_list_ptr), &buffer,
444
                          MAX_PATH_SIZE - 1, &errcode);
445
      if (errcode != 0)
446
        error ("xfer_link_map_member: Can't read pathname for load map: %s\n",
447
               safe_strerror (errcode));
448
      strncpy (so_list_ptr->so_name, buffer, MAX_PATH_SIZE - 1);
449
      xfree (buffer);
450
      so_list_ptr->so_name[MAX_PATH_SIZE - 1] = '\0';
451
 
452
      for (i = 0; i < lm->module_info.region_count; i++)
453
        {
454
          ldr_region_info_t region_info;
455
          CORE_ADDR region_offset;
456
 
457
          if (target_read_memory (lm->module_info.regioninfo_addr
458
                                  + i * sizeof (region_info),
459
                                  (char *) &region_info,
460
                                  sizeof (region_info)) != 0)
461
            break;
462
          region_offset = region_info.mapaddr - region_info.vaddr;
463
          if (i == 0)
464
            LM_OFFSET (so_list_ptr) = region_offset;
465
          else if (LM_OFFSET (so_list_ptr) != region_offset)
466
            {
467
              char *region_name;
468
              target_read_string (region_info.regionname_addr, &buffer,
469
                                  MAX_PATH_SIZE - 1, &errcode);
470
              if (errcode == 0)
471
                region_name = buffer;
472
              else
473
                region_name = "??";
474
              warning ("cannot handle shared library relocation for %s (%s)",
475
                       so_list_ptr->so_name, region_name);
476
              xfree (buffer);
477
            }
478
        }
479
#endif
480
 
481
      catch_errors (solib_map_sections, (char *) so_list_ptr,
482
                    "Error while mapping shared library sections:\n",
483
                    RETURN_MASK_ALL);
484
    }
485
}
486
 
487
/*
488
 
489
   LOCAL FUNCTION
490
 
491
   find_solib -- step through list of shared objects
492
 
493
   SYNOPSIS
494
 
495
   struct so_list *find_solib (struct so_list *so_list_ptr)
496
 
497
   DESCRIPTION
498
 
499
   This module contains the routine which finds the names of any
500
   loaded "images" in the current process. The argument in must be
501
   NULL on the first call, and then the returned value must be passed
502
   in on subsequent calls. This provides the capability to "step" down
503
   the list of loaded objects. On the last object, a NULL value is
504
   returned.
505
 
506
   The arg and return value are "struct link_map" pointers, as defined
507
   in <link.h>.
508
 */
509
 
510
static struct so_list *
511
find_solib (struct so_list *so_list_ptr)
512
{
513
  struct so_list *so_list_next = NULL;
514
  struct link_map *lm = NULL;
515
  struct so_list *new;
516
 
517
  if (so_list_ptr == NULL)
518
    {
519
      /* We are setting up for a new scan through the loaded images. */
520
      if ((so_list_next = so_list_head) == NULL)
521
        {
522
          /* Find the first link map list member. */
523
          lm = first_link_map_member ();
524
        }
525
    }
526
  else
527
    {
528
      /* We have been called before, and are in the process of walking
529
         the shared library list.  Advance to the next shared object. */
530
      lm = next_link_map_member (so_list_ptr);
531
      so_list_next = so_list_ptr->next;
532
    }
533
  if ((so_list_next == NULL) && (lm != NULL))
534
    {
535
      /* Get next link map structure from inferior image and build a local
536
         abbreviated load_map structure */
537
      new = (struct so_list *) xmalloc (sizeof (struct so_list));
538
      memset ((char *) new, 0, sizeof (struct so_list));
539
      new->lmaddr = lm;
540
      /* Add the new node as the next node in the list, or as the root
541
         node if this is the first one. */
542
      if (so_list_ptr != NULL)
543
        {
544
          so_list_ptr->next = new;
545
        }
546
      else
547
        {
548
          so_list_head = new;
549
        }
550
      so_list_next = new;
551
      xfer_link_map_member (new, lm);
552
    }
553
  return (so_list_next);
554
}
555
 
556
/* A small stub to get us past the arg-passing pinhole of catch_errors.  */
557
 
558
static int
559
symbol_add_stub (char *arg)
560
{
561
  register struct so_list *so = (struct so_list *) arg;         /* catch_errs bogon */
562
  CORE_ADDR text_addr = 0;
563
  struct section_addr_info section_addrs;
564
 
565
  memset (&section_addrs, 0, sizeof (section_addrs));
566
  if (so->textsection)
567
    text_addr = so->textsection->addr;
568
  else if (so->abfd != NULL)
569
    {
570
      asection *lowest_sect;
571
 
572
      /* If we didn't find a mapped non zero sized .text section, set up
573
         text_addr so that the relocation in symbol_file_add does no harm.  */
574
 
575
      lowest_sect = bfd_get_section_by_name (so->abfd, ".text");
576
      if (lowest_sect == NULL)
577
        bfd_map_over_sections (so->abfd, find_lowest_section,
578
                               (PTR) &lowest_sect);
579
      if (lowest_sect)
580
        text_addr = bfd_section_vma (so->abfd, lowest_sect) + LM_OFFSET (so);
581
    }
582
 
583
  section_addrs.other[0].addr = text_addr;
584
  section_addrs.other[0].name = ".text";
585
  so->objfile = symbol_file_add (so->so_name, so->from_tty,
586
                                 &section_addrs, 0, OBJF_SHARED);
587
  return (1);
588
}
589
 
590
/*
591
 
592
   GLOBAL FUNCTION
593
 
594
   solib_add -- add a shared library file to the symtab and section list
595
 
596
   SYNOPSIS
597
 
598
   void solib_add (char *arg_string, int from_tty,
599
   struct target_ops *target, int readsyms)
600
 
601
   DESCRIPTION
602
 
603
 */
604
 
605
void
606
solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms)
607
{
608
  register struct so_list *so = NULL;   /* link map state variable */
609
 
610
  /* Last shared library that we read.  */
611
  struct so_list *so_last = NULL;
612
 
613
  char *re_err;
614
  int count;
615
  int old;
616
 
617
  if (!readsyms)
618
    return;
619
 
620
  if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
621
    {
622
      error ("Invalid regexp: %s", re_err);
623
    }
624
 
625
 
626
  /* Add the shared library sections to the section table of the
627
     specified target, if any.  */
628
  if (target)
629
    {
630
      /* Count how many new section_table entries there are.  */
631
      so = NULL;
632
      count = 0;
633
      while ((so = find_solib (so)) != NULL)
634
        {
635
          if (so->so_name[0])
636
            {
637
              count += so->sections_end - so->sections;
638
            }
639
        }
640
 
641
      if (count)
642
        {
643
          /* Add these section table entries to the target's table.  */
644
 
645
          old = target_resize_to_sections (target, count);
646
 
647
          while ((so = find_solib (so)) != NULL)
648
            {
649
              if (so->so_name[0])
650
                {
651
                  count = so->sections_end - so->sections;
652
                  memcpy ((char *) (target->to_sections + old),
653
                          so->sections,
654
                          (sizeof (struct section_table)) * count);
655
                  old += count;
656
                }
657
            }
658
        }
659
    }
660
 
661
  /* Now add the symbol files.  */
662
  so = NULL;
663
  while ((so = find_solib (so)) != NULL)
664
    {
665
      if (so->so_name[0] && re_exec (so->so_name))
666
        {
667
          so->from_tty = from_tty;
668
          if (so->symbols_loaded)
669
            {
670
              if (from_tty)
671
                {
672
                  printf_unfiltered ("Symbols already loaded for %s\n", so->so_name);
673
                }
674
            }
675
          else if (catch_errors
676
                   (symbol_add_stub, (char *) so,
677
                    "Error while reading shared library symbols:\n",
678
                    RETURN_MASK_ALL))
679
            {
680
              so_last = so;
681
              so->symbols_loaded = 1;
682
            }
683
        }
684
    }
685
 
686
  /* Getting new symbols may change our opinion about what is
687
     frameless.  */
688
  if (so_last)
689
    reinit_frame_cache ();
690
}
691
 
692
/*
693
 
694
   LOCAL FUNCTION
695
 
696
   info_sharedlibrary_command -- code for "info sharedlibrary"
697
 
698
   SYNOPSIS
699
 
700
   static void info_sharedlibrary_command ()
701
 
702
   DESCRIPTION
703
 
704
   Walk through the shared library list and print information
705
   about each attached library.
706
 */
707
 
708
static void
709
info_sharedlibrary_command (char *ignore, int from_tty)
710
{
711
  register struct so_list *so = NULL;   /* link map state variable */
712
  int header_done = 0;
713
 
714
  if (exec_bfd == NULL)
715
    {
716
      printf_unfiltered ("No executable file.\n");
717
      return;
718
    }
719
  while ((so = find_solib (so)) != NULL)
720
    {
721
      if (so->so_name[0])
722
        {
723
          unsigned long txt_start = 0;
724
          unsigned long txt_end = 0;
725
 
726
          if (!header_done)
727
            {
728
              printf_unfiltered ("%-20s%-20s%-12s%s\n", "From", "To", "Syms Read",
729
                                 "Shared Object Library");
730
              header_done++;
731
            }
732
          if (so->textsection)
733
            {
734
              txt_start = (unsigned long) so->textsection->addr;
735
              txt_end = (unsigned long) so->textsection->endaddr;
736
            }
737
          printf_unfiltered ("%-20s", local_hex_string_custom (txt_start, "08l"));
738
          printf_unfiltered ("%-20s", local_hex_string_custom (txt_end, "08l"));
739
          printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
740
          printf_unfiltered ("%s\n", so->so_name);
741
        }
742
    }
743
  if (so_list_head == NULL)
744
    {
745
      printf_unfiltered ("No shared libraries loaded at this time.\n");
746
    }
747
}
748
 
749
/*
750
 
751
   GLOBAL FUNCTION
752
 
753
   solib_address -- check to see if an address is in a shared lib
754
 
755
   SYNOPSIS
756
 
757
   char *solib_address (CORE_ADDR address)
758
 
759
   DESCRIPTION
760
 
761
   Provides a hook for other gdb routines to discover whether or
762
   not a particular address is within the mapped address space of
763
   a shared library.  Any address between the base mapping address
764
   and the first address beyond the end of the last mapping, is
765
   considered to be within the shared library address space, for
766
   our purposes.
767
 
768
   For example, this routine is called at one point to disable
769
   breakpoints which are in shared libraries that are not currently
770
   mapped in.
771
 */
772
 
773
char *
774
solib_address (CORE_ADDR address)
775
{
776
  register struct so_list *so = 0;       /* link map state variable */
777
 
778
  while ((so = find_solib (so)) != NULL)
779
    {
780
      if (so->so_name[0] && so->textsection)
781
        {
782
          if ((address >= (CORE_ADDR) so->textsection->addr) &&
783
              (address < (CORE_ADDR) so->textsection->endaddr))
784
            return (so->so_name);
785
        }
786
    }
787
  return (0);
788
}
789
 
790
/* Called by free_all_symtabs */
791
 
792
void
793
clear_solib (void)
794
{
795
  struct so_list *next;
796
  char *bfd_filename;
797
 
798
  disable_breakpoints_in_shlibs (1);
799
 
800
  while (so_list_head)
801
    {
802
      if (so_list_head->sections)
803
        {
804
          xfree (so_list_head->sections);
805
        }
806
      if (so_list_head->abfd)
807
        {
808
          remove_target_sections (so_list_head->abfd);
809
          bfd_filename = bfd_get_filename (so_list_head->abfd);
810
          if (!bfd_close (so_list_head->abfd))
811
            warning ("cannot close \"%s\": %s",
812
                     bfd_filename, bfd_errmsg (bfd_get_error ()));
813
        }
814
      else
815
        /* This happens for the executable on SVR4.  */
816
        bfd_filename = NULL;
817
 
818
      next = so_list_head->next;
819
      if (bfd_filename)
820
        xfree (bfd_filename);
821
      xfree (so_list_head);
822
      so_list_head = next;
823
    }
824
}
825
 
826
/*
827
 
828
   GLOBAL FUNCTION
829
 
830
   solib_create_inferior_hook -- shared library startup support
831
 
832
   SYNOPSIS
833
 
834
   void solib_create_inferior_hook()
835
 
836
   DESCRIPTION
837
 
838
   When gdb starts up the inferior, it nurses it along (through the
839
   shell) until it is ready to execute it's first instruction.  At this
840
   point, this function gets called via expansion of the macro
841
   SOLIB_CREATE_INFERIOR_HOOK.
842
   For a statically bound executable, this first instruction is the
843
   one at "_start", or a similar text label. No further processing is
844
   needed in that case.
845
   For a dynamically bound executable, this first instruction is somewhere
846
   in the rld, and the actual user executable is not yet mapped in.
847
   We continue the inferior again, rld then maps in the actual user
848
   executable and any needed shared libraries and then sends
849
   itself a SIGTRAP.
850
   At that point we discover the names of all shared libraries and
851
   read their symbols in.
852
 
853
   FIXME
854
 
855
   This code does not properly handle hitting breakpoints which the
856
   user might have set in the rld itself.  Proper handling would have
857
   to check if the SIGTRAP happened due to a kill call.
858
 
859
   Also, what if child has exit()ed?  Must exit loop somehow.
860
 */
861
 
862
void
863
solib_create_inferior_hook (void)
864
{
865
 
866
  /* Nothing to do for statically bound executables.  */
867
 
868
  if (symfile_objfile == NULL
869
      || symfile_objfile->obfd == NULL
870
      || ((bfd_get_file_flags (symfile_objfile->obfd) & DYNAMIC) == 0))
871
    return;
872
 
873
  /* Now run the target.  It will eventually get a SIGTRAP, at
874
     which point all of the libraries will have been mapped in and we
875
     can go groveling around in the rld structures to find
876
     out what we need to know about them. */
877
 
878
  clear_proceed_status ();
879
  stop_soon_quietly = 1;
880
  stop_signal = TARGET_SIGNAL_0;
881
  do
882
    {
883
      target_resume (minus_one_ptid, 0, stop_signal);
884
      wait_for_inferior ();
885
    }
886
  while (stop_signal != TARGET_SIGNAL_TRAP);
887
 
888
  /*  solib_add will call reinit_frame_cache.
889
     But we are stopped in the runtime loader and we do not have symbols
890
     for the runtime loader. So heuristic_proc_start will be called
891
     and will put out an annoying warning.
892
     Delaying the resetting of stop_soon_quietly until after symbol loading
893
     suppresses the warning.  */
894
  solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
895
  stop_soon_quietly = 0;
896
}
897
 
898
 
899
/*
900
 
901
   LOCAL FUNCTION
902
 
903
   sharedlibrary_command -- handle command to explicitly add library
904
 
905
   SYNOPSIS
906
 
907
   static void sharedlibrary_command (char *args, int from_tty)
908
 
909
   DESCRIPTION
910
 
911
 */
912
 
913
static void
914
sharedlibrary_command (char *args, int from_tty)
915
{
916
  dont_repeat ();
917
  solib_add (args, from_tty, (struct target_ops *) 0, 1);
918
}
919
 
920
void
921
_initialize_solib (void)
922
{
923
  add_com ("sharedlibrary", class_files, sharedlibrary_command,
924
           "Load shared object library symbols for files matching REGEXP.");
925
  add_info ("sharedlibrary", info_sharedlibrary_command,
926
            "Status of loaded shared object libraries.");
927
 
928
  add_show_from_set
929
    (add_set_cmd ("auto-solib-add", class_support, var_boolean,
930
                  (char *) &auto_solib_add,
931
                  "Set autoloading of shared library symbols.\n\
932
If \"on\", symbols from all shared object libraries will be loaded\n\
933
automatically when the inferior begins execution, when the dynamic linker\n\
934
informs gdb that a new library has been loaded, or when attaching to the\n\
935
inferior.  Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
936
                  &setlist),
937
     &showlist);
938
}

powered by: WebSVN 2.1.0

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