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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [syms.c] - Blame information for rev 1771

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

Line No. Rev Author Line
1 578 markom
/* Generic symbol-table support for the BFD library.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3
   2000
4
   Free Software Foundation, Inc.
5
   Written by Cygnus Support.
6
 
7
This file is part of BFD, the Binary File Descriptor library.
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 2 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, write to the Free Software
21
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
 
23
/*
24
SECTION
25
        Symbols
26
 
27
        BFD tries to maintain as much symbol information as it can when
28
        it moves information from file to file. BFD passes information
29
        to applications though the <<asymbol>> structure. When the
30
        application requests the symbol table, BFD reads the table in
31
        the native form and translates parts of it into the internal
32
        format. To maintain more than the information passed to
33
        applications, some targets keep some information ``behind the
34
        scenes'' in a structure only the particular back end knows
35
        about. For example, the coff back end keeps the original
36
        symbol table structure as well as the canonical structure when
37
        a BFD is read in. On output, the coff back end can reconstruct
38
        the output symbol table so that no information is lost, even
39
        information unique to coff which BFD doesn't know or
40
        understand. If a coff symbol table were read, but were written
41
        through an a.out back end, all the coff specific information
42
        would be lost. The symbol table of a BFD
43
        is not necessarily read in until a canonicalize request is
44
        made. Then the BFD back end fills in a table provided by the
45
        application with pointers to the canonical information.  To
46
        output symbols, the application provides BFD with a table of
47
        pointers to pointers to <<asymbol>>s. This allows applications
48
        like the linker to output a symbol as it was read, since the ``behind
49
        the scenes'' information will be still available.
50
@menu
51
@* Reading Symbols::
52
@* Writing Symbols::
53
@* Mini Symbols::
54
@* typedef asymbol::
55
@* symbol handling functions::
56
@end menu
57
 
58
INODE
59
Reading Symbols, Writing Symbols, Symbols, Symbols
60
SUBSECTION
61
        Reading symbols
62
 
63
        There are two stages to reading a symbol table from a BFD:
64
        allocating storage, and the actual reading process. This is an
65
        excerpt from an application which reads the symbol table:
66
 
67
|         long storage_needed;
68
|         asymbol **symbol_table;
69
|         long number_of_symbols;
70
|         long i;
71
|
72
|         storage_needed = bfd_get_symtab_upper_bound (abfd);
73
|
74
|         if (storage_needed < 0)
75
|           FAIL
76
|
77
|         if (storage_needed == 0) {
78
|            return ;
79
|         }
80
|         symbol_table = (asymbol **) xmalloc (storage_needed);
81
|           ...
82
|         number_of_symbols =
83
|            bfd_canonicalize_symtab (abfd, symbol_table);
84
|
85
|         if (number_of_symbols < 0)
86
|           FAIL
87
|
88
|         for (i = 0; i < number_of_symbols; i++) {
89
|            process_symbol (symbol_table[i]);
90
|         }
91
 
92
        All storage for the symbols themselves is in an objalloc
93
        connected to the BFD; it is freed when the BFD is closed.
94
 
95
INODE
96
Writing Symbols, Mini Symbols, Reading Symbols, Symbols
97
SUBSECTION
98
        Writing symbols
99
 
100
        Writing of a symbol table is automatic when a BFD open for
101
        writing is closed. The application attaches a vector of
102
        pointers to pointers to symbols to the BFD being written, and
103
        fills in the symbol count. The close and cleanup code reads
104
        through the table provided and performs all the necessary
105
        operations. The BFD output code must always be provided with an
106
        ``owned'' symbol: one which has come from another BFD, or one
107
        which has been created using <<bfd_make_empty_symbol>>.  Here is an
108
        example showing the creation of a symbol table with only one element:
109
 
110
|       #include "bfd.h"
111
|       main()
112
|       {
113
|         bfd *abfd;
114
|         asymbol *ptrs[2];
115
|         asymbol *new;
116
|
117
|         abfd = bfd_openw("foo","a.out-sunos-big");
118
|         bfd_set_format(abfd, bfd_object);
119
|         new = bfd_make_empty_symbol(abfd);
120
|         new->name = "dummy_symbol";
121
|         new->section = bfd_make_section_old_way(abfd, ".text");
122
|         new->flags = BSF_GLOBAL;
123
|         new->value = 0x12345;
124
|
125
|         ptrs[0] = new;
126
|         ptrs[1] = (asymbol *)0;
127
|
128
|         bfd_set_symtab(abfd, ptrs, 1);
129
|         bfd_close(abfd);
130
|       }
131
|
132
|       ./makesym
133
|       nm foo
134
|       00012345 A dummy_symbol
135
 
136
        Many formats cannot represent arbitary symbol information; for
137
        instance, the <<a.out>> object format does not allow an
138
        arbitary number of sections. A symbol pointing to a section
139
        which is not one  of <<.text>>, <<.data>> or <<.bss>> cannot
140
        be described.
141
 
142
INODE
143
Mini Symbols, typedef asymbol, Writing Symbols, Symbols
144
SUBSECTION
145
        Mini Symbols
146
 
147
        Mini symbols provide read-only access to the symbol table.
148
        They use less memory space, but require more time to access.
149
        They can be useful for tools like nm or objdump, which may
150
        have to handle symbol tables of extremely large executables.
151
 
152
        The <<bfd_read_minisymbols>> function will read the symbols
153
        into memory in an internal form.  It will return a <<void *>>
154
        pointer to a block of memory, a symbol count, and the size of
155
        each symbol.  The pointer is allocated using <<malloc>>, and
156
        should be freed by the caller when it is no longer needed.
157
 
158
        The function <<bfd_minisymbol_to_symbol>> will take a pointer
159
        to a minisymbol, and a pointer to a structure returned by
160
        <<bfd_make_empty_symbol>>, and return a <<asymbol>> structure.
161
        The return value may or may not be the same as the value from
162
        <<bfd_make_empty_symbol>> which was passed in.
163
 
164
*/
165
 
