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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [solib.c] - Blame information for rev 227

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

Line No. Rev Author Line
1 227 jeremybenn
/* Handle shared libraries for GDB, the GNU Debugger.
2
 
3
   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4
   2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010
5
   Free Software Foundation, Inc.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
 
22
#include "defs.h"
23
 
24
#include <sys/types.h>
25
#include <fcntl.h>
26
#include "gdb_string.h"
27
#include "symtab.h"
28
#include "bfd.h"
29
#include "symfile.h"
30
#include "objfiles.h"
31
#include "exceptions.h"
32
#include "gdbcore.h"
33
#include "command.h"
34
#include "target.h"
35
#include "frame.h"
36
#include "gdb_regex.h"
37
#include "inferior.h"
38
#include "environ.h"
39
#include "language.h"
40
#include "gdbcmd.h"
41
#include "completer.h"
42
#include "filenames.h"          /* for DOSish file names */
43
#include "exec.h"
44
#include "solist.h"
45
#include "observer.h"
46
#include "readline/readline.h"
47
#include "remote.h"
48
#include "solib.h"
49
#include "interps.h"
50
 
51
/* Architecture-specific operations.  */
52
 
53
/* Per-architecture data key.  */
54
static struct gdbarch_data *solib_data;
55
 
56
static void *
57
solib_init (struct obstack *obstack)
58
{
59
  struct target_so_ops **ops;
60
 
61
  ops = OBSTACK_ZALLOC (obstack, struct target_so_ops *);
62
  *ops = current_target_so_ops;
63
  return ops;
64
}
65
 
66
static struct target_so_ops *
67
solib_ops (struct gdbarch *gdbarch)
68
{
69
  struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
70
  return *ops;
71
}
72
 
73
/* Set the solib operations for GDBARCH to NEW_OPS.  */
74
 
75
void
76
set_solib_ops (struct gdbarch *gdbarch, struct target_so_ops *new_ops)
77
{
78
  struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
79
  *ops = new_ops;
80
}
81
 
82
 
83
/* external data declarations */
84
 
85
/* FIXME: gdbarch needs to control this variable, or else every
86
   configuration needs to call set_solib_ops.  */
87
struct target_so_ops *current_target_so_ops;
88
 
89
/* List of known shared objects */
90
#define so_list_head current_program_space->so_list
91
 
92
/* Local function prototypes */
93
 
94
/* If non-empty, this is a search path for loading non-absolute shared library
95
   symbol files.  This takes precedence over the environment variables PATH
96
   and LD_LIBRARY_PATH.  */
97
static char *solib_search_path = NULL;
98
static void
99
show_solib_search_path (struct ui_file *file, int from_tty,
100
                        struct cmd_list_element *c, const char *value)
101
{
102
  fprintf_filtered (file, _("\
103
The search path for loading non-absolute shared library symbol files is %s.\n"),
104
                    value);
105
}
106
 
107
/*
108
 
109
   GLOBAL FUNCTION
110
 
111
   solib_find -- Find a shared library file.
112
 
113
   SYNOPSIS
114
 
115
   char *solib_find (char *in_pathname, int *fd);
116
 
117
   DESCRIPTION
118
 
119
   Global variable GDB_SYSROOT is used as a prefix directory
120
   to search for shared libraries if they have an absolute path.
121
 
122
   Global variable SOLIB_SEARCH_PATH is used as a prefix directory
123
   (or set of directories, as in LD_LIBRARY_PATH) to search for all
124
   shared libraries if not found in GDB_SYSROOT.
125
 
126
   Search algorithm:
127
   * If there is a gdb_sysroot and path is absolute:
128
   *   Search for gdb_sysroot/path.
129
   * else
130
   *   Look for it literally (unmodified).
131
   * Look in SOLIB_SEARCH_PATH.
132
   * If available, use target defined search function.
133
   * If gdb_sysroot is NOT set, perform the following two searches:
134
   *   Look in inferior's $PATH.
135
   *   Look in inferior's $LD_LIBRARY_PATH.
136
   *
137
   * The last check avoids doing this search when targetting remote
138
   * machines since gdb_sysroot will almost always be set.
139
 
140
   RETURNS
141
 
142
   Full pathname of the shared library file, or NULL if not found.
143
   (The pathname is malloc'ed; it needs to be freed by the caller.)
144
   *FD is set to either -1 or an open file handle for the library.  */
145
 
146
char *
147
solib_find (char *in_pathname, int *fd)
148
{
149
  struct target_so_ops *ops = solib_ops (target_gdbarch);
150
  int found_file = -1;
151
  char *temp_pathname = NULL;
152
  int gdb_sysroot_is_empty;
153
 
154
  gdb_sysroot_is_empty = (gdb_sysroot == NULL || *gdb_sysroot == 0);
155
 
156
  if (! IS_ABSOLUTE_PATH (in_pathname) || gdb_sysroot_is_empty)
157
    temp_pathname = in_pathname;
158
  else
159
    {
160
      int prefix_len = strlen (gdb_sysroot);
161
 
162
      /* Remove trailing slashes from absolute prefix.  */
163
      while (prefix_len > 0
164
             && IS_DIR_SEPARATOR (gdb_sysroot[prefix_len - 1]))
165
        prefix_len--;
166
 
167
      /* Cat the prefixed pathname together.  */
168
      temp_pathname = alloca (prefix_len + strlen (in_pathname) + 1);
169
      strncpy (temp_pathname, gdb_sysroot, prefix_len);
170
      temp_pathname[prefix_len] = '\0';
171
      strcat (temp_pathname, in_pathname);
172
    }
173
 
174
  /* Handle remote files.  */
175
  if (remote_filename_p (temp_pathname))
176
    {
177
      *fd = -1;
178
      return xstrdup (temp_pathname);
179
    }
180
 
181
  /* Now see if we can open it.  */
182
  found_file = open (temp_pathname, O_RDONLY | O_BINARY, 0);
183
 
184
  /* We try to find the library in various ways.  After each attempt
185
     (except for the one above), either found_file >= 0 and
186
     temp_pathname is a malloc'd string, or found_file < 0 and
187
     temp_pathname does not point to storage that needs to be
188
     freed.  */
189
 
190
    if (found_file < 0)
191
      temp_pathname = NULL;
192
    else
193
      temp_pathname = xstrdup (temp_pathname);
194
 
195
  /* If the search in gdb_sysroot failed, and the path name is
196
     absolute at this point, make it relative.  (openp will try and open the
197
     file according to its absolute path otherwise, which is not what we want.)
198
     Affects subsequent searches for this solib.  */
199
  if (found_file < 0 && IS_ABSOLUTE_PATH (in_pathname))
200
    {
201
      /* First, get rid of any drive letters etc.  */
202
      while (!IS_DIR_SEPARATOR (*in_pathname))
203
        in_pathname++;
204
 
205
      /* Next, get rid of all leading dir separators.  */
206
      while (IS_DIR_SEPARATOR (*in_pathname))
207
        in_pathname++;
208
    }
209
 
210
  /* If not found, search the solib_search_path (if any).  */
211
  if (found_file < 0 && solib_search_path != NULL)
212
    found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST,
213
                        in_pathname, O_RDONLY | O_BINARY, &temp_pathname);
214
 
215
  /* If not found, next search the solib_search_path (if any) for the basename
216
     only (ignoring the path).  This is to allow reading solibs from a path
217
     that differs from the opened path.  */
218
  if (found_file < 0 && solib_search_path != NULL)
219
    found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST,
220
                        lbasename (in_pathname), O_RDONLY | O_BINARY,
221
                        &temp_pathname);
