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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [solib-svr4.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* Handle SVR4 shared libraries for GDB, the GNU Debugger.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
3
   2001
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 2 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 59 Temple Place - Suite 330,
21
   Boston, MA 02111-1307, USA.  */
22
 
23
#include "defs.h"
24
 
25
#include "elf/external.h"
26
#include "elf/common.h"
27
#include "elf/mips.h"
28
 
29
#include "symtab.h"
30
#include "bfd.h"
31
#include "symfile.h"
32
#include "objfiles.h"
33
#include "gdbcore.h"
34
#include "target.h"
35
#include "inferior.h"
36
 
37
#include "solist.h"
38
#include "solib-svr4.h"
39
 
40
#ifndef SVR4_FETCH_LINK_MAP_OFFSETS
41
#define SVR4_FETCH_LINK_MAP_OFFSETS() svr4_fetch_link_map_offsets ()
42
#endif
43
 
44
static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
45
static struct link_map_offsets *legacy_fetch_link_map_offsets (void);
46
 
47
/* fetch_link_map_offsets_gdbarch_data is a handle used to obtain the
48
   architecture specific link map offsets fetching function.  */
49
 
50
static struct gdbarch_data *fetch_link_map_offsets_gdbarch_data;
51
 
52
/* legacy_svr4_fetch_link_map_offsets_hook is a pointer to a function
53
   which is used to fetch link map offsets.  It will only be set
54
   by solib-legacy.c, if at all. */
55
 
56
struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook)(void) = 0;
57
 
58
/* Link map info to include in an allocated so_list entry */
59
 
60
struct lm_info
61
  {
62
    /* Pointer to copy of link map from inferior.  The type is char *
63
       rather than void *, so that we may use byte offsets to find the
64
       various fields without the need for a cast.  */
65
    char *lm;
66
  };
67
 
68
/* On SVR4 systems, a list of symbols in the dynamic linker where
69
   GDB can try to place a breakpoint to monitor shared library
70
   events.
71
 
72
   If none of these symbols are found, or other errors occur, then
73
   SVR4 systems will fall back to using a symbol as the "startup
74
   mapping complete" breakpoint address.  */
75
 
76
static char *solib_break_names[] =
77
{
78
  "r_debug_state",
79
  "_r_debug_state",
80
  "_dl_debug_state",
81
  "rtld_db_dlactivity",
82
  "_rtld_debug_state",
83
  NULL
84
};
85
 
86
#define BKPT_AT_SYMBOL 1
87
 
88
#if defined (BKPT_AT_SYMBOL)
89
static char *bkpt_names[] =
90
{
91
#ifdef SOLIB_BKPT_NAME
92
  SOLIB_BKPT_NAME,              /* Prefer configured name if it exists. */
93
#endif
94
  "_start",
95
  "__start",
96
  "main",
97
  NULL
98
};
99
#endif
100
 
101
static char *main_name_list[] =
102
{
103
  "main_$main",
104
  NULL
105
};
106
 
107
/* Macro to extract an address from a solib structure.
108
   When GDB is configured for some 32-bit targets (e.g. Solaris 2.7
109
   sparc), BFD is configured to handle 64-bit targets, so CORE_ADDR is
110
   64 bits.  We have to extract only the significant bits of addresses
111
   to get the right address when accessing the core file BFD.  */
112
 
113
#define SOLIB_EXTRACT_ADDRESS(MEMBER) \
114
        extract_address (&(MEMBER), sizeof (MEMBER))
115
 
116
/* local data declarations */
117
 
118
/* link map access functions */
119
 
120
static CORE_ADDR
121
LM_ADDR (struct so_list *so)
122
{
123
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
124
 
125
  return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + lmo->l_addr_offset,
126
                                             lmo->l_addr_size);
127
}
128
 
129
static CORE_ADDR
130
LM_NEXT (struct so_list *so)
131
{
132
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
133
 
134
  return extract_address (so->lm_info->lm + lmo->l_next_offset, lmo->l_next_size);
135
}
136
 
137
static CORE_ADDR
138
LM_NAME (struct so_list *so)
139
{
140
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
141
 
142
  return extract_address (so->lm_info->lm + lmo->l_name_offset, lmo->l_name_size);
143
}
144
 
145
static int
146
IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
147
{
148
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
149
 
150
  return extract_address (so->lm_info->lm + lmo->l_prev_offset,
151
                          lmo->l_prev_size) == 0;
152
}
153
 
154
static CORE_ADDR debug_base;    /* Base of dynamic linker structures */
155
static CORE_ADDR breakpoint_addr;       /* Address where end bkpt is set */
156
 
157
/* Local function prototypes */
158
 
159
static int match_main (char *);
160
 
161
static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
162
 
163
/*
164
 
165
   LOCAL FUNCTION
166
 
167
   bfd_lookup_symbol -- lookup the value for a specific symbol
168
 
169
   SYNOPSIS
170
 
171
   CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname)
172
 
173
   DESCRIPTION
174
 
175
   An expensive way to lookup the value of a single symbol for
176
   bfd's that are only temporary anyway.  This is used by the
177
   shared library support to find the address of the debugger
178
   interface structures in the shared library.
179
 
180
   Note that 0 is specifically allowed as an error return (no
181
   such symbol).
182
 */
183
 