166
/*
167
DOCDD
168
INODE
169
typedef asymbol, symbol handling functions, Mini Symbols, Symbols
170
 
171
*/
172
/*
173
SUBSECTION
174
        typedef asymbol
175
 
176
        An <<asymbol>> has the form:
177
 
178
*/
179
 
180
/*
181
CODE_FRAGMENT
182
 
183
.
184
.typedef struct symbol_cache_entry
185
.{
186
.       {* A pointer to the BFD which owns the symbol. This information
187
.          is necessary so that a back end can work out what additional
188
.          information (invisible to the application writer) is carried
189
.          with the symbol.
190
.
191
.          This field is *almost* redundant, since you can use section->owner
192
.          instead, except that some symbols point to the global sections
193
.          bfd_{abs,com,und}_section.  This could be fixed by making
194
.          these globals be per-bfd (or per-target-flavor).  FIXME. *}
195
.
196
.  struct _bfd *the_bfd; {* Use bfd_asymbol_bfd(sym) to access this field. *}
197
.
198
.       {* The text of the symbol. The name is left alone, and not copied; the
199
.          application may not alter it. *}
200
.  CONST char *name;
201
.
202
.       {* The value of the symbol.  This really should be a union of a
203
.          numeric value with a pointer, since some flags indicate that
204
.          a pointer to another symbol is stored here.  *}
205
.  symvalue value;
206
.
207
.       {* Attributes of a symbol: *}
208
.
209
.#define BSF_NO_FLAGS    0x00
210
.
211
.       {* The symbol has local scope; <<static>> in <<C>>. The value
212
.          is the offset into the section of the data. *}
213
.#define BSF_LOCAL      0x01
214
.
215
.       {* The symbol has global scope; initialized data in <<C>>. The
216
.          value is the offset into the section of the data. *}
217
.#define BSF_GLOBAL     0x02
218
.
219
.       {* The symbol has global scope and is exported. The value is
220
.          the offset into the section of the data. *}
221
.#define BSF_EXPORT     BSF_GLOBAL {* no real difference *}
222
.
223
.       {* A normal C symbol would be one of:
224
.          <<BSF_LOCAL>>, <<BSF_FORT_COMM>>,  <<BSF_UNDEFINED>> or
225
.          <<BSF_GLOBAL>> *}
226
.
227
.       {* The symbol is a debugging record. The value has an arbitary
228
.          meaning, unless BSF_DEBUGGING_RELOC is also set.  *}
229
.#define BSF_DEBUGGING  0x08
230
.
231
.       {* The symbol denotes a function entry point.  Used in ELF,
232
.          perhaps others someday.  *}
233
.#define BSF_FUNCTION    0x10
234
.
235
.       {* Used by the linker. *}
236
.#define BSF_KEEP        0x20
237
.#define BSF_KEEP_G      0x40
238
.
239
.       {* A weak global symbol, overridable without warnings by
240
.          a regular global symbol of the same name.  *}
241
.#define BSF_WEAK        0x80
242
.
243
.       {* This symbol was created to point to a section, e.g. ELF's
244
.          STT_SECTION symbols.  *}
245
.#define BSF_SECTION_SYM 0x100
246
.
247
.       {* The symbol used to be a common symbol, but now it is
248
.          allocated. *}
249
.#define BSF_OLD_COMMON  0x200
250
.
251
.       {* The default value for common data. *}
252
.#define BFD_FORT_COMM_DEFAULT_VALUE 0
253
.
254
.       {* In some files the type of a symbol sometimes alters its
255
.          location in an output file - ie in coff a <<ISFCN>> symbol
256
.          which is also <<C_EXT>> symbol appears where it was
257
.          declared and not at the end of a section.  This bit is set
258
.          by the target BFD part to convey this information. *}
259
.
260
.#define BSF_NOT_AT_END    0x400
261
.
262
.       {* Signal that the symbol is the label of constructor section. *}
263
.#define BSF_CONSTRUCTOR   0x800
264
.
265
.       {* Signal that the symbol is a warning symbol.  The name is a
266
.          warning.  The name of the next symbol is the one to warn about;
267
.          if a reference is made to a symbol with the same name as the next
268
.          symbol, a warning is issued by the linker. *}
269
.#define BSF_WARNING       0x1000
270
.
271
.       {* Signal that the symbol is indirect.  This symbol is an indirect
272
.          pointer to the symbol with the same name as the next symbol. *}
273
.#define BSF_INDIRECT      0x2000
274
.
275
.       {* BSF_FILE marks symbols that contain a file name.  This is used
276
.          for ELF STT_FILE symbols.  *}
277
.#define BSF_FILE          0x4000
278
.
279
.       {* Symbol is from dynamic linking information.  *}
280
.#define BSF_DYNAMIC       0x8000
281
.
282
.       {* The symbol denotes a data object.  Used in ELF, and perhaps
283
.          others someday.  *}
284
.#define BSF_OBJECT        0x10000
285
.
286
.       {* This symbol is a debugging symbol.  The value is the offset
287
.          into the section of the data.  BSF_DEBUGGING should be set
288
.          as well.  *}
289
.#define BSF_DEBUGGING_RELOC 0x20000
290
.
291
.  flagword flags;
292
.
293
.       {* A pointer to the section to which this symbol is
294
.          relative.  This will always be non NULL, there are special
295
.          sections for undefined and absolute symbols.  *}
296
.  struct sec *section;
297
.
298
.       {* Back end special data.  *}
299
.  union
300
.    {
301
.      PTR p;
302
.      bfd_vma i;
303
.    } udata;
304
.
305
.} asymbol;
306
*/
307
 