222
 
223
  /* If not found, try to use target supplied solib search method */
224
  if (found_file < 0 && ops->find_and_open_solib)
225
    found_file = ops->find_and_open_solib (in_pathname, O_RDONLY | O_BINARY,
226
                                           &temp_pathname);
227
 
228
  /* If not found, next search the inferior's $PATH environment variable. */
229
  if (found_file < 0 && gdb_sysroot_is_empty)
230
    found_file = openp (get_in_environ (current_inferior ()->environment,
231
                                        "PATH"),
232
                        OPF_TRY_CWD_FIRST, in_pathname, O_RDONLY | O_BINARY,
233
                        &temp_pathname);
234
 
235
  /* If not found, next search the inferior's $LD_LIBRARY_PATH
236
     environment variable. */
237
  if (found_file < 0 && gdb_sysroot_is_empty)
238
    found_file = openp (get_in_environ (current_inferior ()->environment,
239
                                        "LD_LIBRARY_PATH"),
240
                        OPF_TRY_CWD_FIRST, in_pathname, O_RDONLY | O_BINARY,
241
                        &temp_pathname);
242
 
243
  *fd = found_file;
244
  return temp_pathname;
245
}
246
 
247
/* Open and return a BFD for the shared library PATHNAME.  If FD is not -1,
248
   it is used as file handle to open the file.  Throws an error if the file
249
   could not be opened.  Handles both local and remote file access.
250
 
251
   PATHNAME must be malloc'ed by the caller.  If successful, the new BFD's
252
   name will point to it.  If unsuccessful, PATHNAME will be freed and the
253
   FD will be closed (unless FD was -1).  */
254
 
255
bfd *
256
solib_bfd_fopen (char *pathname, int fd)
257
{
258
  bfd *abfd;
259
 
260
  if (remote_filename_p (pathname))
261
    {
262
      gdb_assert (fd == -1);
263
      abfd = remote_bfd_open (pathname, gnutarget);
264
    }
265
  else
266
    {
267
      abfd = bfd_fopen (pathname, gnutarget, FOPEN_RB, fd);
268
 
269
      if (abfd)
270
        bfd_set_cacheable (abfd, 1);
271
      else if (fd != -1)
272
        close (fd);
273
    }
274
 
275
  if (!abfd)
276
    {
277
      make_cleanup (xfree, pathname);
278
      error (_("Could not open `%s' as an executable file: %s"),
279
             pathname, bfd_errmsg (bfd_get_error ()));
280
    }
281
 
282
  return abfd;
283
}
284
 
285
/* Find shared library PATHNAME and open a BFD for it.  */
286
 
287
bfd *
288
solib_bfd_open (char *pathname)
289
{
290
  char *found_pathname;
291
  int found_file;
292
  bfd *abfd;
293
  const struct bfd_arch_info *b;
294
 
295
  /* Search for shared library file.  */
296
  found_pathname = solib_find (pathname, &found_file);
297
  if (found_pathname == NULL)
298
    perror_with_name (pathname);
299
 
300
  /* Open bfd for shared library.  */
301
  abfd = solib_bfd_fopen (found_pathname, found_file);
302
 
303
  /* Check bfd format.  */
304
  if (!bfd_check_format (abfd, bfd_object))
305
    {
306
      bfd_close (abfd);
307
      make_cleanup (xfree, found_pathname);
308
      error (_("`%s': not in executable format: %s"),
309
             found_pathname, bfd_errmsg (bfd_get_error ()));
310
    }
311
 
312
  /* Check bfd arch.  */
313
  b = gdbarch_bfd_arch_info (target_gdbarch);
314
  if (!b->compatible (b, bfd_get_arch_info (abfd)))
315
    warning (_("`%s': Shared library architecture %s is not compatible "
316
               "with target architecture %s."), found_pathname,
317
             bfd_get_arch_info (abfd)->printable_name, b->printable_name);
318
 
319
  return abfd;
320
}
321
 