184
static CORE_ADDR
185
bfd_lookup_symbol (bfd *abfd, char *symname)
186
{
187
  long storage_needed;
188
  asymbol *sym;
189
  asymbol **symbol_table;
190
  unsigned int number_of_symbols;
191
  unsigned int i;
192
  struct cleanup *back_to;
193
  CORE_ADDR symaddr = 0;
194
 
195
  storage_needed = bfd_get_symtab_upper_bound (abfd);
196
 
197
  if (storage_needed > 0)
198
    {
199
      symbol_table = (asymbol **) xmalloc (storage_needed);
200
      back_to = make_cleanup (xfree, (PTR) symbol_table);
201
      number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
202
 
203
      for (i = 0; i < number_of_symbols; i++)
204
        {
205
          sym = *symbol_table++;
206
          if (STREQ (sym->name, symname))
207
            {
208
              /* Bfd symbols are section relative. */
209
              symaddr = sym->value + sym->section->vma;
210
              break;
211
            }
212
        }
213
      do_cleanups (back_to);
214
    }
215
 
216
  if (symaddr)
217
    return symaddr;
218
 
219
  /* On FreeBSD, the dynamic linker is stripped by default.  So we'll
220
     have to check the dynamic string table too.  */
221
 
222
  storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
223
 
224
  if (storage_needed > 0)
225
    {
226
      symbol_table = (asymbol **) xmalloc (storage_needed);
227
      back_to = make_cleanup (xfree, (PTR) symbol_table);
228
      number_of_symbols = bfd_canonicalize_dynamic_symtab (abfd, symbol_table);
229
 
230
      for (i = 0; i < number_of_symbols; i++)
231
        {
232
          sym = *symbol_table++;
233
          if (STREQ (sym->name, symname))
234
            {
235
              /* Bfd symbols are section relative. */
236
              symaddr = sym->value + sym->section->vma;
237
              break;
238
            }
239
        }
240
      do_cleanups (back_to);
241
    }
242
 
243
  return symaddr;
244
}
245
 
246
#ifdef HANDLE_SVR4_EXEC_EMULATORS
247
 
248
/*
249
   Solaris BCP (the part of Solaris which allows it to run SunOS4
250
   a.out files) throws in another wrinkle. Solaris does not fill
251
   in the usual a.out link map structures when running BCP programs,
252
   the only way to get at them is via groping around in the dynamic
253
   linker.
254
   The dynamic linker and it's structures are located in the shared
255
   C library, which gets run as the executable's "interpreter" by
256
   the kernel.
257
 
258
   Note that we can assume nothing about the process state at the time
259
   we need to find these structures.  We may be stopped on the first
260
   instruction of the interpreter (C shared library), the first
261
   instruction of the executable itself, or somewhere else entirely
262
   (if we attached to the process for example).
263
 */
264
 
265
static char *debug_base_symbols[] =
266
{
267
  "r_debug",                    /* Solaris 2.3 */
268
  "_r_debug",                   /* Solaris 2.1, 2.2 */
269
  NULL
270
};
271
 
272
static int look_for_base (int, CORE_ADDR);
273
 
274
/*
275
 
276
   LOCAL FUNCTION
277
 
278
   look_for_base -- examine file for each mapped address segment
279
 
280
   SYNOPSYS
281
 
282
   static int look_for_base (int fd, CORE_ADDR baseaddr)
283
 
284
   DESCRIPTION
285
 
286
   This function is passed to proc_iterate_over_mappings, which
287
   causes it to get called once for each mapped address space, with
288
   an open file descriptor for the file mapped to that space, and the
289
   base address of that mapped space.
290
 
291
   Our job is to find the debug base symbol in the file that this
292
   fd is open on, if it exists, and if so, initialize the dynamic
293
   linker structure base address debug_base.
294
 
295
   Note that this is a computationally expensive proposition, since
296
   we basically have to open a bfd on every call, so we specifically
297
   avoid opening the exec file.
298
 */
299
 
300
static int
301
look_for_base (int fd, CORE_ADDR baseaddr)
302
{
303
  bfd *interp_bfd;
304
  CORE_ADDR address = 0;
305
  char **symbolp;
306
 
307
  /* If the fd is -1, then there is no file that corresponds to this
308
     mapped memory segment, so skip it.  Also, if the fd corresponds
309
     to the exec file, skip it as well. */
310
 
311
  if (fd == -1
312
      || (exec_bfd != NULL
313
          && fdmatch (fileno ((FILE *) (exec_bfd->iostream)), fd)))
314
    {
315
      return (0);
316
    }
317
 
318
  /* Try to open whatever random file this fd corresponds to.  Note that
319
     we have no way currently to find the filename.  Don't gripe about
320
     any problems we might have, just fail. */
321
 
322
  if ((interp_bfd = bfd_fdopenr ("unnamed", gnutarget, fd)) == NULL)
323
    {
324
      return (0);
325
    }
326
  if (!bfd_check_format (interp_bfd, bfd_object))
327
    {
328
      /* FIXME-leak: on failure, might not free all memory associated with
329
         interp_bfd.  */
330
      bfd_close (interp_bfd);
331
      return (0);
332
    }
333
 
334
  /* Now try to find our debug base symbol in this file, which we at
335
     least know to be a valid ELF executable or shared library. */
336
 
337
  for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
338
    {
339
      address = bfd_lookup_symbol (interp_bfd, *symbolp);
340
      if (address != 0)
341
        {
342
          break;
343
        }
344
    }
345
  if (address == 0)
346
    {
347
      /* FIXME-leak: on failure, might not free all memory associated with
348
         interp_bfd.  */
349
      bfd_close (interp_bfd);
350
      return (0);
351
    }
352
 
353
  /* Eureka!  We found the symbol.  But now we may need to relocate it
354
     by the base address.  If the symbol's value is less than the base
355
     address of the shared library, then it hasn't yet been relocated
356
     by the dynamic linker, and we have to do it ourself.  FIXME: Note
357
     that we make the assumption that the first segment that corresponds
358
     to the shared library has the base address to which the library
359
     was relocated. */
360
 
361
  if (address < baseaddr)
362
    {
363
      address += baseaddr;
364
    }
365
  debug_base = address;
366
  /* FIXME-leak: on failure, might not free all memory associated with
367
     interp_bfd.  */
368
  bfd_close (interp_bfd);
369
  return (1);
370
}
371
#endif /* HANDLE_SVR4_EXEC_EMULATORS */
372
 
373
/*
374
 
375
   LOCAL FUNCTION
376
 
377
   elf_locate_base -- locate the base address of dynamic linker structs
378
   for SVR4 elf targets.
379
 
380
   SYNOPSIS
381
 
382
   CORE_ADDR elf_locate_base (void)
383
 
384
   DESCRIPTION
385
 
386
   For SVR4 elf targets the address of the dynamic linker's runtime
387
   structure is contained within the dynamic info section in the
388
   executable file.  The dynamic section is also mapped into the
389
   inferior address space.  Because the runtime loader fills in the
390
   real address before starting the inferior, we have to read in the
391
   dynamic info section from the inferior address space.
392
   If there are any errors while trying to find the address, we
393
   silently return 0, otherwise the found address is returned.
394
 
395
 */