308
#include "bfd.h"
309
#include "sysdep.h"
310
#include "libbfd.h"
311
#include "bfdlink.h"
312
#include "aout/stab_gnu.h"
313
 
314
static char coff_section_type PARAMS ((const char *));
315
 
316
/*
317
DOCDD
318
INODE
319
symbol handling functions,  , typedef asymbol, Symbols
320
SUBSECTION
321
        Symbol handling functions
322
*/
323
 
324
/*
325
FUNCTION
326
        bfd_get_symtab_upper_bound
327
 
328
DESCRIPTION
329
        Return the number of bytes required to store a vector of pointers
330
        to <<asymbols>> for all the symbols in the BFD @var{abfd},
331
        including a terminal NULL pointer. If there are no symbols in
332
        the BFD, then return 0.  If an error occurs, return -1.
333
 
334
.#define bfd_get_symtab_upper_bound(abfd) \
335
.     BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd))
336
 
337
*/
338
 
339
/*
340
FUNCTION
341
        bfd_is_local_label
342
 
343
SYNOPSIS
344
        boolean bfd_is_local_label(bfd *abfd, asymbol *sym);
345
 
346
DESCRIPTION
347
        Return true if the given symbol @var{sym} in the BFD @var{abfd} is
348
        a compiler generated local label, else return false.
349
*/
350
 
351
boolean
352
bfd_is_local_label (abfd, sym)
353
     bfd *abfd;
354
     asymbol *sym;
355
{
356
  /* The BSF_SECTION_SYM check is needed for IA-64, where every label that
357
     starts with '.' is local.  This would accidentally catch section names
358
     if we didn't reject them here.  */
359
  if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_SECTION_SYM)) != 0)
360
    return false;
361
  if (sym->name == NULL)
362
    return false;
363
  return bfd_is_local_label_name (abfd, sym->name);
364
}
365
 
366
/*
367
FUNCTION
368
        bfd_is_local_label_name
369
 
370
SYNOPSIS
371
        boolean bfd_is_local_label_name(bfd *abfd, const char *name);
372
 
373
DESCRIPTION
374
        Return true if a symbol with the name @var{name} in the BFD
375
        @var{abfd} is a compiler generated local label, else return
376
        false.  This just checks whether the name has the form of a
377
        local label.
378
 
379
.#define bfd_is_local_label_name(abfd, name) \
380
.     BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name))
381
*/
382
 
383
/*
384
FUNCTION
385
        bfd_canonicalize_symtab
386
 
387
DESCRIPTION
388
        Read the symbols from the BFD @var{abfd}, and fills in
389
        the vector @var{location} with pointers to the symbols and
390
        a trailing NULL.
391
        Return the actual number of symbol pointers, not
392
        including the NULL.
393
 
394
.#define bfd_canonicalize_symtab(abfd, location) \
395
.     BFD_SEND (abfd, _bfd_canonicalize_symtab,\
396
.                  (abfd, location))
397
 
398
*/
399
 
400
/*
401
FUNCTION
402
        bfd_set_symtab
403
 
404
SYNOPSIS
405
        boolean bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int count);
406
 
407
DESCRIPTION
408
        Arrange that when the output BFD @var{abfd} is closed,
409
        the table @var{location} of @var{count} pointers to symbols
410
        will be written.
411
*/
412
 
413
boolean
414
bfd_set_symtab (abfd, location, symcount)
415
     bfd *abfd;
416
     asymbol **location;
417
     unsigned int symcount;
418
{
419
  if ((abfd->format != bfd_object) || (bfd_read_p (abfd)))
420
    {
421
      bfd_set_error (bfd_error_invalid_operation);
422
      return false;
423
    }
424
 
425
  bfd_get_outsymbols (abfd) = location;
426
  bfd_get_symcount (abfd) = symcount;
427
  return true;
428
}
429
 
430
/*
431
FUNCTION
432
        bfd_print_symbol_vandf
433
 
434
SYNOPSIS
435
        void bfd_print_symbol_vandf(PTR file, asymbol *symbol);
436
 
437
DESCRIPTION
438
        Print the value and flags of the @var{symbol} supplied to the
439
        stream @var{file}.
440
*/
441
void
442
bfd_print_symbol_vandf (arg, symbol)
443
     PTR arg;
444
     asymbol *symbol;
445
{
446
  FILE *file = (FILE *) arg;
447
  flagword type = symbol->flags;
448
  if (symbol->section != (asection *) NULL)
449
    {
450
      fprintf_vma (file, symbol->value + symbol->section->vma);
451
    }
452
  else
453
    {
454
      fprintf_vma (file, symbol->value);
455
    }
456
 
457
  /* This presumes that a symbol can not be both BSF_DEBUGGING and
458
     BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and
459
     BSF_OBJECT.  */
460
  fprintf (file, " %c%c%c%c%c%c%c",
461
           ((type & BSF_LOCAL)
462
            ? (type & BSF_GLOBAL) ? '!' : 'l'
463
            : (type & BSF_GLOBAL) ? 'g' : ' '),
464
           (type & BSF_WEAK) ? 'w' : ' ',
465
           (type & BSF_CONSTRUCTOR) ? 'C' : ' ',
466
           (type & BSF_WARNING) ? 'W' : ' ',
467
           (type & BSF_INDIRECT) ? 'I' : ' ',
468
           (type & BSF_DEBUGGING) ? 'd' : (type & BSF_DYNAMIC) ? 'D' : ' ',
469
           ((type & BSF_FUNCTION)
470
            ? 'F'
471
            : ((type & BSF_FILE)
472
               ? 'f'
473
               : ((type & BSF_OBJECT) ? 'O' : ' '))));
474
}
475
 