322
 
323
/*
324
 
325
   LOCAL FUNCTION
326
 
327
   solib_map_sections -- open bfd and build sections for shared lib
328
 
329
   SYNOPSIS
330
 
331
   static int solib_map_sections (struct so_list *so)
332
 
333
   DESCRIPTION
334
 
335
   Given a pointer to one of the shared objects in our list
336
   of mapped objects, use the recorded name to open a bfd
337
   descriptor for the object, build a section table, and then
338
   relocate all the section addresses by the base address at
339
   which the shared object was mapped.
340
 
341
   FIXMES
342
 
343
   In most (all?) cases the shared object file name recorded in the
344
   dynamic linkage tables will be a fully qualified pathname.  For
345
   cases where it isn't, do we really mimic the systems search
346
   mechanism correctly in the below code (particularly the tilde
347
   expansion stuff?).
348
 */
349
 
350
static int
351
solib_map_sections (void *arg)
352
{
353
  struct so_list *so = (struct so_list *) arg;  /* catch_errors bogon */
354
  struct target_so_ops *ops = solib_ops (target_gdbarch);
355
  char *filename;
356
  struct target_section *p;
357
  struct cleanup *old_chain;
358
  bfd *abfd;
359
 
360
  filename = tilde_expand (so->so_name);
361
  old_chain = make_cleanup (xfree, filename);
362
  abfd = ops->bfd_open (filename);
363
  do_cleanups (old_chain);
364
 
365
  /* Leave bfd open, core_xfer_memory and "info files" need it.  */
366
  so->abfd = gdb_bfd_ref (abfd);
367
 
368
  /* copy full path name into so_name, so that later symbol_file_add
369
     can find it */
370
  if (strlen (bfd_get_filename (abfd)) >= SO_NAME_MAX_PATH_SIZE)
371
    error (_("Shared library file name is too long."));
372
  strcpy (so->so_name, bfd_get_filename (abfd));
373
 
374
  if (build_section_table (abfd, &so->sections, &so->sections_end))
375
    {
376
      error (_("Can't find the file sections in `%s': %s"),
377
             bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
378
    }
379
 
380
  for (p = so->sections; p < so->sections_end; p++)
381
    {
382
      /* Relocate the section binding addresses as recorded in the shared
383
         object's file by the base address to which the object was actually
384
         mapped. */
385
      ops->relocate_section_addresses (so, p);
386
 
387
      /* If the target didn't provide information about the address
388
         range of the shared object, assume we want the location of
389
         the .text section.  */
390
      if (so->addr_low == 0 && so->addr_high == 0
391
          && strcmp (p->the_bfd_section->name, ".text") == 0)
392
        {
393
          so->addr_low = p->addr;
394
          so->addr_high = p->endaddr;
395
        }
396
    }
397
 
398
  return (1);
399
}
400
 
401
/* LOCAL FUNCTION
402
 
403
   free_so --- free a `struct so_list' object
404
 
405
   SYNOPSIS
406
 
407
   void free_so (struct so_list *so)
408
 
409
   DESCRIPTION
410
 
411
   Free the storage associated with the `struct so_list' object SO.
412
   If we have opened a BFD for SO, close it.
413
 
414
   The caller is responsible for removing SO from whatever list it is
415
   a member of.  If we have placed SO's sections in some target's
416
   section table, the caller is responsible for removing them.
417
 
418
   This function doesn't mess with objfiles at all.  If there is an
419
   objfile associated with SO that needs to be removed, the caller is
420
   responsible for taking care of that.  */
421
 
422
void
423
free_so (struct so_list *so)
424
{
425
  struct target_so_ops *ops = solib_ops (target_gdbarch);
426
 
427
  if (so->sections)
428
    xfree (so->sections);
429
 
430
  gdb_bfd_unref (so->abfd);
431
 
432
  ops->free_so (so);
433
 
434
  xfree (so);
435
}
436
 
437
 
438
/* Return address of first so_list entry in master shared object list.  */
439
struct so_list *
440
master_so_list (void)
441
{
442
  return so_list_head;
443
}
444
 
445
static void
446
symbol_add_stub (struct so_list *so, int flags)
447
{
448
  struct section_addr_info *sap;
449
 
450
  /* Have we already loaded this shared object?  */
451
  ALL_OBJFILES (so->objfile)
452
    {
453
      if (strcmp (so->objfile->name, so->so_name) == 0)
454
        return;
455
    }
456
 
457
  sap = build_section_addr_info_from_section_table (so->sections,
458
                                                    so->sections_end);
459
 
460
  so->objfile = symbol_file_add_from_bfd (so->abfd, flags, sap, OBJF_SHARED);
461
  free_section_addr_info (sap);
462
 
463
  return;
464
}
465
 
466
/* Read in symbols for shared object SO.  If SYMFILE_VERBOSE is set in FLAGS,
467
   be chatty about it.  Return non-zero if any symbols were actually
468
   loaded.  */
469
 
470
int
471
solib_read_symbols (struct so_list *so, int flags)
472
{
473
  const int from_tty = flags & SYMFILE_VERBOSE;
474
 
475
  if (so->symbols_loaded)
476
    {
477
      if (from_tty || info_verbose)
478
        printf_unfiltered (_("Symbols already loaded for %s\n"), so->so_name);
479
    }
480
  else if (so->abfd == NULL)
481
    {
482
      if (from_tty || info_verbose)
483
        printf_unfiltered (_("Symbol file not found for %s\n"), so->so_name);
484
    }
485
  else
486
    {
487
      volatile struct gdb_exception exception;
488
      TRY_CATCH (exception, RETURN_MASK_ALL)
489
        {
490
          symbol_add_stub (so, flags);
491
        }
492
      if (exception.reason != 0)
493
        {
494
          exception_fprintf (gdb_stderr, exception,
495
                             "Error while reading shared library symbols:\n");
496
          return 0;
497
        }
498
      if (from_tty || info_verbose)
499
        printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
500
      so->symbols_loaded = 1;
501
      return 1;
502
    }
503
 
504
  return 0;
505
}
506
 
507
/* LOCAL FUNCTION
508
 
509
   update_solib_list --- synchronize GDB's shared object list with inferior's
510
 
511
   SYNOPSIS
512
 
513
   void update_solib_list (int from_tty, struct target_ops *TARGET)
514
 
515
   Extract the list of currently loaded shared objects from the
516
   inferior, and compare it with the list of shared objects currently
517
   in GDB's so_list_head list.  Edit so_list_head to bring it in sync
518
   with the inferior's new list.
519
 
520
   If we notice that the inferior has unloaded some shared objects,
521
   free any symbolic info GDB had read about those shared objects.
522
 
523
   Don't load symbolic info for any new shared objects; just add them
524
   to the list, and leave their symbols_loaded flag clear.
525
 
526
   If FROM_TTY is non-null, feel free to print messages about what
527
   we're doing.
528
 
529
   If TARGET is non-null, add the sections of all new shared objects
530
   to TARGET's section table.  Note that this doesn't remove any
531
   sections for shared objects that have been unloaded, and it
532
   doesn't check to see if the new shared objects are already present in
533
   the section table.  But we only use this for core files and
534
   processes we've just attached to, so that's okay.  */
535
 
536
static void
537
update_solib_list (int from_tty, struct target_ops *target)
538
{
539
  struct target_so_ops *ops = solib_ops (target_gdbarch);
540
  struct so_list *inferior = ops->current_sos();
541
  struct so_list *gdb, **gdb_link;
542
 
543
  /* We can reach here due to changing solib-search-path or the
544
     sysroot, before having any inferior.  */
545
  if (target_has_execution && !ptid_equal (inferior_ptid, null_ptid))
546
    {
547
      struct inferior *inf = current_inferior ();
548
 
549
      /* If we are attaching to a running process for which we
550
         have not opened a symbol file, we may be able to get its
551
         symbols now!  */
552
      if (inf->attach_flag && symfile_objfile == NULL)
553
        catch_errors (ops->open_symbol_file_object, &from_tty,
554
                      "Error reading attached process's symbol file.\n",
555
                      RETURN_MASK_ALL);
556
    }
557
 
558
  /* GDB and the inferior's dynamic linker each maintain their own
559
     list of currently loaded shared objects; we want to bring the
560
     former in sync with the latter.  Scan both lists, seeing which
561
     shared objects appear where.  There are three cases:
562
 
563
     - A shared object appears on both lists.  This means that GDB
564
     knows about it already, and it's still loaded in the inferior.
565
     Nothing needs to happen.
566
 
567
     - A shared object appears only on GDB's list.  This means that
568
     the inferior has unloaded it.  We should remove the shared
569
     object from GDB's tables.
570
 
571
     - A shared object appears only on the inferior's list.  This
572
     means that it's just been loaded.  We should add it to GDB's
573
     tables.
574
 
575
     So we walk GDB's list, checking each entry to see if it appears
576
     in the inferior's list too.  If it does, no action is needed, and
577
     we remove it from the inferior's list.  If it doesn't, the
578
     inferior has unloaded it, and we remove it from GDB's list.  By
579
     the time we're done walking GDB's list, the inferior's list
580
     contains only the new shared objects, which we then add.  */
581
 
582
  gdb = so_list_head;
583
  gdb_link = &so_list_head;
584
  while (gdb)
585
    {
586
      struct so_list *i = inferior;
587
      struct so_list **i_link = &inferior;
588
 
589
      /* Check to see whether the shared object *gdb also appears in
590
         the inferior's current list.  */
591
      while (i)
592
        {
593
          if (ops->same)
594
            {
595
              if (ops->same (gdb, i))
596
                break;
597
            }
598
          else
599
            {
600
              if (! strcmp (gdb->so_original_name, i->so_original_name))
601
                break;
602
            }
603
 
604
          i_link = &i->next;
605
          i = *i_link;
606
        }
607
 
608
      /* If the shared object appears on the inferior's list too, then
609
         it's still loaded, so we don't need to do anything.  Delete
610
         it from the inferior's list, and leave it on GDB's list.  */
611
      if (i)
612
        {
613
          *i_link = i->next;
614
          free_so (i);
615
          gdb_link = &gdb->next;
616
          gdb = *gdb_link;
617
        }
618
 
619
      /* If it's not on the inferior's list, remove it from GDB's tables.  */
620
      else
621
        {
622
          /* Notify any observer that the shared object has been
623
             unloaded before we remove it from GDB's tables.  */
624
          observer_notify_solib_unloaded (gdb);
625
 
626
          *gdb_link = gdb->next;
627
 
628
          /* Unless the user loaded it explicitly, free SO's objfile.  */
629
          if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED))
630
            free_objfile (gdb->objfile);
631
 
632
          /* Some targets' section tables might be referring to
633
             sections from so->abfd; remove them.  */
634
          remove_target_sections (gdb->abfd);
635
 
636
          free_so (gdb);
637
          gdb = *gdb_link;
638
        }
639
    }