396
 
397
static CORE_ADDR
398
elf_locate_base (void)
399
{
400
  sec_ptr dyninfo_sect;
401
  int dyninfo_sect_size;
402
  CORE_ADDR dyninfo_addr;
403
  char *buf;
404
  char *bufend;
405
  int arch_size;
406
 
407
  /* Find the start address of the .dynamic section.  */
408
  dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic");
409
  if (dyninfo_sect == NULL)
410
    return 0;
411
  dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect);
412
 
413
  /* Read in .dynamic section, silently ignore errors.  */
414
  dyninfo_sect_size = bfd_section_size (exec_bfd, dyninfo_sect);
415
  buf = alloca (dyninfo_sect_size);
416
  if (target_read_memory (dyninfo_addr, buf, dyninfo_sect_size))
417
    return 0;
418
 
419
  /* Find the DT_DEBUG entry in the the .dynamic section.
420
     For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
421
     no DT_DEBUG entries.  */
422
 
423
  arch_size = bfd_get_arch_size (exec_bfd);
424
  if (arch_size == -1)  /* failure */
425
    return 0;
426
 
427
  if (arch_size == 32)
428
    { /* 32-bit elf */
429
      for (bufend = buf + dyninfo_sect_size;
430
           buf < bufend;
431
           buf += sizeof (Elf32_External_Dyn))
432
        {
433
          Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf;
434
          long dyn_tag;
435
          CORE_ADDR dyn_ptr;
436
 
437
          dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
438
          if (dyn_tag == DT_NULL)
439
            break;
440
          else if (dyn_tag == DT_DEBUG)
441
            {
442
              dyn_ptr = bfd_h_get_32 (exec_bfd,
443
                                      (bfd_byte *) x_dynp->d_un.d_ptr);
444
              return dyn_ptr;
445
            }
446
          else if (dyn_tag == DT_MIPS_RLD_MAP)
447
            {
448
              char *pbuf;
449
 
450
              pbuf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
451
              /* DT_MIPS_RLD_MAP contains a pointer to the address
452
                 of the dynamic link structure.  */
453
              dyn_ptr = bfd_h_get_32 (exec_bfd,
454
                                      (bfd_byte *) x_dynp->d_un.d_ptr);
455
              if (target_read_memory (dyn_ptr, pbuf, sizeof (pbuf)))
456
                return 0;
457
              return extract_unsigned_integer (pbuf, sizeof (pbuf));
458
            }
459
        }
460
    }
461
  else /* 64-bit elf */
462
    {
463
      for (bufend = buf + dyninfo_sect_size;
464
           buf < bufend;
465
           buf += sizeof (Elf64_External_Dyn))
466
        {
467
          Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf;
468
          long dyn_tag;
469
          CORE_ADDR dyn_ptr;
470
 
471
          dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
472
          if (dyn_tag == DT_NULL)
473
            break;
474
          else if (dyn_tag == DT_DEBUG)
475
            {
476
              dyn_ptr = bfd_h_get_64 (exec_bfd,
477
                                      (bfd_byte *) x_dynp->d_un.d_ptr);
478
              return dyn_ptr;
479
            }
480
        }
481
    }
482
 
483
  /* DT_DEBUG entry not found.  */
484
  return 0;
485
}
486
 
487
/*
488
 
489
   LOCAL FUNCTION
490
 
491
   locate_base -- locate the base address of dynamic linker structs
492
 
493
   SYNOPSIS
494
 
495
   CORE_ADDR locate_base (void)
496
 
497
   DESCRIPTION
498
 
499
   For both the SunOS and SVR4 shared library implementations, if the
500
   inferior executable has been linked dynamically, there is a single
501
   address somewhere in the inferior's data space which is the key to
502
   locating all of the dynamic linker's runtime structures.  This
503
   address is the value of the debug base symbol.  The job of this
504
   function is to find and return that address, or to return 0 if there
505
   is no such address (the executable is statically linked for example).
506
 
507
   For SunOS, the job is almost trivial, since the dynamic linker and
508
   all of it's structures are statically linked to the executable at
509
   link time.  Thus the symbol for the address we are looking for has
510
   already been added to the minimal symbol table for the executable's
511
   objfile at the time the symbol file's symbols were read, and all we
512
   have to do is look it up there.  Note that we explicitly do NOT want
513
   to find the copies in the shared library.
514
 
515
   The SVR4 version is a bit more complicated because the address
516
   is contained somewhere in the dynamic info section.  We have to go
517
   to a lot more work to discover the address of the debug base symbol.
518
   Because of this complexity, we cache the value we find and return that
519
   value on subsequent invocations.  Note there is no copy in the
520
   executable symbol tables.
521
 
522
 */
523
 