476
/*
477
FUNCTION
478
        bfd_make_empty_symbol
479
 
480
DESCRIPTION
481
        Create a new <<asymbol>> structure for the BFD @var{abfd}
482
        and return a pointer to it.
483
 
484
        This routine is necessary because each back end has private
485
        information surrounding the <<asymbol>>. Building your own
486
        <<asymbol>> and pointing to it will not create the private
487
        information, and will cause problems later on.
488
 
489
.#define bfd_make_empty_symbol(abfd) \
490
.     BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd))
491
*/
492
 
493
/*
494
FUNCTION
495
        bfd_make_debug_symbol
496
 
497
DESCRIPTION
498
        Create a new <<asymbol>> structure for the BFD @var{abfd},
499
        to be used as a debugging symbol.  Further details of its use have
500
        yet to be worked out.
501
 
502
.#define bfd_make_debug_symbol(abfd,ptr,size) \
503
.        BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size))
504
*/
505
 
506
struct section_to_type
507
{
508
  CONST char *section;
509
  char type;
510
};
511
 
512
/* Map section names to POSIX/BSD single-character symbol types.
513
   This table is probably incomplete.  It is sorted for convenience of
514
   adding entries.  Since it is so short, a linear search is used.  */
515
static CONST struct section_to_type stt[] =
516
{
517
  {"*DEBUG*", 'N'},
518
  {".bss", 'b'},
519
  {"zerovars", 'b'},            /* MRI .bss */
520
  {".data", 'd'},
521
  {"vars", 'd'},                /* MRI .data */
522
  {".rdata", 'r'},              /* Read only data.  */
523
  {".rodata", 'r'},             /* Read only data.  */
524
  {".sbss", 's'},               /* Small BSS (uninitialized data).  */
525
  {".scommon", 'c'},            /* Small common.  */
526
  {".sdata", 'g'},              /* Small initialized data.  */
527
  {".text", 't'},
528
  {"code", 't'},                /* MRI .text */
529
  {".drectve", 'i'},            /* MSVC's .drective section */
530
  {".idata", 'i'},              /* MSVC's .idata (import) section */
531
  {".edata", 'e'},              /* MSVC's .edata (export) section */
532
  {".pdata", 'p'},              /* MSVC's .pdata (stack unwind) section */
533
  {".debug", 'N'},              /* MSVC's .debug (non-standard debug syms) */
534
  {0, 0}
535
};
536
 
537
/* Return the single-character symbol type corresponding to
538
   section S, or '?' for an unknown COFF section.
539
 
540
   Check for any leading string which matches, so .text5 returns
541
   't' as well as .text */
542
 
543
static char
544
coff_section_type (s)
545
     const char *s;
546
{
547
  CONST struct section_to_type *t;
548
 
549
  for (t = &stt[0]; t->section; t++)
550
    if (!strncmp (s, t->section, strlen (t->section)))
551
      return t->type;
552
 
553
  return '?';
554
}
555
 
556
#ifndef islower
557
#define islower(c) ((c) >= 'a' && (c) <= 'z')
558
#endif
559
#ifndef toupper
560
#define toupper(c) (islower(c) ? ((c) & ~0x20) : (c))
561
#endif
562
 
563
/*
564
FUNCTION
565
        bfd_decode_symclass
566
 
567
DESCRIPTION
568
        Return a character corresponding to the symbol
569
        class of @var{symbol}, or '?' for an unknown class.
570
 
571
SYNOPSIS
572
        int bfd_decode_symclass(asymbol *symbol);
573
*/
574
int
575
bfd_decode_symclass (symbol)
576
     asymbol *symbol;
577
{
578
  char c;
579
 
580
  if (bfd_is_com_section (symbol->section))
581
    return 'C';
582
  if (bfd_is_und_section (symbol->section))
583
    {
584
      if (symbol->flags & BSF_WEAK)
585
        {
586
          /* If weak, determine if it's specifically an object
587
             or non-object weak.  */
588
          if (symbol->flags & BSF_OBJECT)
589
            return 'v';
590
          else
591
            return 'w';
592
        }
593
      else
594
        return 'U';
595
    }
596
  if (bfd_is_ind_section (symbol->section))
597
    return 'I';
598
  if (symbol->flags & BSF_WEAK)
599
    {
600
      /* If weak, determine if it's specifically an object
601
         or non-object weak.  */
602
      if (symbol->flags & BSF_OBJECT)
603
        return 'V';
604
      else
605
        return 'W';
606
    }
607
  if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
608
    return '?';
609
 
610
  if (bfd_is_abs_section (symbol->section))
611
    c = 'a';
612
  else if (symbol->section)
613
    c = coff_section_type (symbol->section->name);
614
  else
615
    return '?';
616
  if (symbol->flags & BSF_GLOBAL)
617
    c = toupper (c);
618
  return c;
619
 
620
  /* We don't have to handle these cases just yet, but we will soon:
621
     N_SETV: 'v';
622
     N_SETA: 'l';
623
     N_SETT: 'x';
624
     N_SETD: 'z';
625
     N_SETB: 's';
626
     N_INDR: 'i';
627
     */
628
}
629
 
630
/*
631
FUNCTION
632
        bfd_is_undefined_symclass
633
 
634
DESCRIPTION
635
        Returns non-zero if the class symbol returned by
636
        bfd_decode_symclass represents an undefined symbol.
637
        Returns zero otherwise.
638
 
639
SYNOPSIS
640
        boolean bfd_is_undefined_symclass (int symclass);
641
*/
642
 