640
 
641
  /* Now the inferior's list contains only shared objects that don't
642
     appear in GDB's list --- those that are newly loaded.  Add them
643
     to GDB's shared object list.  */
644
  if (inferior)
645
    {
646
      struct so_list *i;
647
 
648
      /* Add the new shared objects to GDB's list.  */
649
      *gdb_link = inferior;
650
 
651
      /* Fill in the rest of each of the `struct so_list' nodes.  */
652
      for (i = inferior; i; i = i->next)
653
        {
654
          i->from_tty = from_tty;
655
          i->pspace = current_program_space;
656
 
657
          /* Fill in the rest of the `struct so_list' node.  */
658
          catch_errors (solib_map_sections, i,
659
                        "Error while mapping shared library sections:\n",
660
                        RETURN_MASK_ALL);
661
 
662
          /* Add the shared object's sections to the current set of
663
             file section tables.  Do this immediately after mapping
664
             the object so that later nodes in the list can query this
665
             object, as is needed in solib-osf.c.  */
666
          add_target_sections (i->sections, i->sections_end);
667
 
668
          /* Notify any observer that the shared object has been
669
             loaded now that we've added it to GDB's tables.  */
670
          observer_notify_solib_loaded (i);
671
        }
672
    }
673
}
674
 
675
 