524
static CORE_ADDR
525
locate_base (void)
526
{
527
  /* Check to see if we have a currently valid address, and if so, avoid
528
     doing all this work again and just return the cached address.  If
529
     we have no cached address, try to locate it in the dynamic info
530
     section for ELF executables.  */
531
 
532
  if (debug_base == 0)
533
    {
534
      if (exec_bfd != NULL
535
          && bfd_get_flavour (exec_bfd) == bfd_target_elf_flavour)
536
        debug_base = elf_locate_base ();
537
#ifdef HANDLE_SVR4_EXEC_EMULATORS
538
      /* Try it the hard way for emulated executables.  */
539
      else if (!ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
540
        proc_iterate_over_mappings (look_for_base);
541
#endif
542
    }
543
  return (debug_base);
544
}
545
 
546
/*
547
 
548
   LOCAL FUNCTION
549
 
550
   first_link_map_member -- locate first member in dynamic linker's map
551
 
552
   SYNOPSIS
553
 
554
   static CORE_ADDR first_link_map_member (void)
555
 
556
   DESCRIPTION
557
 
558
   Find the first element in the inferior's dynamic link map, and
559
   return its address in the inferior.  This function doesn't copy the
560
   link map entry itself into our address space; current_sos actually
561
   does the reading.  */
562
 
563
static CORE_ADDR
564
first_link_map_member (void)
565
{
566
  CORE_ADDR lm = 0;
567
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
568
  char *r_map_buf = xmalloc (lmo->r_map_size);
569
  struct cleanup *cleanups = make_cleanup (xfree, r_map_buf);
570
 
571
  read_memory (debug_base + lmo->r_map_offset, r_map_buf, lmo->r_map_size);
572
 
573
  lm = extract_address (r_map_buf, lmo->r_map_size);
574
 
575
  /* FIXME:  Perhaps we should validate the info somehow, perhaps by
576
     checking r_version for a known version number, or r_state for
577
     RT_CONSISTENT. */
578
 
579
  do_cleanups (cleanups);
580
 
581
  return (lm);
582
}
583
 
584
/*
585
 
586
  LOCAL FUNCTION
587
 
588
  open_symbol_file_object
589
 
590
  SYNOPSIS
591
 
592
  void open_symbol_file_object (void *from_tty)
593
 
594
  DESCRIPTION
595
 
596
  If no open symbol file, attempt to locate and open the main symbol
597
  file.  On SVR4 systems, this is the first link map entry.  If its
598
  name is here, we can open it.  Useful when attaching to a process
599
  without first loading its symbol file.
600
 
601
  If FROM_TTYP dereferences to a non-zero integer, allow messages to
602
  be printed.  This parameter is a pointer rather than an int because
603
  open_symbol_file_object() is called via catch_errors() and
604
  catch_errors() requires a pointer argument. */
605
 
606
static int
607
open_symbol_file_object (void *from_ttyp)
608
{
609
  CORE_ADDR lm, l_name;
610
  char *filename;
611
  int errcode;
612
  int from_tty = *(int *)from_ttyp;
613
  struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
614
  char *l_name_buf = xmalloc (lmo->l_name_size);
615
  struct cleanup *cleanups = make_cleanup (xfree, l_name_buf);
616
 
617
  if (symfile_objfile)
618
    if (!query ("Attempt to reload symbols from process? "))
619
      return 0;
620
 
621
  if ((debug_base = locate_base ()) == 0)
622
    return 0;    /* failed somehow... */
623
 
624
  /* First link map member should be the executable.  */
625
  if ((lm = first_link_map_member ()) == 0)
626
    return 0;    /* failed somehow... */
627
 
628
  /* Read address of name from target memory to GDB.  */
629
  read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size);
630
 
631
  /* Convert the address to host format.  */
632
  l_name = extract_address (l_name_buf, lmo->l_name_size);
633
 
634
  /* Free l_name_buf.  */
635
  do_cleanups (cleanups);
636
 
637
  if (l_name == 0)
638
    return 0;            /* No filename.  */
639
 
640
  /* Now fetch the filename from target memory.  */
641
  target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
642
 
643
  if (errcode)
644
    {
645
      warning ("failed to read exec filename from attached file: %s",
646
               safe_strerror (errcode));
647
      return 0;
648
    }
649
 
650
  make_cleanup (xfree, filename);
651
  /* Have a pathname: read the symbol file.  */
652
  symbol_file_add_main (filename, from_tty);
653
 
654
  return 1;
655
}
656
 
657
/* LOCAL FUNCTION
658
 
659
   current_sos -- build a list of currently loaded shared objects
660
 
661
   SYNOPSIS
662
 
663
   struct so_list *current_sos ()
664
 
665
   DESCRIPTION
666
 
667
   Build a list of `struct so_list' objects describing the shared
668
   objects currently loaded in the inferior.  This list does not
669
   include an entry for the main executable file.
670
 
671
   Note that we only gather information directly available from the
672
   inferior --- we don't examine any of the shared library files
673
   themselves.  The declaration of `struct so_list' says which fields
674
   we provide values for.  */
675
 
676
static struct so_list *
677
svr4_current_sos (void)
678
{
679
  CORE_ADDR lm;
680
  struct so_list *head = 0;
681
  struct so_list **link_ptr = &head;
682
 
683
  /* Make sure we've looked up the inferior's dynamic linker's base
684
     structure.  */
685
  if (! debug_base)
686
    {
687
      debug_base = locate_base ();
688
 
689
      /* If we can't find the dynamic linker's base structure, this
690
         must not be a dynamically linked executable.  Hmm.  */
691
      if (! debug_base)
692
        return 0;
693
    }
694
 
695
  /* Walk the inferior's link map list, and build our list of
696
     `struct so_list' nodes.  */
697
  lm = first_link_map_member ();
698
  while (lm)
699
    {
700
      struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
701
      struct so_list *new
702
        = (struct so_list *) xmalloc (sizeof (struct so_list));
703
      struct cleanup *old_chain = make_cleanup (xfree, new);
704
 
705
      memset (new, 0, sizeof (*new));
706
 
707
      new->lm_info = xmalloc (sizeof (struct lm_info));
708
      make_cleanup (xfree, new->lm_info);
709
 
710
      new->lm_info->lm = xmalloc (lmo->link_map_size);
711
      make_cleanup (xfree, new->lm_info->lm);
712
      memset (new->lm_info->lm, 0, lmo->link_map_size);
713
 
714
      read_memory (lm, new->lm_info->lm, lmo->link_map_size);
715
 
716
      lm = LM_NEXT (new);
717
 
718
      /* For SVR4 versions, the first entry in the link map is for the
719
         inferior executable, so we must ignore it.  For some versions of
720
         SVR4, it has no name.  For others (Solaris 2.3 for example), it
721
         does have a name, so we can no longer use a missing name to
722
         decide when to ignore it. */
723
      if (IGNORE_FIRST_LINK_MAP_ENTRY (new))
724
        free_so (new);
725
      else
726
        {
727
          int errcode;
728
          char *buffer;
729
 
730
          /* Extract this shared object's name.  */
731
          target_read_string (LM_NAME (new), &buffer,
732
                              SO_NAME_MAX_PATH_SIZE - 1, &errcode);
733
          if (errcode != 0)
734
            {
735
              warning ("current_sos: Can't read pathname for load map: %s\n",
736
                       safe_strerror (errcode));
737
            }
738
          else
739
            {
740
              strncpy (new->so_name, buffer, SO_NAME_MAX_PATH_SIZE - 1);
741
              new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
742
              xfree (buffer);
743
              strcpy (new->so_original_name, new->so_name);
744
            }
745
 
746
          /* If this entry has no name, or its name matches the name
747
             for the main executable, don't include it in the list.  */
748
          if (! new->so_name[0]
749
              || match_main (new->so_name))
750
            free_so (new);
751
          else
752
            {
753
              new->next = 0;
754
              *link_ptr = new;
755
              link_ptr = &new->next;
756
            }
757
        }
758
 
759
      discard_cleanups (old_chain);
760
    }
761
 
762
  return head;
763
}
764
 