643
boolean
644
bfd_is_undefined_symclass (symclass)
645
     int symclass;
646
{
647
  return symclass == 'U' || symclass == 'w' || symclass == 'v';
648
}
649
 
650
/*
651
FUNCTION
652
        bfd_symbol_info
653
 
654
DESCRIPTION
655
        Fill in the basic info about symbol that nm needs.
656
        Additional info may be added by the back-ends after
657
        calling this function.
658
 
659
SYNOPSIS
660
        void bfd_symbol_info(asymbol *symbol, symbol_info *ret);
661
*/
662
 
663
void
664
bfd_symbol_info (symbol, ret)
665
     asymbol *symbol;
666
     symbol_info *ret;
667
{
668
  ret->type = bfd_decode_symclass (symbol);
669
 
670
  if (bfd_is_undefined_symclass (ret->type))
671
    ret->value = 0;
672
  else
673
    ret->value = symbol->value + symbol->section->vma;
674
 
675
  ret->name = symbol->name;
676
}
677
 
678
/*
679
FUNCTION
680
        bfd_copy_private_symbol_data
681
 
682
SYNOPSIS
683
        boolean bfd_copy_private_symbol_data(bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
684
 
685
DESCRIPTION
686
        Copy private symbol information from @var{isym} in the BFD
687
        @var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}.
688
        Return <<true>> on success, <<false>> on error.  Possible error
689
        returns are:
690
 
691
        o <<bfd_error_no_memory>> -
692
        Not enough memory exists to create private data for @var{osec}.
693
 
694
.#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \
695
.     BFD_SEND (obfd, _bfd_copy_private_symbol_data, \
696
.               (ibfd, isymbol, obfd, osymbol))
697
 
698
*/
699
 
700
/* The generic version of the function which returns mini symbols.
701
   This is used when the backend does not provide a more efficient
702
   version.  It just uses BFD asymbol structures as mini symbols.  */
703
 
704
long
705
_bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep)
706
     bfd *abfd;
707
     boolean dynamic;
708
     PTR *minisymsp;
709
     unsigned int *sizep;
710
{
711
  long storage;
712
  asymbol **syms = NULL;
713
  long symcount;
714
 
715
  if (dynamic)
716
    storage = bfd_get_dynamic_symtab_upper_bound (abfd);
717
  else
718
    storage = bfd_get_symtab_upper_bound (abfd);
719
  if (storage < 0)
720
    goto error_return;
721
 
722
  syms = (asymbol **) bfd_malloc ((size_t) storage);
723
  if (syms == NULL)
724
    goto error_return;
725
 
726
  if (dynamic)
727
    symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
728
  else
729
    symcount = bfd_canonicalize_symtab (abfd, syms);
730
  if (symcount < 0)
731
    goto error_return;
732
 
733
  *minisymsp = (PTR) syms;
734
  *sizep = sizeof (asymbol *);
735
  return symcount;
736
 
737
 error_return:
738
  if (syms != NULL)
739
    free (syms);
740
  return -1;
741
}
742
 
743
/* The generic version of the function which converts a minisymbol to
744
   an asymbol.  We don't worry about the sym argument we are passed;
745
   we just return the asymbol the minisymbol points to.  */
746
 
747
/*ARGSUSED*/
748
asymbol *
749
_bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym)
750
     bfd *abfd ATTRIBUTE_UNUSED;
751
     boolean dynamic ATTRIBUTE_UNUSED;
752
     const PTR minisym;
753
     asymbol *sym ATTRIBUTE_UNUSED;
754
{
755
  return *(asymbol **) minisym;
756
}
757
 
758
/* Look through stabs debugging information in .stab and .stabstr
759
   sections to find the source file and line closest to a desired
760
   location.  This is used by COFF and ELF targets.  It sets *pfound
761
   to true if it finds some information.  The *pinfo field is used to
762
   pass cached information in and out of this routine; this first time
763
   the routine is called for a BFD, *pinfo should be NULL.  The value
764
   placed in *pinfo should be saved with the BFD, and passed back each
765
   time this function is called.  */
766
 
767
/* We use a cache by default.  */
768
 
769
#define ENABLE_CACHING
770
 
771
/* We keep an array of indexentry structures to record where in the
772
   stabs section we should look to find line number information for a
773
   particular address.  */
774
 
775
struct indexentry
776
{
777
  bfd_vma val;
778
  bfd_byte *stab;
779
  bfd_byte *str;
780
  char *directory_name;
781
  char *file_name;
782
  char *function_name;
783
};
784
 
785
/* Compare two indexentry structures.  This is called via qsort.  */
786
 
787
static int
788
cmpindexentry (a, b)
789
     const PTR a;
790
     const PTR b;
791
{
792
  const struct indexentry *contestantA = (const struct indexentry *) a;
793
  const struct indexentry *contestantB = (const struct indexentry *) b;
794
 
795
  if (contestantA->val < contestantB->val)
796
    return -1;
797
  else if (contestantA->val > contestantB->val)
798
    return 1;
799
  else
800
    return 0;
801
}
802
 
803
/* A pointer to this structure is stored in *pinfo.  */
804
 