676
/* Return non-zero if NAME is the libpthread shared library.
677
 
678
   Uses a fairly simplistic heuristic approach where we check
679
   the file name against "/libpthread".  This can lead to false
680
   positives, but this should be good enough in practice.  */
681
 
682
int
683
libpthread_name_p (const char *name)
684
{
685
  return (strstr (name, "/libpthread") != NULL);
686
}
687
 
688
/* Return non-zero if SO is the libpthread shared library.  */
689
 
690
static int
691
libpthread_solib_p (struct so_list *so)
692
{
693
  return libpthread_name_p (so->so_name);
694
}
695
 
696
/* GLOBAL FUNCTION
697
 
698
   solib_add -- read in symbol info for newly added shared libraries
699
 
700
   SYNOPSIS
701
 
702
   void solib_add (char *pattern, int from_tty, struct target_ops
703
   *TARGET, int readsyms)
704
 
705
   DESCRIPTION
706
 
707
   Read in symbolic information for any shared objects whose names
708
   match PATTERN.  (If we've already read a shared object's symbol
709
   info, leave it alone.)  If PATTERN is zero, read them all.
710
 
711
   If READSYMS is 0, defer reading symbolic information until later
712
   but still do any needed low level processing.
713
 
714
   FROM_TTY and TARGET are as described for update_solib_list, above.  */
715
 
716
void
717
solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
718
{
719
  struct so_list *gdb;
720
 
721
  if (pattern)
722
    {
723
      char *re_err = re_comp (pattern);
724
 
725
      if (re_err)
726
        error (_("Invalid regexp: %s"), re_err);
727
    }
728
 
729
  update_solib_list (from_tty, target);
730
 
731
  /* Walk the list of currently loaded shared libraries, and read
732
     symbols for any that match the pattern --- or any whose symbols
733
     aren't already loaded, if no pattern was given.  */
734
  {
735
    int any_matches = 0;
736
    int loaded_any_symbols = 0;
737
    const int flags =
738
        SYMFILE_DEFER_BP_RESET | (from_tty ? SYMFILE_VERBOSE : 0);
739
 
740
    for (gdb = so_list_head; gdb; gdb = gdb->next)
741
      if (! pattern || re_exec (gdb->so_name))
742
        {
743
          /* Normally, we would read the symbols from that library
744
             only if READSYMS is set.  However, we're making a small
745
             exception for the pthread library, because we sometimes
746
             need the library symbols to be loaded in order to provide
747
             thread support (x86-linux for instance).  */
748
          const int add_this_solib =
749
            (readsyms || libpthread_solib_p (gdb));
750
 
751
          any_matches = 1;
752
          if (add_this_solib && solib_read_symbols (gdb, flags))
753
            loaded_any_symbols = 1;
754
        }
755
 
756
    if (loaded_any_symbols)
757
      breakpoint_re_set ();
758
 
759
    if (from_tty && pattern && ! any_matches)
760
      printf_unfiltered
761
        ("No loaded shared libraries match the pattern `%s'.\n", pattern);
762
 
763
    if (loaded_any_symbols)
764
      {
765
        struct target_so_ops *ops = solib_ops (target_gdbarch);
766
 
767
        /* Getting new symbols may change our opinion about what is
768
           frameless.  */
769
        reinit_frame_cache ();
770
 
771
        ops->special_symbol_handling ();
772
      }
773
  }
774
}
775
 
776
 