765
 
766
/* On some systems, the only way to recognize the link map entry for
767
   the main executable file is by looking at its name.  Return
768
   non-zero iff SONAME matches one of the known main executable names.  */
769
 
770
static int
771
match_main (char *soname)
772
{
773
  char **mainp;
774
 
775
  for (mainp = main_name_list; *mainp != NULL; mainp++)
776
    {
777
      if (strcmp (soname, *mainp) == 0)
778
        return (1);
779
    }
780
 
781
  return (0);
782
}
783
 
784
/* Return 1 if PC lies in the dynamic symbol resolution code of the
785
   SVR4 run time loader.  */
786
static CORE_ADDR interp_text_sect_low;
787
static CORE_ADDR interp_text_sect_high;
788
static CORE_ADDR interp_plt_sect_low;
789
static CORE_ADDR interp_plt_sect_high;
790
 
791
static int
792
svr4_in_dynsym_resolve_code (CORE_ADDR pc)
793
{
794
  return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
795
          || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
796
          || in_plt_section (pc, NULL));
797
}
798
 
799
 
800
/*
801
 
802
   LOCAL FUNCTION
803
 
804
   enable_break -- arrange for dynamic linker to hit breakpoint
805
 
806
   SYNOPSIS
807
 
808
   int enable_break (void)
809
 
810
   DESCRIPTION
811
 
812
   Both the SunOS and the SVR4 dynamic linkers have, as part of their
813
   debugger interface, support for arranging for the inferior to hit
814
   a breakpoint after mapping in the shared libraries.  This function
815
   enables that breakpoint.
816
 
817
   For SunOS, there is a special flag location (in_debugger) which we
818
   set to 1.  When the dynamic linker sees this flag set, it will set
819
   a breakpoint at a location known only to itself, after saving the
820
   original contents of that place and the breakpoint address itself,
821
   in it's own internal structures.  When we resume the inferior, it
822
   will eventually take a SIGTRAP when it runs into the breakpoint.
823
   We handle this (in a different place) by restoring the contents of
824
   the breakpointed location (which is only known after it stops),
825
   chasing around to locate the shared libraries that have been
826
   loaded, then resuming.
827
 
828
   For SVR4, the debugger interface structure contains a member (r_brk)
829
   which is statically initialized at the time the shared library is
830
   built, to the offset of a function (_r_debug_state) which is guaran-
831
   teed to be called once before mapping in a library, and again when
832
   the mapping is complete.  At the time we are examining this member,
833
   it contains only the unrelocated offset of the function, so we have
834
   to do our own relocation.  Later, when the dynamic linker actually
835
   runs, it relocates r_brk to be the actual address of _r_debug_state().
836
 
837
   The debugger interface structure also contains an enumeration which
838
   is set to either RT_ADD or RT_DELETE prior to changing the mapping,
839
   depending upon whether or not the library is being mapped or unmapped,
840
   and then set to RT_CONSISTENT after the library is mapped/unmapped.
841
 */
842
 