805
struct stab_find_info
806
{
807
  /* The .stab section.  */
808
  asection *stabsec;
809
  /* The .stabstr section.  */
810
  asection *strsec;
811
  /* The contents of the .stab section.  */
812
  bfd_byte *stabs;
813
  /* The contents of the .stabstr section.  */
814
  bfd_byte *strs;
815
 
816
  /* A table that indexes stabs by memory address.  */
817
  struct indexentry *indextable;
818
  /* The number of entries in indextable.  */
819
  int indextablesize;
820
 
821
#ifdef ENABLE_CACHING
822
  /* Cached values to restart quickly.  */
823
  struct indexentry *cached_indexentry;
824
  bfd_vma cached_offset;
825
  bfd_byte *cached_stab;
826
  char *cached_file_name;
827
#endif
828
 
829
  /* Saved ptr to malloc'ed filename.  */
830
  char *filename;
831
};
832
 
833
boolean
834
_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound,
835
                                     pfilename, pfnname, pline, pinfo)
836
     bfd *abfd;
837
     asymbol **symbols;
838
     asection *section;
839
     bfd_vma offset;
840
     boolean *pfound;
841
     const char **pfilename;
842
     const char **pfnname;
843
     unsigned int *pline;
844
     PTR *pinfo;
845
{
846
  struct stab_find_info *info;
847
  bfd_size_type stabsize, strsize;
848
  bfd_byte *stab, *str;
849
  bfd_byte *last_stab = NULL;
850
  bfd_size_type stroff;
851
  struct indexentry *indexentry;
852
  char *directory_name, *file_name;
853
  int saw_fun;
854
 
855
  *pfound = false;
856
  *pfilename = bfd_get_filename (abfd);
857
  *pfnname = NULL;
858
  *pline = 0;
859
 
860
  /* Stabs entries use a 12 byte format:
861
       4 byte string table index
862
       1 byte stab type
863
       1 byte stab other field
864
       2 byte stab desc field
865
       4 byte stab value
866
     FIXME: This will have to change for a 64 bit object format.
867
 
868
     The stabs symbols are divided into compilation units.  For the
869
     first entry in each unit, the type of 0, the value is the length
870
     of the string table for this unit, and the desc field is the
871
     number of stabs symbols for this unit.  */
872
 
873
#define STRDXOFF (0)
874
#define TYPEOFF (4)
875
#define OTHEROFF (5)
876
#define DESCOFF (6)
877
#define VALOFF (8)
878
#define STABSIZE (12)
879
 
880
  info = (struct stab_find_info *) *pinfo;
881
  if (info != NULL)
882
    {
883
      if (info->stabsec == NULL || info->strsec == NULL)
884
        {
885
          /* No stabs debugging information.  */
886
          return true;
887
        }
888
 
889
      stabsize = info->stabsec->_raw_size;
890
      strsize = info->strsec->_raw_size;
891
    }
892
  else
893
    {
894
      long reloc_size, reloc_count;
895
      arelent **reloc_vector;
896
      int i;
897
      char *name;
898
      char *file_name;
899
      char *directory_name;
900
      char *function_name;
901
 
902
      info = (struct stab_find_info *) bfd_zalloc (abfd, sizeof *info);
903
      if (info == NULL)
904
        return false;
905
 
906
      /* FIXME: When using the linker --split-by-file or
907
         --split-by-reloc options, it is possible for the .stab and
908
         .stabstr sections to be split.  We should handle that.  */
909
 
910
      info->stabsec = bfd_get_section_by_name (abfd, ".stab");
911
      info->strsec = bfd_get_section_by_name (abfd, ".stabstr");
912
 
913
      if (info->stabsec == NULL || info->strsec == NULL)
914
        {
915
          /* No stabs debugging information.  Set *pinfo so that we
916
             can return quickly in the info != NULL case above.  */
917
          *pinfo = (PTR) info;
918
          return true;
919
        }
920
 
921
      stabsize = info->stabsec->_raw_size;
922
      strsize = info->strsec->_raw_size;
923
 
924
      info->stabs = (bfd_byte *) bfd_alloc (abfd, stabsize);
925
      info->strs = (bfd_byte *) bfd_alloc (abfd, strsize);
926
      if (info->stabs == NULL || info->strs == NULL)
927
        return false;
928
 
929
      if (! bfd_get_section_contents (abfd, info->stabsec, info->stabs, 0,
930
                                      stabsize)
931
          || ! bfd_get_section_contents (abfd, info->strsec, info->strs, 0,
932
                                         strsize))
933
        return false;
934
 
935
      /* If this is a relocateable object file, we have to relocate
936
         the entries in .stab.  This should always be simple 32 bit
937
         relocations against symbols defined in this object file, so
938
         this should be no big deal.  */
939
      reloc_size = bfd_get_reloc_upper_bound (abfd, info->stabsec);
940
      if (reloc_size < 0)
941
        return false;
942
      reloc_vector = (arelent **) bfd_malloc (reloc_size);
943
      if (reloc_vector == NULL && reloc_size != 0)
944
        return false;
945
      reloc_count = bfd_canonicalize_reloc (abfd, info->stabsec, reloc_vector,
946
                                            symbols);
947
      if (reloc_count < 0)
948
        {
949
          if (reloc_vector != NULL)
950
            free (reloc_vector);
951
          return false;
952
        }
953
      if (reloc_count > 0)
954
        {
955
          arelent **pr;
956
 
957
          for (pr = reloc_vector; *pr != NULL; pr++)
958
            {
959
              arelent *r;
960
              unsigned long val;
961
              asymbol *sym;
962
 
963
              r = *pr;
964
              if (r->howto->rightshift != 0
965
                  || r->howto->size != 2
966
                  || r->howto->bitsize != 32
967
                  || r->howto->pc_relative
968
                  || r->howto->bitpos != 0
969
                  || r->howto->dst_mask != 0xffffffff)
970
                {
971
                  (*_bfd_error_handler)
972
                    (_("Unsupported .stab relocation"));
973
                  bfd_set_error (bfd_error_invalid_operation);
974
                  if (reloc_vector != NULL)
975
                    free (reloc_vector);
976
                  return false;
977
                }
978
 
979
              val = bfd_get_32 (abfd, info->stabs + r->address);
980
              val &= r->howto->src_mask;
981
              sym = *r->sym_ptr_ptr;
982
              val += sym->value + sym->section->vma + r->addend;
983
              bfd_put_32 (abfd, val, info->stabs + r->address);
984
            }
985
        }
986
 
987
      if (reloc_vector != NULL)
988
        free (reloc_vector);
989
 
990
      /* First time through this function, build a table matching
991
         function VM addresses to stabs, then sort based on starting
992
         VM address.  Do this in two passes: once to count how many
993
         table entries we'll need, and a second to actually build the
994
         table.  */
995
 
996
      info->indextablesize = 0;
997
      saw_fun = 1;
998
      for (stab = info->stabs; stab < info->stabs + stabsize; stab += STABSIZE)
999
        {
1000
          if (stab[TYPEOFF] == N_SO)
1001
            {
1002
              /* N_SO with null name indicates EOF */
1003
              if (bfd_get_32 (abfd, stab + STRDXOFF) == 0)
1004
                continue;
1005
 
1006
              /* if we did not see a function def, leave space for one.  */
1007
              if (saw_fun == 0)
1008
                ++info->indextablesize;
1009
 
1010
              saw_fun = 0;
1011
 
1012
              /* two N_SO's in a row is a filename and directory. Skip */
1013
              if (stab + STABSIZE < info->stabs + stabsize
1014
                  && *(stab + STABSIZE + TYPEOFF) == N_SO)
1015
                {
1016
                  stab += STABSIZE;
1017
                }
1018
            }
1019
          else if (stab[TYPEOFF] == N_FUN)
1020
            {
1021
              saw_fun = 1;
1022
              ++info->indextablesize;
1023
            }
1024
        }
1025
 
1026
      if (saw_fun == 0)
1027
        ++info->indextablesize;
1028
 
1029
      if (info->indextablesize == 0)
1030
        return true;
1031
      ++info->indextablesize;
1032
 
1033
      info->indextable = ((struct indexentry *)
1034
                          bfd_alloc (abfd,
1035
                                     (sizeof (struct indexentry)
1036
                                      * info->indextablesize)));
1037
      if (info->indextable == NULL)
1038
        return false;
1039
 
1040
      file_name = NULL;
1041
      directory_name = NULL;
1042
      saw_fun = 1;
1043
 
1044
      for (i = 0, stroff = 0, stab = info->stabs, str = info->strs;
1045
           i < info->indextablesize && stab < info->stabs + stabsize;
1046
           stab += STABSIZE)
1047
        {
1048
          switch (stab[TYPEOFF])
1049
            {
1050
            case 0:
1051
              /* This is the first entry in a compilation unit.  */
1052
              if ((bfd_size_type) ((info->strs + strsize) - str) < stroff)
1053
                break;
1054
              str += stroff;
1055
              stroff = bfd_get_32 (abfd, stab + VALOFF);
1056
              break;
1057
 
1058
            case N_SO:
1059
              /* The main file name.  */
1060
 
1061
              /* The following code creates a new indextable entry with
1062
                 a NULL function name if there were no N_FUNs in a file.
1063
                 Note that a N_SO without a file name is an EOF and
1064
                 there could be 2 N_SO following it with the new filename
1065
                 and directory.  */
1066
              if (saw_fun == 0)
1067
                {
1068
                  info->indextable[i].val = bfd_get_32 (abfd, last_stab + VALOFF);
1069
                  info->indextable[i].stab = last_stab;
1070
                  info->indextable[i].str = str;
1071
                  info->indextable[i].directory_name = directory_name;
1072
                  info->indextable[i].file_name = file_name;
1073
                  info->indextable[i].function_name = NULL;
1074
                  ++i;
1075
                }
1076
              saw_fun = 0;
1077
 
1078
              file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1079
              if (*file_name == '\0')
1080
                {
1081
                  directory_name = NULL;
1082
                  file_name = NULL;
1083
                  saw_fun = 1;
1084
                }
1085
              else
1086
                {
1087
                  last_stab = stab;
1088
                  if (stab + STABSIZE >= info->stabs + stabsize
1089
                      || *(stab + STABSIZE + TYPEOFF) != N_SO)
1090
                    {
1091
                      directory_name = NULL;
1092
                    }
1093
                  else
1094
                    {
1095
                      /* Two consecutive N_SOs are a directory and a
1096
                         file name.  */
1097
                      stab += STABSIZE;
1098
                      directory_name = file_name;
1099
                      file_name = ((char *) str
1100
                                   + bfd_get_32 (abfd, stab + STRDXOFF));
1101
                    }
1102
                }
1103
              break;
1104
 
1105
            case N_SOL:
1106
              /* The name of an include file.  */
1107
              file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1108
              break;
1109
 
1110
            case N_FUN:
1111
              /* A function name.  */
1112
              saw_fun = 1;
1113
              name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1114
 
1115
              if (*name == '\0')
1116
                name = NULL;
1117
 
1118
              function_name = name;
1119
 
1120
              if (name == NULL)
1121
                continue;
1122
 
1123
              info->indextable[i].val = bfd_get_32 (abfd, stab + VALOFF);
1124
              info->indextable[i].stab = stab;
1125
              info->indextable[i].str = str;
1126
              info->indextable[i].directory_name = directory_name;
1127
              info->indextable[i].file_name = file_name;
1128
              info->indextable[i].function_name = function_name;
1129
              ++i;
1130
              break;
1131
            }
1132
        }
1133
 
1134
      if (saw_fun == 0)
1135
        {
1136
          info->indextable[i].val = bfd_get_32 (abfd, last_stab + VALOFF);
1137
          info->indextable[i].stab = last_stab;
1138
          info->indextable[i].str = str;
1139
          info->indextable[i].directory_name = directory_name;
1140
          info->indextable[i].file_name = file_name;
1141
          info->indextable[i].function_name = NULL;
1142
          ++i;
1143
        }
1144
 
1145
      info->indextable[i].val = (bfd_vma) -1;
1146
      info->indextable[i].stab = info->stabs + stabsize;
1147
      info->indextable[i].str = str;
1148
      info->indextable[i].directory_name = NULL;
1149
      info->indextable[i].file_name = NULL;
1150
      info->indextable[i].function_name = NULL;
1151
      ++i;
1152
 
1153
      info->indextablesize = i;
1154
      qsort (info->indextable, i, sizeof (struct indexentry), cmpindexentry);
1155
 
1156
      *pinfo = (PTR) info;
1157
    }
1158
 
1159
  /* We are passed a section relative offset.  The offsets in the
1160
     stabs information are absolute.  */
1161
  offset += bfd_get_section_vma (abfd, section);
1162
 
1163
#ifdef ENABLE_CACHING
1164
  if (info->cached_indexentry != NULL
1165
      && offset >= info->cached_offset
1166
      && offset < (info->cached_indexentry + 1)->val)
1167
    {
1168
      stab = info->cached_stab;
1169
      indexentry = info->cached_indexentry;
1170
      file_name = info->cached_file_name;
1171
    }
1172
  else
1173
#endif
1174
    {
1175
      /* Cache non-existant or invalid.  Do binary search on
1176
         indextable.  */
1177
 
1178
      long low, high;
1179
      long mid = -1;
1180
 
1181
      indexentry = NULL;
1182
 
1183
      low = 0;
1184
      high = info->indextablesize - 1;
1185
      while (low != high)
1186
        {
1187
          mid = (high + low) / 2;
1188
          if (offset >= info->indextable[mid].val
1189
              && offset < info->indextable[mid + 1].val)
1190
            {
1191
              indexentry = &info->indextable[mid];
1192
              break;
1193
            }
1194
 
1195
          if (info->indextable[mid].val > offset)
1196
            high = mid;
1197
          else
1198
            low = mid + 1;
1199
        }
1200
 
1201
      if (indexentry == NULL)
1202
        return true;
1203
 
1204
      stab = indexentry->stab + STABSIZE;
1205
      file_name = indexentry->file_name;
1206
    }
1207
 
1208
  directory_name = indexentry->directory_name;
1209
  str = indexentry->str;
1210
 
1211
  for (; stab < (indexentry+1)->stab; stab += STABSIZE)
1212
    {
1213
      boolean done;
1214
      bfd_vma val;
1215
 
1216
      done = false;
1217
 
1218
      switch (stab[TYPEOFF])
1219
        {
1220
        case N_SOL:
1221
          /* The name of an include file.  */
1222
          val = bfd_get_32 (abfd, stab + VALOFF);
1223
          if (val <= offset)
1224
            {
1225
              file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1226
              *pline = 0;
1227
            }
1228
          break;
1229
 
1230
        case N_SLINE:
1231
        case N_DSLINE:
1232
        case N_BSLINE:
1233
          /* A line number.  The value is relative to the start of the
1234
             current function.  */
1235
          val = indexentry->val + bfd_get_32 (abfd, stab + VALOFF);
1236
          if (val <= offset)
1237
            {
1238
              *pline = bfd_get_16 (abfd, stab + DESCOFF);
1239
 
1240
#ifdef ENABLE_CACHING
1241
              info->cached_stab = stab;
1242
              info->cached_offset = val;
1243
              info->cached_file_name = file_name;
1244
              info->cached_indexentry = indexentry;
1245
#endif
1246
            }
1247
          if (val > offset)
1248
            done = true;
1249
          break;
1250
 
1251
        case N_FUN:
1252
        case N_SO:
1253
          done = true;
1254
          break;
1255
        }
1256
 
1257
      if (done)
1258
        break;
1259
    }
1260
 
1261
  *pfound = true;
1262
 
1263
  if (IS_ABSOLUTE_PATH(file_name) || directory_name == NULL)
1264
    *pfilename = file_name;
1265
  else
1266
    {
1267
      size_t dirlen;
1268
 
1269
      dirlen = strlen (directory_name);
1270
      if (info->filename == NULL
1271
          || strncmp (info->filename, directory_name, dirlen) != 0
1272
          || strcmp (info->filename + dirlen, file_name) != 0)
1273
        {
1274
          if (info->filename != NULL)
1275
            free (info->filename);
1276
          info->filename = (char *) bfd_malloc (dirlen +
1277
                                                strlen (file_name)
1278
                                                + 1);
1279
          if (info->filename == NULL)
1280
            return false;
1281
          strcpy (info->filename, directory_name);
1282
          strcpy (info->filename + dirlen, file_name);
1283
        }
1284
 
1285
      *pfilename = info->filename;
1286
    }
1287
 
1288
  if (indexentry->function_name != NULL)
1289
    {
1290
      char *s;
1291
 
1292
      /* This will typically be something like main:F(0,1), so we want
1293
         to clobber the colon.  It's OK to change the name, since the
1294
         string is in our own local storage anyhow.  */
1295
 
1296
      s = strchr (indexentry->function_name, ':');
1297
      if (s != NULL)
1298
        *s = '\0';
1299
 
1300
      *pfnname = indexentry->function_name;
1301
    }
1302
 
1303
  return true;
1304
}

powered by: WebSVN 2.1.0

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