777
/*
778
 
779
   LOCAL FUNCTION
780
 
781
   info_sharedlibrary_command -- code for "info sharedlibrary"
782
 
783
   SYNOPSIS
784
 
785
   static void info_sharedlibrary_command ()
786
 
787
   DESCRIPTION
788
 
789
   Walk through the shared library list and print information
790
   about each attached library matching PATTERN.  If PATTERN is elided,
791
   print them all.
792
 */
793
 
794
static void
795
info_sharedlibrary_command (char *pattern, int from_tty)
796
{
797
  struct so_list *so = NULL;    /* link map state variable */
798
  int header_done = 0;
799
  int so_missing_debug_info = 0;
800
  int addr_width;
801
  int nr_libs;
802
  struct cleanup *table_cleanup;
803
  struct gdbarch *gdbarch = target_gdbarch;
804
 
805
  if (pattern)
806
    {
807
      char *re_err = re_comp (pattern);
808
 
809
      if (re_err)
810
        error (_("Invalid regexp: %s"), re_err);
811
    }
812
 
813
  /* "0x", a little whitespace, and two hex digits per byte of pointers.  */
814
  addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
815
 
816
  update_solib_list (from_tty, 0);
817
 
818
  /* make_cleanup_ui_out_table_begin_end needs to know the number of
819
     rows, so we need to make two passes over the libs.  */
820
 
821
  for (nr_libs = 0, so = so_list_head; so; so = so->next)
822
    {
823
      if (so->so_name[0])
824
        {
825
          if (pattern && ! re_exec (so->so_name))
826
            continue;
827
          ++nr_libs;
828
        }
829
    }
830
 
831
  table_cleanup =
832
    make_cleanup_ui_out_table_begin_end (uiout, 4, nr_libs,
833
                                         "SharedLibraryTable");
834
 
835
  /* The "- 1" is because ui_out adds one space between columns.  */
836
  ui_out_table_header (uiout, addr_width - 1, ui_left, "from", "From");
837
  ui_out_table_header (uiout, addr_width - 1, ui_left, "to", "To");
838
  ui_out_table_header (uiout, 12 - 1, ui_left, "syms-read", "Syms Read");
839
  ui_out_table_header (uiout, 0, ui_noalign,
840
                       "name", "Shared Object Library");
841
 
842
  ui_out_table_body (uiout);
843
 
844
  for (so = so_list_head; so; so = so->next)
845
    {
846
      struct cleanup *lib_cleanup;
847
 
848
      if (! so->so_name[0])
849
        continue;
850
      if (pattern && ! re_exec (so->so_name))
851
        continue;
852
 
853
      lib_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "lib");
854
 
855
      if (so->addr_high != 0)
856
        {
857
          ui_out_field_core_addr (uiout, "from", gdbarch, so->addr_low);
858
          ui_out_field_core_addr (uiout, "to", gdbarch, so->addr_high);
859
        }
860
      else
861
        {
862
          ui_out_field_skip (uiout, "from");
863
          ui_out_field_skip (uiout, "to");
864
        }
865
 
866
      if (! ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
867
          && so->symbols_loaded
868
          && !objfile_has_symbols (so->objfile))
869
        {
870
          so_missing_debug_info = 1;
871
          ui_out_field_string (uiout, "syms-read", "Yes (*)");
872
        }
873
      else
874
        ui_out_field_string (uiout, "syms-read",
875
                             so->symbols_loaded ? "Yes" : "No");
876
 
877
      ui_out_field_string (uiout, "name", so->so_name);
878
 
879
      ui_out_text (uiout, "\n");
880
 
881
      do_cleanups (lib_cleanup);
882
    }
883
 
884
  do_cleanups (table_cleanup);
885
 
886
  if (nr_libs == 0)
887
    {
888
      if (pattern)
889
        ui_out_message (uiout, 0,
890
                        _("No shared libraries matched.\n"));
891
      else
892
        ui_out_message (uiout, 0,
893
                        _("No shared libraries loaded at this time.\n"));
894
    }
895
  else
896
    {
897
      if (so_missing_debug_info)
898
        ui_out_message (uiout, 0,
899
                        _("(*): Shared library is missing debugging information.\n"));
900
    }
901
}
902
 
903
/* Return 1 if ADDRESS lies within SOLIB.  */
904
 
905
int
906
solib_contains_address_p (const struct so_list *const solib,
907
                          CORE_ADDR address)
908
{
909
  struct target_section *p;
910
 
911
  for (p = solib->sections; p < solib->sections_end; p++)
912
    if (p->addr <= address && address < p->endaddr)
913
      return 1;
914
 
915
  return 0;
916
}
917
 
918
/*
919
 
920
   GLOBAL FUNCTION
921
 
922
   solib_name_from_address -- if an address is in a shared lib, return
923
   its name.
924
 
925
   SYNOPSIS
926
 
927
   char * solib_name_from_address (CORE_ADDR address)
928
 
929
   DESCRIPTION
930
 
931
   Provides a hook for other gdb routines to discover whether or
932
   not a particular address is within the mapped address space of
933
   a shared library.
934
 
935
   For example, this routine is called at one point to disable
936
   breakpoints which are in shared libraries that are not currently
937
   mapped in.
938
 */
939
 
940
char *
941
solib_name_from_address (struct program_space *pspace, CORE_ADDR address)
942
{
943
  struct so_list *so = NULL;
944
 
945
  for (so = pspace->so_list; so; so = so->next)
946
    if (solib_contains_address_p (so, address))
947
      return (so->so_name);
948
 
949
  return (0);
950
}
951
 