843
static int
844
enable_break (void)
845
{
846
  int success = 0;
847
 
848
#ifdef BKPT_AT_SYMBOL
849
 
850
  struct minimal_symbol *msymbol;
851
  char **bkpt_namep;
852
  asection *interp_sect;
853
 
854
  /* First, remove all the solib event breakpoints.  Their addresses
855
     may have changed since the last time we ran the program.  */
856
  remove_solib_event_breakpoints ();
857
 
858
  interp_text_sect_low = interp_text_sect_high = 0;
859
  interp_plt_sect_low = interp_plt_sect_high = 0;
860
 
861
  /* Find the .interp section; if not found, warn the user and drop
862
     into the old breakpoint at symbol code.  */
863
  interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
864
  if (interp_sect)
865
    {
866
      unsigned int interp_sect_size;
867
      char *buf;
868
      CORE_ADDR load_addr = 0;
869
      int load_addr_found = 0;
870
      struct so_list *inferior_sos;
871
      bfd *tmp_bfd = NULL;
872
      int tmp_fd = -1;
873
      char *tmp_pathname = NULL;
874
      CORE_ADDR sym_addr = 0;
875
 
876
      /* Read the contents of the .interp section into a local buffer;
877
         the contents specify the dynamic linker this program uses.  */
878
      interp_sect_size = bfd_section_size (exec_bfd, interp_sect);
879
      buf = alloca (interp_sect_size);
880
      bfd_get_section_contents (exec_bfd, interp_sect,
881
                                buf, 0, interp_sect_size);
882
 
883
      /* Now we need to figure out where the dynamic linker was
884
         loaded so that we can load its symbols and place a breakpoint
885
         in the dynamic linker itself.
886
 
887
         This address is stored on the stack.  However, I've been unable
888
         to find any magic formula to find it for Solaris (appears to
889
         be trivial on GNU/Linux).  Therefore, we have to try an alternate
890
         mechanism to find the dynamic linker's base address.  */
891
 
892
      tmp_fd  = solib_open (buf, &tmp_pathname);
893
      if (tmp_fd >= 0)
894
        tmp_bfd = bfd_fdopenr (tmp_pathname, gnutarget, tmp_fd);
895
 
896
      if (tmp_bfd == NULL)
897
        goto bkpt_at_symbol;
898
 
899
      /* Make sure the dynamic linker's really a useful object.  */
900
      if (!bfd_check_format (tmp_bfd, bfd_object))
901
        {
902
          warning ("Unable to grok dynamic linker %s as an object file", buf);
903
          bfd_close (tmp_bfd);
904
          goto bkpt_at_symbol;
905
        }
906
 
907
      /* If the entry in _DYNAMIC for the dynamic linker has already
908
         been filled in, we can read its base address from there. */
909
      inferior_sos = svr4_current_sos ();
910
      if (inferior_sos)
911
        {
912
          /* Connected to a running target.  Update our shared library table. */
913
          solib_add (NULL, 0, NULL, auto_solib_add);
914
        }
915
      while (inferior_sos)
916
        {
917
          if (strcmp (buf, inferior_sos->so_original_name) == 0)
918
            {
919
              load_addr_found = 1;
920
              load_addr = LM_ADDR (inferior_sos);
921
              break;
922
            }
923
          inferior_sos = inferior_sos->next;
924
        }
925
 
926
      /* Otherwise we find the dynamic linker's base address by examining
927
         the current pc (which should point at the entry point for the
928
         dynamic linker) and subtracting the offset of the entry point.  */
929
      if (!load_addr_found)
930
        load_addr = read_pc () - tmp_bfd->start_address;
931
 
932
      /* Record the relocated start and end address of the dynamic linker
933
         text and plt section for svr4_in_dynsym_resolve_code.  */
934
      interp_sect = bfd_get_section_by_name (tmp_bfd, ".text");
935
      if (interp_sect)
936
        {
937
          interp_text_sect_low =
938
            bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
939
          interp_text_sect_high =
940
            interp_text_sect_low + bfd_section_size (tmp_bfd, interp_sect);
941
        }
942
      interp_sect = bfd_get_section_by_name (tmp_bfd, ".plt");
943
      if (interp_sect)
944
        {
945
          interp_plt_sect_low =
946
            bfd_section_vma (tmp_bfd, interp_sect) + load_addr;
947
          interp_plt_sect_high =
948
            interp_plt_sect_low + bfd_section_size (tmp_bfd, interp_sect);
949
        }
950
 
951
      /* Now try to set a breakpoint in the dynamic linker.  */
952
      for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
953
        {
954
          sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep);
955
          if (sym_addr != 0)
956
            break;
957
        }
958
 
959
      /* We're done with the temporary bfd.  */
960
      bfd_close (tmp_bfd);
961
 
962
      if (sym_addr != 0)
963
        {
964
          create_solib_event_breakpoint (load_addr + sym_addr);
965
          return 1;
966
        }
967
 
968
      /* For whatever reason we couldn't set a breakpoint in the dynamic
969
         linker.  Warn and drop into the old code.  */
970
    bkpt_at_symbol:
971
      warning ("Unable to find dynamic linker breakpoint function.\nGDB will be unable to debug shared library initializers\nand track explicitly loaded dynamic code.");
972
    }
973
 
974
  /* Scan through the list of symbols, trying to look up the symbol and
975
     set a breakpoint there.  Terminate loop when we/if we succeed. */
976
 
977
  breakpoint_addr = 0;
978
  for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
979
    {
980
      msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
981
      if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
982
        {
983
          create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
984
          return 1;
985
        }
986
    }
987
 
988
  /* Nothing good happened.  */
989
  success = 0;
990
 
991
#endif /* BKPT_AT_SYMBOL */
992
 
993
  return (success);
994
}
995
 
996
/*
997
 
998
   LOCAL FUNCTION
999
 
1000
   special_symbol_handling -- additional shared library symbol handling
1001
 
1002
   SYNOPSIS
1003
 
1004
   void special_symbol_handling ()
1005
 
1006
   DESCRIPTION
1007
 
1008
   Once the symbols from a shared object have been loaded in the usual
1009
   way, we are called to do any system specific symbol handling that
1010
   is needed.
1011
 
1012
   For SunOS4, this consisted of grunging around in the dynamic
1013
   linkers structures to find symbol definitions for "common" symbols
1014
   and adding them to the minimal symbol table for the runtime common
1015
   objfile.
1016
 
1017
   However, for SVR4, there's nothing to do.
1018
 
1019
 */
1020
 
1021
static void
1022
svr4_special_symbol_handling (void)
1023
{
1024
}
1025
 
1026
/* Relocate the main executable.  This function should be called upon
1027
   stopping the inferior process at the entry point to the program.
1028
   The entry point from BFD is compared to the PC and if they are
1029
   different, the main executable is relocated by the proper amount.
1030
 
1031
   As written it will only attempt to relocate executables which
1032
   lack interpreter sections.  It seems likely that only dynamic
1033
   linker executables will get relocated, though it should work
1034
   properly for a position-independent static executable as well.  */
1035
 
1036
static void
1037
svr4_relocate_main_executable (void)
1038
{
1039
  asection *interp_sect;
1040
  CORE_ADDR pc = read_pc ();
1041
 
1042
  /* Decide if the objfile needs to be relocated.  As indicated above,
1043
     we will only be here when execution is stopped at the beginning
1044
     of the program.  Relocation is necessary if the address at which
1045
     we are presently stopped differs from the start address stored in
1046
     the executable AND there's no interpreter section.  The condition
1047
     regarding the interpreter section is very important because if
1048
     there *is* an interpreter section, execution will begin there
1049
     instead.  When there is an interpreter section, the start address
1050
     is (presumably) used by the interpreter at some point to start
1051
     execution of the program.
1052
 
1053
     If there is an interpreter, it is normal for it to be set to an
1054
     arbitrary address at the outset.  The job of finding it is
1055
     handled in enable_break().
1056
 
1057
     So, to summarize, relocations are necessary when there is no
1058
     interpreter section and the start address obtained from the
1059
     executable is different from the address at which GDB is
1060
     currently stopped.
1061
 
1062
     [ The astute reader will note that we also test to make sure that
1063
       the executable in question has the DYNAMIC flag set.  It is my
1064
       opinion that this test is unnecessary (undesirable even).  It
1065
       was added to avoid inadvertent relocation of an executable
1066
       whose e_type member in the ELF header is not ET_DYN.  There may
1067
       be a time in the future when it is desirable to do relocations
1068
       on other types of files as well in which case this condition
1069
       should either be removed or modified to accomodate the new file
1070
       type.  (E.g, an ET_EXEC executable which has been built to be
1071
       position-independent could safely be relocated by the OS if
1072
       desired.  It is true that this violates the ABI, but the ABI
1073
       has been known to be bent from time to time.)  - Kevin, Nov 2000. ]
1074
     */
1075
 
1076
  interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
1077
  if (interp_sect == NULL
1078
      && (bfd_get_file_flags (exec_bfd) & DYNAMIC) != 0
1079
      && bfd_get_start_address (exec_bfd) != pc)
1080
    {
1081
      struct cleanup *old_chain;
1082
      struct section_offsets *new_offsets;
1083
      int i, changed;
1084
      CORE_ADDR displacement;
1085
 
1086
      /* It is necessary to relocate the objfile.  The amount to
1087
         relocate by is simply the address at which we are stopped
1088
         minus the starting address from the executable.
1089
 
1090
         We relocate all of the sections by the same amount.  This
1091
         behavior is mandated by recent editions of the System V ABI.
1092
         According to the System V Application Binary Interface,
1093
         Edition 4.1, page 5-5:
1094
 
1095
           ...  Though the system chooses virtual addresses for
1096
           individual processes, it maintains the segments' relative
1097
           positions.  Because position-independent code uses relative
1098
           addressesing between segments, the difference between
1099
           virtual addresses in memory must match the difference
1100
           between virtual addresses in the file.  The difference
1101
           between the virtual address of any segment in memory and
1102
           the corresponding virtual address in the file is thus a
1103
           single constant value for any one executable or shared
1104
           object in a given process.  This difference is the base
1105
           address.  One use of the base address is to relocate the
1106
           memory image of the program during dynamic linking.
1107
 
1108
         The same language also appears in Edition 4.0 of the System V
1109
         ABI and is left unspecified in some of the earlier editions.  */
1110
 
1111
      displacement = pc - bfd_get_start_address (exec_bfd);
1112
      changed = 0;
1113
 
1114
      new_offsets = xcalloc (symfile_objfile->num_sections,
1115
                             sizeof (struct section_offsets));
1116
      old_chain = make_cleanup (xfree, new_offsets);
1117
 
1118
      for (i = 0; i < symfile_objfile->num_sections; i++)
1119
        {
1120
          if (displacement != ANOFFSET (symfile_objfile->section_offsets, i))
1121
            changed = 1;
1122
          new_offsets->offsets[i] = displacement;
1123
        }
1124
 
1125
      if (changed)
1126
        objfile_relocate (symfile_objfile, new_offsets);
1127
 
1128
      do_cleanups (old_chain);
1129
    }
1130
}
1131
 
1132
/*
1133
 
1134
   GLOBAL FUNCTION
1135
 
1136
   svr4_solib_create_inferior_hook -- shared library startup support
1137
 
1138
   SYNOPSIS
1139
 
1140
   void svr4_solib_create_inferior_hook()
1141
 
1142
   DESCRIPTION
1143
 
1144
   When gdb starts up the inferior, it nurses it along (through the
1145
   shell) until it is ready to execute it's first instruction.  At this
1146
   point, this function gets called via expansion of the macro
1147
   SOLIB_CREATE_INFERIOR_HOOK.
1148
 
1149
   For SunOS executables, this first instruction is typically the
1150
   one at "_start", or a similar text label, regardless of whether
1151
   the executable is statically or dynamically linked.  The runtime
1152
   startup code takes care of dynamically linking in any shared
1153
   libraries, once gdb allows the inferior to continue.
1154
 
1155
   For SVR4 executables, this first instruction is either the first
1156
   instruction in the dynamic linker (for dynamically linked
1157
   executables) or the instruction at "start" for statically linked
1158
   executables.  For dynamically linked executables, the system
1159
   first exec's /lib/libc.so.N, which contains the dynamic linker,
1160
   and starts it running.  The dynamic linker maps in any needed
1161
   shared libraries, maps in the actual user executable, and then
1162
   jumps to "start" in the user executable.
1163
 
1164
   For both SunOS shared libraries, and SVR4 shared libraries, we
1165
   can arrange to cooperate with the dynamic linker to discover the
1166
   names of shared libraries that are dynamically linked, and the
1167
   base addresses to which they are linked.
1168
 
1169
   This function is responsible for discovering those names and
1170
   addresses, and saving sufficient information about them to allow
1171
   their symbols to be read at a later time.
1172
 
1173
   FIXME
1174
 
1175
   Between enable_break() and disable_break(), this code does not
1176
   properly handle hitting breakpoints which the user might have
1177
   set in the startup code or in the dynamic linker itself.  Proper
1178
   handling will probably have to wait until the implementation is
1179
   changed to use the "breakpoint handler function" method.
1180
 
1181
   Also, what if child has exit()ed?  Must exit loop somehow.
1182
 */
1183
 
1184
static void
1185
svr4_solib_create_inferior_hook (void)
1186
{
1187
  /* Relocate the main executable if necessary.  */
1188
  svr4_relocate_main_executable ();
1189
 
1190
  if (!enable_break ())
1191
    {
1192
      warning ("shared library handler failed to enable breakpoint");
1193
      return;
1194
    }
1195
 
1196
#if defined(_SCO_DS)
1197
  /* SCO needs the loop below, other systems should be using the
1198
     special shared library breakpoints and the shared library breakpoint
1199
     service routine.
1200
 
1201
     Now run the target.  It will eventually hit the breakpoint, at
1202
     which point all of the libraries will have been mapped in and we
1203
     can go groveling around in the dynamic linker structures to find
1204
     out what we need to know about them. */
1205
 
1206
  clear_proceed_status ();
1207
  stop_soon_quietly = 1;
1208
  stop_signal = TARGET_SIGNAL_0;
1209
  do
1210
    {
1211
      target_resume (pid_to_ptid (-1), 0, stop_signal);
1212
      wait_for_inferior ();
1213
    }
1214
  while (stop_signal != TARGET_SIGNAL_TRAP);
1215
  stop_soon_quietly = 0;
1216
#endif /* defined(_SCO_DS) */
1217
}
1218
 