952
/* Return whether the data starting at VADDR, size SIZE, must be kept
953
   in a core file for shared libraries loaded before "gcore" is used
954
   to be handled correctly when the core file is loaded.  This only
955
   applies when the section would otherwise not be kept in the core
956
   file (in particular, for readonly sections).  */
957
 
958
int
959
solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
960
{
961
  struct target_so_ops *ops = solib_ops (target_gdbarch);
962
 
963
  if (ops->keep_data_in_core)
964
    return ops->keep_data_in_core (vaddr, size);
965
  else
966
    return 0;
967
}
968
 
969
/* Called by free_all_symtabs */
970
 
971
void
972
clear_solib (void)
973
{
974
  struct target_so_ops *ops = solib_ops (target_gdbarch);
975
 
976
  /* This function is expected to handle ELF shared libraries.  It is
977
     also used on Solaris, which can run either ELF or a.out binaries
978
     (for compatibility with SunOS 4), both of which can use shared
979
     libraries.  So we don't know whether we have an ELF executable or
980
     an a.out executable until the user chooses an executable file.
981
 
982
     ELF shared libraries don't get mapped into the address space
983
     until after the program starts, so we'd better not try to insert
984
     breakpoints in them immediately.  We have to wait until the
985
     dynamic linker has loaded them; we'll hit a bp_shlib_event
986
     breakpoint (look for calls to create_solib_event_breakpoint) when
987
     it's ready.
988
 
989
     SunOS shared libraries seem to be different --- they're present
990
     as soon as the process begins execution, so there's no need to
991
     put off inserting breakpoints.  There's also nowhere to put a
992
     bp_shlib_event breakpoint, so if we put it off, we'll never get
993
     around to it.
994
 
995
     So: disable breakpoints only if we're using ELF shared libs.  */
996
  if (exec_bfd != NULL
997
      && bfd_get_flavour (exec_bfd) != bfd_target_aout_flavour)
998
    disable_breakpoints_in_shlibs ();
999
 
1000
  while (so_list_head)
1001
    {
1002
      struct so_list *so = so_list_head;
1003
      so_list_head = so->next;
1004
      observer_notify_solib_unloaded (so);
1005
      if (so->abfd)
1006
        remove_target_sections (so->abfd);
1007
      free_so (so);
1008
    }
1009
 
1010
  ops->clear_solib ();
1011
}
1012
 
1013
/* GLOBAL FUNCTION
1014
 
1015
   solib_create_inferior_hook -- shared library startup support
1016
 
1017
   SYNOPSIS
1018
 
1019
   void solib_create_inferior_hook (int from_tty)
1020
 
1021
   DESCRIPTION
1022
 
1023
   When gdb starts up the inferior, it nurses it along (through the
1024
   shell) until it is ready to execute it's first instruction.  At this
1025
   point, this function gets called via expansion of the macro
1026
   SOLIB_CREATE_INFERIOR_HOOK.  */
1027
 
1028
void
1029
solib_create_inferior_hook (int from_tty)
1030
{
1031
  struct target_so_ops *ops = solib_ops (target_gdbarch);
1032
  ops->solib_create_inferior_hook (from_tty);
1033
}
1034
 
1035
/* GLOBAL FUNCTION
1036
 
1037
   in_solib_dynsym_resolve_code -- check to see if an address is in
1038
                                   dynamic loader's dynamic symbol
1039
                                   resolution code
1040
 
1041
   SYNOPSIS
1042
 
1043
   int in_solib_dynsym_resolve_code (CORE_ADDR pc)
1044
 
1045
   DESCRIPTION
1046
 
1047
   Determine if PC is in the dynamic linker's symbol resolution
1048
   code.  Return 1 if so, 0 otherwise.
1049
*/
1050
 
1051
int
1052
in_solib_dynsym_resolve_code (CORE_ADDR pc)
1053
{
1054
  struct target_so_ops *ops = solib_ops (target_gdbarch);
1055
  return ops->in_dynsym_resolve_code (pc);
1056
}
1057
 
1058
/*
1059
 
1060
   LOCAL FUNCTION
1061
 
1062
   sharedlibrary_command -- handle command to explicitly add library
1063
 
1064
   SYNOPSIS
1065
 
1066
   static void sharedlibrary_command (char *args, int from_tty)
1067
 
1068
   DESCRIPTION
1069
 
1070
 */
1071
 
1072
static void
1073
sharedlibrary_command (char *args, int from_tty)
1074
{
1075
  dont_repeat ();
1076
  solib_add (args, from_tty, (struct target_ops *) 0, 1);
1077
}
1078
 
1079
/* LOCAL FUNCTION
1080
 
1081
   no_shared_libraries -- handle command to explicitly discard symbols
1082
   from shared libraries.
1083
 
1084
   DESCRIPTION
1085
 
1086
   Implements the command "nosharedlibrary", which discards symbols
1087
   that have been auto-loaded from shared libraries.  Symbols from
1088
   shared libraries that were added by explicit request of the user
1089
   are not discarded.  Also called from remote.c.  */
1090
 
1091
void
1092
no_shared_libraries (char *ignored, int from_tty)
1093
{
1094
  /* The order of the two routines below is important: clear_solib notifies
1095
     the solib_unloaded observers, and some of these observers might need
1096
     access to their associated objfiles.  Therefore, we can not purge the
1097
     solibs' objfiles before clear_solib has been called.  */
1098
 
1099
  clear_solib ();
1100
  objfile_purge_solibs ();
1101
}
1102
 
1103
static void
1104
reload_shared_libraries (char *ignored, int from_tty,
1105
                         struct cmd_list_element *e)
1106
{
1107
  no_shared_libraries (NULL, from_tty);
1108
  /* Creating inferior hooks here has two purposes. First, if we reload
1109
     shared libraries then the address of solib breakpoint we've computed
1110
     previously might be no longer valid.  For example, if we forgot to set
1111
     solib-absolute-prefix and are setting it right now, then the previous
1112
     breakpoint address is plain wrong.  Second, installing solib hooks
1113
     also implicitly figures were ld.so is and loads symbols for it.
1114
     Absent this call, if we've just connected to a target and set
1115
     solib-absolute-prefix or solib-search-path, we'll lose all information
1116
     about ld.so.  */
1117
  if (target_has_execution)
1118
    {
1119
#ifdef SOLIB_CREATE_INFERIOR_HOOK
1120
      SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
1121
#else
1122
      solib_create_inferior_hook (from_tty);
1123
#endif
1124
    }
1125
 
1126
  /* Sometimes the platform-specific hook loads initial shared
1127
     libraries, and sometimes it doesn't.  If it doesn't FROM_TTY will be
1128
     incorrectly 0 but such solib targets should be fixed anyway.  If we
1129
     made all the inferior hook methods consistent, this call could be
1130
     removed.  Call it only after the solib target has been initialized by
1131
     solib_create_inferior_hook.  */
1132
 
1133
  solib_add (NULL, 0, NULL, auto_solib_add);
1134
 
1135
  /* We have unloaded and then reloaded debug info for all shared libraries.
1136
     However, frames may still reference them, for example a frame's
1137
     unwinder might still point of DWARF FDE structures that are now freed.
1138
     Reinit frame cache to avoid crashing.  */
1139
  reinit_frame_cache ();
1140
}
1141
 
1142
static void
1143
show_auto_solib_add (struct ui_file *file, int from_tty,
1144
                     struct cmd_list_element *c, const char *value)
1145
{
1146
  fprintf_filtered (file, _("Autoloading of shared library symbols is %s.\n"),
1147
                    value);
1148
}
1149
 
1150
 
1151
/* Handler for library-specific lookup of global symbol NAME in OBJFILE.  Call
1152
   the library-specific handler if it is installed for the current target.  */
1153
 
1154
struct symbol *
1155
solib_global_lookup (const struct objfile *objfile,
1156
                     const char *name,
1157
                     const char *linkage_name,
1158
                     const domain_enum domain)
1159
{
1160
  struct target_so_ops *ops = solib_ops (target_gdbarch);
1161
 
1162
  if (ops->lookup_lib_global_symbol != NULL)
1163
    return ops->lookup_lib_global_symbol (objfile, name, linkage_name, domain);
1164
  return NULL;
1165
}
1166
 
1167
 
1168
extern initialize_file_ftype _initialize_solib; /* -Wmissing-prototypes */
1169
 
1170
void
1171
_initialize_solib (void)
1172
{
1173
  struct cmd_list_element *c;
1174
 
1175
  solib_data = gdbarch_data_register_pre_init (solib_init);
1176
 
1177
  add_com ("sharedlibrary", class_files, sharedlibrary_command,
1178
           _("Load shared object library symbols for files matching REGEXP."));
1179
  add_info ("sharedlibrary", info_sharedlibrary_command,
1180
            _("Status of loaded shared object libraries."));
1181
  add_com ("nosharedlibrary", class_files, no_shared_libraries,
1182
           _("Unload all shared object library symbols."));
1183
 
1184
  add_setshow_boolean_cmd ("auto-solib-add", class_support,
1185
                           &auto_solib_add, _("\
1186
Set autoloading of shared library symbols."), _("\
1187
Show autoloading of shared library symbols."), _("\
1188
If \"on\", symbols from all shared object libraries will be loaded\n\
1189
automatically when the inferior begins execution, when the dynamic linker\n\
1190
informs gdb that a new library has been loaded, or when attaching to the\n\
1191
inferior.  Otherwise, symbols must be loaded manually, using `sharedlibrary'."),
1192
                           NULL,
1193
                           show_auto_solib_add,
1194
                           &setlist, &showlist);
1195
 
1196
  add_setshow_filename_cmd ("sysroot", class_support,
1197
                            &gdb_sysroot, _("\
1198
Set an alternate system root."), _("\
1199
Show the current system root."), _("\
1200
The system root is used to load absolute shared library symbol files.\n\
1201
For other (relative) files, you can add directories using\n\
1202
`set solib-search-path'."),
1203
                            reload_shared_libraries,
1204
                            NULL,
1205
                            &setlist, &showlist);
1206
 
1207
  add_alias_cmd ("solib-absolute-prefix", "sysroot", class_support, 0,
1208
                 &setlist);
1209
  add_alias_cmd ("solib-absolute-prefix", "sysroot", class_support, 0,
1210
                 &showlist);
1211
 
1212
  add_setshow_optional_filename_cmd ("solib-search-path", class_support,
1213
                                     &solib_search_path, _("\
1214
Set the search path for loading non-absolute shared library symbol files."), _("\
1215
Show the search path for loading non-absolute shared library symbol files."), _("\
1216
This takes precedence over the environment variables PATH and LD_LIBRARY_PATH."),
1217
                                     reload_shared_libraries,
1218
                                     show_solib_search_path,
1219
                                     &setlist, &showlist);
1220
}

powered by: WebSVN 2.1.0

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