1219
static void
1220
svr4_clear_solib (void)
1221
{
1222
  debug_base = 0;
1223
}
1224
 
1225
static void
1226
svr4_free_so (struct so_list *so)
1227
{
1228
  xfree (so->lm_info->lm);
1229
  xfree (so->lm_info);
1230
}
1231
 
1232
 
1233
/* Clear any bits of ADDR that wouldn't fit in a target-format
1234
   data pointer.  "Data pointer" here refers to whatever sort of
1235
   address the dynamic linker uses to manage its sections.  At the
1236
   moment, we don't support shared libraries on any processors where
1237
   code and data pointers are different sizes.
1238
 
1239
   This isn't really the right solution.  What we really need here is
1240
   a way to do arithmetic on CORE_ADDR values that respects the
1241
   natural pointer/address correspondence.  (For example, on the MIPS,
1242
   converting a 32-bit pointer to a 64-bit CORE_ADDR requires you to
1243
   sign-extend the value.  There, simply truncating the bits above
1244
   TARGET_PTR_BIT, as we do below, is no good.)  This should probably
1245
   be a new gdbarch method or something.  */
1246
static CORE_ADDR
1247
svr4_truncate_ptr (CORE_ADDR addr)
1248
{
1249
  if (TARGET_PTR_BIT == sizeof (CORE_ADDR) * 8)
1250
    /* We don't need to truncate anything, and the bit twiddling below
1251
       will fail due to overflow problems.  */
1252
    return addr;
1253
  else
1254
    return addr & (((CORE_ADDR) 1 << TARGET_PTR_BIT) - 1);
1255
}
1256
 
1257
 
1258
static void
1259
svr4_relocate_section_addresses (struct so_list *so,
1260
                                 struct section_table *sec)
1261
{
1262
  sec->addr    = svr4_truncate_ptr (sec->addr    + LM_ADDR (so));
1263
  sec->endaddr = svr4_truncate_ptr (sec->endaddr + LM_ADDR (so));
1264
}
1265
 
1266
 
1267
/* Fetch a link_map_offsets structure for native targets using struct
1268
   definitions from link.h.  See solib-legacy.c for the function
1269
   which does the actual work.
1270
 
1271
   Note: For non-native targets (i.e. cross-debugging situations),
1272
   a target specific fetch_link_map_offsets() function should be
1273
   defined and registered via set_solib_svr4_fetch_link_map_offsets().  */
1274
 
1275
static struct link_map_offsets *
1276
legacy_fetch_link_map_offsets (void)
1277
{
1278
  if (legacy_svr4_fetch_link_map_offsets_hook)
1279
    return legacy_svr4_fetch_link_map_offsets_hook ();
1280
  else
1281
    {
1282
      internal_error (__FILE__, __LINE__,
1283
                      "legacy_fetch_link_map_offsets called without legacy "
1284
                      "link_map support enabled.");
1285
      return 0;
1286
    }
1287
}
1288
 
1289
/* Fetch a link_map_offsets structure using the method registered in the
1290
   architecture vector.  */
1291
 
1292
static struct link_map_offsets *
1293
svr4_fetch_link_map_offsets (void)
1294
{
1295
  struct link_map_offsets *(*flmo)(void) =
1296
    gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data);
1297
 
1298
  if (flmo == NULL)
1299
    {
1300
      internal_error (__FILE__, __LINE__,
1301
                      "svr4_fetch_link_map_offsets: fetch_link_map_offsets "
1302
                      "method not defined for this architecture.");
1303
      return 0;
1304
    }
1305
  else
1306
    return (flmo ());
1307
}
1308
 
1309
/* set_solib_svr4_fetch_link_map_offsets() is intended to be called by
1310
   a <arch>_gdbarch_init() function.  It is used to establish an
1311
   architecture specific link_map_offsets fetcher for the architecture
1312
   being defined.  */
1313
 
1314
void
1315
set_solib_svr4_fetch_link_map_offsets (struct gdbarch *gdbarch,
1316
                                       struct link_map_offsets *(*flmo) (void))
1317
{
1318
  set_gdbarch_data (gdbarch, fetch_link_map_offsets_gdbarch_data, flmo);
1319
}
1320
 
1321
/* Initialize the architecture-specific link_map_offsets fetcher.
1322
   This is called after <arch>_gdbarch_init() has set up its `struct
1323
   gdbarch' for the new architecture, and is only called if the
1324
   link_map_offsets fetcher isn't already initialized (which is
1325
   usually done by calling set_solib_svr4_fetch_link_map_offsets()
1326
   above in <arch>_gdbarch_init()).  Therefore we attempt to provide a
1327
   reasonable alternative (for native targets anyway) if the
1328
   <arch>_gdbarch_init() fails to call
1329
   set_solib_svr4_fetch_link_map_offsets().  */
1330
 
1331
static void *
1332
init_fetch_link_map_offsets (struct gdbarch *gdbarch)
1333
{
1334
  return legacy_fetch_link_map_offsets;
1335
}
1336
 
1337
static struct target_so_ops svr4_so_ops;
1338
 
1339
void
1340
_initialize_svr4_solib (void)
1341
{
1342
  fetch_link_map_offsets_gdbarch_data =
1343
    register_gdbarch_data (init_fetch_link_map_offsets, 0);
1344
 
1345
  svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
1346
  svr4_so_ops.free_so = svr4_free_so;
1347
  svr4_so_ops.clear_solib = svr4_clear_solib;
1348
  svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
1349
  svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
1350
  svr4_so_ops.current_sos = svr4_current_sos;
1351
  svr4_so_ops.open_symbol_file_object = open_symbol_file_object;
1352
  svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code;
1353
 
1354
  /* FIXME: Don't do this here.  *_gdbarch_init() should set so_ops. */
1355
  current_target_so_ops = &svr4_so_ops;
1356
}

powered by: WebSVN 2.1.0

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