Coverage Report

Created: 2025-07-08 11:15

/src/binutils-gdb/bfd/syms.c
Line
Count
Source (jump to first uncovered line)
1
/* Generic symbol-table support for the BFD library.
2
   Copyright (C) 1990-2025 Free Software Foundation, Inc.
3
   Written by Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
/*
23
SECTION
24
  Symbols
25
26
  BFD tries to maintain as much symbol information as it can when
27
  it moves information from file to file. BFD passes information
28
  to applications though the <<asymbol>> structure. When the
29
  application requests the symbol table, BFD reads the table in
30
  the native form and translates parts of it into the internal
31
  format. To maintain more than the information passed to
32
  applications, some targets keep some information ``behind the
33
  scenes'' in a structure only the particular back end knows
34
  about. For example, the coff back end keeps the original
35
  symbol table structure as well as the canonical structure when
36
  a BFD is read in. On output, the coff back end can reconstruct
37
  the output symbol table so that no information is lost, even
38
  information unique to coff which BFD doesn't know or
39
  understand. If a coff symbol table were read, but were written
40
  through an a.out back end, all the coff specific information
41
  would be lost. The symbol table of a BFD
42
  is not necessarily read in until a canonicalize request is
43
  made. Then the BFD back end fills in a table provided by the
44
  application with pointers to the canonical information.  To
45
  output symbols, the application provides BFD with a table of
46
  pointers to pointers to <<asymbol>>s. This allows applications
47
  like the linker to output a symbol as it was read, since the ``behind
48
  the scenes'' information will be still available.
49
@menu
50
@* Reading Symbols::
51
@* Writing Symbols::
52
@* Mini Symbols::
53
@* typedef asymbol::
54
@* symbol handling functions::
55
@end menu
56
57
INODE
58
Reading Symbols, Writing Symbols, Symbols, Symbols
59
SUBSECTION
60
  Reading symbols
61
62
  There are two stages to reading a symbol table from a BFD:
63
  allocating storage, and the actual reading process. This is an
64
  excerpt from an application which reads the symbol table:
65
66
|         long storage_needed;
67
|         asymbol **symbol_table;
68
|         long number_of_symbols;
69
|         long i;
70
|
71
|         storage_needed = bfd_get_symtab_upper_bound (abfd);
72
|
73
|         if (storage_needed < 0)
74
|           FAIL
75
|
76
|         if (storage_needed == 0)
77
|           return;
78
|
79
|         symbol_table = xmalloc (storage_needed);
80
|           ...
81
|         number_of_symbols =
82
|            bfd_canonicalize_symtab (abfd, symbol_table);
83
|
84
|         if (number_of_symbols < 0)
85
|           FAIL
86
|
87
|         for (i = 0; i < number_of_symbols; i++)
88
|           process_symbol (symbol_table[i]);
89
90
  All storage for the symbols themselves is in an objalloc
91
  connected to the BFD; it is freed when the BFD is closed.
92
93
INODE
94
Writing Symbols, Mini Symbols, Reading Symbols, Symbols
95
SUBSECTION
96
  Writing symbols
97
98
  Writing of a symbol table is automatic when a BFD open for
99
  writing is closed. The application attaches a vector of
100
  pointers to pointers to symbols to the BFD being written, and
101
  fills in the symbol count. The close and cleanup code reads
102
  through the table provided and performs all the necessary
103
  operations. The BFD output code must always be provided with an
104
  ``owned'' symbol: one which has come from another BFD, or one
105
  which has been created using <<bfd_make_empty_symbol>>.  Here is an
106
  example showing the creation of a symbol table with only one element:
107
108
|       #include "sysdep.h"
109
|       #include "bfd.h"
110
|       int main (void)
111
|       {
112
|         bfd *abfd;
113
|         asymbol *ptrs[2];
114
|         asymbol *new;
115
|
116
|         abfd = bfd_openw ("foo","a.out-sunos-big");
117
|         bfd_set_format (abfd, bfd_object);
118
|         new = bfd_make_empty_symbol (abfd);
119
|         new->name = "dummy_symbol";
120
|         new->section = bfd_make_section_old_way (abfd, ".text");
121
|         new->flags = BSF_GLOBAL;
122
|         new->value = 0x12345;
123
|
124
|         ptrs[0] = new;
125
|         ptrs[1] = 0;
126
|
127
|         bfd_set_symtab (abfd, ptrs, 1);
128
|         bfd_close (abfd);
129
|         return 0;
130
|       }
131
|
132
|       ./makesym
133
|       nm foo
134
|       00012345 A dummy_symbol
135
136
  Many formats cannot represent arbitrary symbol information; for
137
  instance, the <<a.out>> object format does not allow an
138
  arbitrary 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
SUBSECTION
172
  typedef asymbol
173
174
  An <<asymbol>> has the form:
175
176
CODE_FRAGMENT
177
.typedef struct bfd_symbol
178
.{
179
.  {* A pointer to the BFD which owns the symbol. This information
180
.     is necessary so that a back end can work out what additional
181
.     information (invisible to the application writer) is carried
182
.     with the symbol.
183
.
184
.     This field is *almost* redundant, since you can use section->owner
185
.     instead, except that some symbols point to the global sections
186
.     bfd_{abs,com,und}_section.  This could be fixed by making
187
.     these globals be per-bfd (or per-target-flavor).  FIXME.  *}
188
.  struct bfd *the_bfd; {* Use bfd_asymbol_bfd(sym) to access this field.  *}
189
.
190
.  {* The text of the symbol. The name is left alone, and not copied; the
191
.     application may not alter it.  *}
192
.  const char *name;
193
.
194
.  {* The value of the symbol.  This really should be a union of a
195
.     numeric value with a pointer, since some flags indicate that
196
.     a pointer to another symbol is stored here.  *}
197
.  symvalue value;
198
.
199
.  {* Attributes of a symbol.  *}
200
.#define BSF_NO_FLAGS            0
201
.
202
.  {* The symbol has local scope; <<static>> in <<C>>. The value
203
.     is the offset into the section of the data.  *}
204
.#define BSF_LOCAL               (1 << 0)
205
.
206
.  {* The symbol has global scope; initialized data in <<C>>. The
207
.     value is the offset into the section of the data.  *}
208
.#define BSF_GLOBAL              (1 << 1)
209
.
210
.  {* The symbol has global scope and is exported. The value is
211
.     the offset into the section of the data.  *}
212
.#define BSF_EXPORT              BSF_GLOBAL {* No real difference.  *}
213
.
214
.  {* A normal C symbol would be one of:
215
.     <<BSF_LOCAL>>, <<BSF_UNDEFINED>> or <<BSF_GLOBAL>>.  *}
216
.
217
.  {* The symbol is a debugging record. The value has an arbitrary
218
.     meaning, unless BSF_DEBUGGING_RELOC is also set.  *}
219
.#define BSF_DEBUGGING           (1 << 2)
220
.
221
.  {* The symbol denotes a function entry point.  Used in ELF,
222
.     perhaps others someday.  *}
223
.#define BSF_FUNCTION            (1 << 3)
224
.
225
.  {* Used by the linker.  *}
226
.#define BSF_KEEP                (1 << 5)
227
.
228
.  {* An ELF common symbol.  *}
229
.#define BSF_ELF_COMMON          (1 << 6)
230
.
231
.  {* A weak global symbol, overridable without warnings by
232
.     a regular global symbol of the same name.  *}
233
.#define BSF_WEAK                (1 << 7)
234
.
235
.  {* This symbol was created to point to a section, e.g. ELF's
236
.     STT_SECTION symbols.  *}
237
.#define BSF_SECTION_SYM         (1 << 8)
238
.
239
.  {* The symbol used to be a common symbol, but now it is
240
.     allocated.  *}
241
.#define BSF_OLD_COMMON          (1 << 9)
242
.
243
.  {* In some files the type of a symbol sometimes alters its
244
.     location in an output file - ie in coff a <<ISFCN>> symbol
245
.     which is also <<C_EXT>> symbol appears where it was
246
.     declared and not at the end of a section.  This bit is set
247
.     by the target BFD part to convey this information.  *}
248
.#define BSF_NOT_AT_END          (1 << 10)
249
.
250
.  {* Signal that the symbol is the label of constructor section.  *}
251
.#define BSF_CONSTRUCTOR         (1 << 11)
252
.
253
.  {* Signal that the symbol is a warning symbol.  The name is a
254
.     warning.  The name of the next symbol is the one to warn about;
255
.     if a reference is made to a symbol with the same name as the next
256
.     symbol, a warning is issued by the linker.  *}
257
.#define BSF_WARNING             (1 << 12)
258
.
259
.  {* Signal that the symbol is indirect.  This symbol is an indirect
260
.     pointer to the symbol with the same name as the next symbol.  *}
261
.#define BSF_INDIRECT            (1 << 13)
262
.
263
.  {* BSF_FILE marks symbols that contain a file name.  This is used
264
.     for ELF STT_FILE symbols.  *}
265
.#define BSF_FILE                (1 << 14)
266
.
267
.  {* Symbol is from dynamic linking information.  *}
268
.#define BSF_DYNAMIC             (1 << 15)
269
.
270
.  {* The symbol denotes a data object.  Used in ELF, and perhaps
271
.     others someday.  *}
272
.#define BSF_OBJECT              (1 << 16)
273
.
274
.  {* This symbol is a debugging symbol.  The value is the offset
275
.     into the section of the data.  BSF_DEBUGGING should be set
276
.     as well.  *}
277
.#define BSF_DEBUGGING_RELOC     (1 << 17)
278
.
279
.  {* This symbol is thread local.  Used in ELF.  *}
280
.#define BSF_THREAD_LOCAL        (1 << 18)
281
.
282
.  {* This symbol represents a complex relocation expression,
283
.     with the expression tree serialized in the symbol name.  *}
284
.#define BSF_RELC                (1 << 19)
285
.
286
.  {* This symbol represents a signed complex relocation expression,
287
.     with the expression tree serialized in the symbol name.  *}
288
.#define BSF_SRELC               (1 << 20)
289
.
290
.  {* This symbol was created by bfd_get_synthetic_symtab.  *}
291
.#define BSF_SYNTHETIC           (1 << 21)
292
.
293
.  {* This symbol is an indirect code object.  Unrelated to BSF_INDIRECT.
294
.     The dynamic linker will compute the value of this symbol by
295
.     calling the function that it points to.  BSF_FUNCTION must
296
.     also be also set.  *}
297
.#define BSF_GNU_INDIRECT_FUNCTION (1 << 22)
298
.  {* This symbol is a globally unique data object.  The dynamic linker
299
.     will make sure that in the entire process there is just one symbol
300
.     with this name and type in use.  BSF_OBJECT must also be set.  *}
301
.#define BSF_GNU_UNIQUE          (1 << 23)
302
.
303
.  {* This section symbol should be included in the symbol table.  *}
304
.#define BSF_SECTION_SYM_USED    (1 << 24)
305
.
306
.  flagword flags;
307
.
308
.  {* A pointer to the section to which this symbol is
309
.     relative.  This will always be non NULL, there are special
310
.     sections for undefined and absolute symbols.  *}
311
.  struct bfd_section *section;
312
.
313
.  {* Back end special data.  *}
314
.  union
315
.    {
316
.      void *p;
317
.      bfd_vma i;
318
.    }
319
.  udata;
320
.}
321
.asymbol;
322
.
323
324
EXTERNAL
325
.typedef enum bfd_print_symbol
326
.{
327
.  bfd_print_symbol_name,
328
.  bfd_print_symbol_more,
329
.  bfd_print_symbol_all
330
.} bfd_print_symbol_type;
331
.
332
.{* Information about a symbol that nm needs.  *}
333
.
334
.typedef struct _symbol_info
335
.{
336
.  symvalue value;
337
.  char type;
338
.  const char *name;    {* Symbol name.  *}
339
.  unsigned char stab_type; {* Stab type.  *}
340
.  char stab_other;   {* Stab other.  *}
341
.  short stab_desc;   {* Stab desc.  *}
342
.  const char *stab_name; {* String for stab type.  *}
343
.} symbol_info;
344
.
345
.{* An empty string that will not match the address of any other
346
.   symbol name, even unnamed local symbols which will also have empty
347
.   string names.  This can be used to flag a symbol as corrupt if its
348
.   name uses an out of range string table index.  *}
349
.extern const char bfd_symbol_error_name[];
350
*/
351
352
#include "sysdep.h"
353
#include "bfd.h"
354
#include "libbfd.h"
355
#include "safe-ctype.h"
356
#include "bfdlink.h"
357
#include "aout/stab_gnu.h"
358
359
const char bfd_symbol_error_name[] = { 0 };
360
361
/*
362
DOCDD
363
INODE
364
symbol handling functions,  , typedef asymbol, Symbols
365
SUBSECTION
366
  Symbol handling functions
367
*/
368
369
/*
370
FUNCTION
371
  bfd_get_symtab_upper_bound
372
373
DESCRIPTION
374
  Return the number of bytes required to store a vector of pointers
375
  to <<asymbols>> for all the symbols in the BFD @var{abfd},
376
  including a terminal NULL pointer. If there are no symbols in
377
  the BFD, then return 0.  If an error occurs, return -1.
378
379
.#define bfd_get_symtab_upper_bound(abfd) \
380
. BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd))
381
.
382
*/
383
384
/*
385
FUNCTION
386
  bfd_is_local_label
387
388
SYNOPSIS
389
  bool bfd_is_local_label (bfd *abfd, asymbol *sym);
390
391
DESCRIPTION
392
  Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is
393
  a compiler generated local label, else return FALSE.
394
*/
395
396
bool
397
bfd_is_local_label (bfd *abfd, asymbol *sym)
398
0
{
399
  /* The BSF_SECTION_SYM check is needed for IA-64, where every label that
400
     starts with '.' is local.  This would accidentally catch section names
401
     if we didn't reject them here.  */
402
0
  if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_FILE | BSF_SECTION_SYM)) != 0)
403
0
    return false;
404
0
  if (sym->name == NULL || sym->name == bfd_symbol_error_name)
405
0
    return false;
406
0
  return bfd_is_local_label_name (abfd, sym->name);
407
0
}
408
409
/*
410
FUNCTION
411
  bfd_is_local_label_name
412
413
SYNOPSIS
414
  bool bfd_is_local_label_name (bfd *abfd, const char *name);
415
416
DESCRIPTION
417
  Return TRUE if a symbol with the name @var{name} in the BFD
418
  @var{abfd} is a compiler generated local label, else return
419
  FALSE.  This just checks whether the name has the form of a
420
  local label.
421
422
.#define bfd_is_local_label_name(abfd, name) \
423
. BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name))
424
.
425
*/
426
427
/*
428
FUNCTION
429
  bfd_is_target_special_symbol
430
431
SYNOPSIS
432
  bool bfd_is_target_special_symbol (bfd *abfd, asymbol *sym);
433
434
DESCRIPTION
435
  Return TRUE iff a symbol @var{sym} in the BFD @var{abfd} is something
436
  special to the particular target represented by the BFD.  Such symbols
437
  should normally not be mentioned to the user.
438
439
.#define bfd_is_target_special_symbol(abfd, sym) \
440
. BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym))
441
.
442
*/
443
444
/*
445
FUNCTION
446
  bfd_canonicalize_symtab
447
448
DESCRIPTION
449
  Read the symbols from the BFD @var{abfd}, and fills in
450
  the vector @var{location} with pointers to the symbols and
451
  a trailing NULL.
452
  Return the actual number of symbol pointers, not
453
  including the NULL.
454
455
.#define bfd_canonicalize_symtab(abfd, location) \
456
. BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location))
457
.
458
*/
459
460
/*
461
FUNCTION
462
  bfd_set_symtab
463
464
SYNOPSIS
465
  bool bfd_set_symtab
466
    (bfd *abfd, asymbol **location, unsigned int count);
467
468
DESCRIPTION
469
  Arrange that when the output BFD @var{abfd} is closed,
470
  the table @var{location} of @var{count} pointers to symbols
471
  will be written.
472
*/
473
474
bool
475
bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int symcount)
476
551
{
477
551
  if (abfd->format != bfd_object || bfd_read_p (abfd))
478
5
    {
479
5
      bfd_set_error (bfd_error_invalid_operation);
480
5
      return false;
481
5
    }
482
483
546
  abfd->outsymbols = location;
484
546
  abfd->symcount = symcount;
485
546
  return true;
486
551
}
487
488
/*
489
FUNCTION
490
  bfd_print_symbol_vandf
491
492
SYNOPSIS
493
  void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol);
494
495
DESCRIPTION
496
  Print the value and flags of the @var{symbol} supplied to the
497
  stream @var{file}.
498
*/
499
void
500
bfd_print_symbol_vandf (bfd *abfd, void *arg, asymbol *symbol)
501
0
{
502
0
  FILE *file = (FILE *) arg;
503
504
0
  flagword type = symbol->flags;
505
506
0
  if (symbol->section != NULL)
507
0
    bfd_fprintf_vma (abfd, file, symbol->value + symbol->section->vma);
508
0
  else
509
0
    bfd_fprintf_vma (abfd, file, symbol->value);
510
511
  /* This presumes that a symbol can not be both BSF_DEBUGGING and
512
     BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and
513
     BSF_OBJECT.  */
514
0
  fprintf (file, " %c%c%c%c%c%c%c",
515
0
     ((type & BSF_LOCAL)
516
0
      ? (type & BSF_GLOBAL) ? '!' : 'l'
517
0
      : (type & BSF_GLOBAL) ? 'g'
518
0
      : (type & BSF_GNU_UNIQUE) ? 'u' : ' '),
519
0
     (type & BSF_WEAK) ? 'w' : ' ',
520
0
     (type & BSF_CONSTRUCTOR) ? 'C' : ' ',
521
0
     (type & BSF_WARNING) ? 'W' : ' ',
522
0
     (type & BSF_INDIRECT) ? 'I' : (type & BSF_GNU_INDIRECT_FUNCTION) ? 'i' : ' ',
523
0
     (type & BSF_DEBUGGING) ? 'd' : (type & BSF_DYNAMIC) ? 'D' : ' ',
524
0
     ((type & BSF_FUNCTION)
525
0
      ? 'F'
526
0
      : ((type & BSF_FILE)
527
0
         ? 'f'
528
0
         : ((type & BSF_OBJECT) ? 'O' : ' '))));
529
0
}
530
531
/*
532
FUNCTION
533
  bfd_make_empty_symbol
534
535
DESCRIPTION
536
  Create a new <<asymbol>> structure for the BFD @var{abfd}
537
  and return a pointer to it.
538
539
  This routine is necessary because each back end has private
540
  information surrounding the <<asymbol>>. Building your own
541
  <<asymbol>> and pointing to it will not create the private
542
  information, and will cause problems later on.
543
544
.#define bfd_make_empty_symbol(abfd) \
545
. BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd))
546
.
547
*/
548
549
/*
550
FUNCTION
551
  _bfd_generic_make_empty_symbol
552
553
SYNOPSIS
554
  asymbol *_bfd_generic_make_empty_symbol (bfd *);
555
556
DESCRIPTION
557
  Create a new <<asymbol>> structure for the BFD @var{abfd}
558
  and return a pointer to it.  Used by core file routines,
559
  binary back-end and anywhere else where no private info
560
  is needed.
561
*/
562
563
asymbol *
564
_bfd_generic_make_empty_symbol (bfd *abfd)
565
1.61M
{
566
1.61M
  size_t amt = sizeof (asymbol);
567
1.61M
  asymbol *new_symbol = (asymbol *) bfd_zalloc (abfd, amt);
568
1.61M
  if (new_symbol)
569
1.61M
    new_symbol->the_bfd = abfd;
570
1.61M
  return new_symbol;
571
1.61M
}
572
573
/*
574
FUNCTION
575
  bfd_make_debug_symbol
576
577
DESCRIPTION
578
  Create a new <<asymbol>> structure for the BFD @var{abfd},
579
  to be used as a debugging symbol.
580
581
.#define bfd_make_debug_symbol(abfd) \
582
. BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd))
583
.
584
*/
585
586
struct section_to_type
587
{
588
  const char *section;
589
  char type;
590
};
591
592
/* Map special section names to POSIX/BSD single-character symbol types.
593
   This table is probably incomplete.  It is sorted for convenience of
594
   adding entries.  Since it is so short, a linear search is used.  */
595
static const struct section_to_type stt[] =
596
{
597
  {".didat", 'i'},    /* MSVC's .didat (delay import) section */
598
  {".drectve", 'i'},    /* MSVC's .drective section */
599
  {".edata", 'e'},    /* MSVC's .edata (export) section */
600
  {".idata", 'i'},    /* MSVC's .idata (import) section */
601
  {".pdata", 'p'},    /* MSVC's .pdata (stack unwind) section */
602
  {0, 0}
603
};
604
605
/* Return the single-character symbol type corresponding to
606
   section S, or '?' for an unknown COFF section.
607
608
   Check for leading strings which match, followed by a number, '.',
609
   or '$' so .idata5 matches the .idata entry.  */
610
611
static char
612
coff_section_type (const char *s)
613
248k
{
614
248k
  const struct section_to_type *t;
615
616
1.48M
  for (t = &stt[0]; t->section; t++)
617
1.23M
    {
618
1.23M
      size_t len = strlen (t->section);
619
1.23M
      if (strncmp (s, t->section, len) == 0
620
1.23M
    && memchr (".$0123456789", s[len], 13) != 0)
621
2.24k
  return t->type;
622
1.23M
    }
623
624
246k
  return '?';
625
248k
}
626
627
/* Return the single-character symbol type corresponding to section
628
   SECTION, or '?' for an unknown section.  This uses section flags to
629
   identify sections.
630
631
   FIXME These types are unhandled: e, i, p.  If we handled these also,
632
   we could perhaps obsolete coff_section_type.  */
633
634
static char
635
decode_section_type (const struct bfd_section *section)
636
246k
{
637
246k
  if (section->flags & SEC_CODE)
638
123k
    return 't';
639
122k
  if (section->flags & SEC_DATA)
640
73.5k
    {
641
73.5k
      if (section->flags & SEC_READONLY)
642
47.5k
  return 'r';
643
25.9k
      else if (section->flags & SEC_SMALL_DATA)
644
7
  return 'g';
645
25.9k
      else
646
25.9k
  return 'd';
647
73.5k
    }
648
49.1k
  if ((section->flags & SEC_HAS_CONTENTS) == 0)
649
41.6k
    {
650
41.6k
      if (section->flags & SEC_SMALL_DATA)
651
1
  return 's';
652
41.6k
      else
653
41.6k
  return 'b';
654
41.6k
    }
655
7.48k
  if (section->flags & SEC_DEBUGGING)
656
4.09k
    return 'N';
657
3.38k
  if ((section->flags & SEC_HAS_CONTENTS) && (section->flags & SEC_READONLY))
658
3.28k
    return 'n';
659
660
105
  return '?';
661
3.38k
}
662
663
/*
664
FUNCTION
665
  bfd_decode_symclass
666
667
SYNOPSIS
668
  int bfd_decode_symclass (asymbol *symbol);
669
670
DESCRIPTION
671
  Return a character corresponding to the symbol
672
  class of @var{symbol}, or '?' for an unknown class.
673
*/
674
int
675
bfd_decode_symclass (asymbol *symbol)
676
993k
{
677
993k
  char c;
678
679
  /* Paranoia...  */
680
993k
  if (symbol == NULL || symbol->section == NULL)
681
0
    return '?';
682
683
993k
  if (symbol->section && bfd_is_com_section (symbol->section))
684
10.1k
    {
685
10.1k
      if (symbol->section->flags & SEC_SMALL_DATA)
686
2
  return 'c';
687
10.1k
      else
688
10.1k
  return 'C';
689
10.1k
    }
690
983k
  if (bfd_is_und_section (symbol->section))
691
148k
    {
692
148k
      if (symbol->flags & BSF_WEAK)
693
5.77k
  {
694
    /* If weak, determine if it's specifically an object
695
       or non-object weak.  */
696
5.77k
    if (symbol->flags & BSF_OBJECT)
697
14
      return 'v';
698
5.75k
    else
699
5.75k
      return 'w';
700
5.77k
  }
701
142k
      else
702
142k
  return 'U';
703
148k
    }
704
835k
  if (bfd_is_ind_section (symbol->section))
705
466
    return 'I';
706
834k
  if (symbol->flags & BSF_GNU_INDIRECT_FUNCTION)
707
255
    return 'i';
708
834k
  if (symbol->flags & BSF_WEAK)
709
4.06k
    {
710
      /* If weak, determine if it's specifically an object
711
   or non-object weak.  */
712
4.06k
      if (symbol->flags & BSF_OBJECT)
713
1.39k
  return 'V';
714
2.66k
      else
715
2.66k
  return 'W';
716
4.06k
    }
717
830k
  if (symbol->flags & BSF_GNU_UNIQUE)
718
10
    return 'u';
719
830k
  if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
720
9.09k
    return '?';
721
722
821k
  if (bfd_is_abs_section (symbol->section))
723
573k
    c = 'a';
724
248k
  else if (symbol->section)
725
248k
    {
726
248k
      c = coff_section_type (symbol->section->name);
727
248k
      if (c == '?')
728
246k
  c = decode_section_type (symbol->section);
729
248k
    }
730
0
  else
731
0
    return '?';
732
821k
  if (symbol->flags & BSF_GLOBAL)
733
80.1k
    c = TOUPPER (c);
734
821k
  return c;
735
736
  /* We don't have to handle these cases just yet, but we will soon:
737
     N_SETV: 'v';
738
     N_SETA: 'l';
739
     N_SETT: 'x';
740
     N_SETD: 'z';
741
     N_SETB: 's';
742
     N_INDR: 'i';
743
     */
744
821k
}
745
746
/*
747
FUNCTION
748
  bfd_is_undefined_symclass
749
750
SYNOPSIS
751
  bool bfd_is_undefined_symclass (int symclass);
752
753
DESCRIPTION
754
  Returns non-zero if the class symbol returned by
755
  bfd_decode_symclass represents an undefined symbol.
756
  Returns zero otherwise.
757
*/
758
759
bool
760
bfd_is_undefined_symclass (int symclass)
761
1.85M
{
762
1.85M
  return symclass == 'U' || symclass == 'w' || symclass == 'v';
763
1.85M
}
764
765
/*
766
FUNCTION
767
  bfd_symbol_info
768
769
SYNOPSIS
770
  void bfd_symbol_info (asymbol *symbol, symbol_info *ret);
771
772
DESCRIPTION
773
  Fill in the basic info about symbol that nm needs.
774
  Additional info may be added by the back-ends after
775
  calling this function.
776
*/
777
778
void
779
bfd_symbol_info (asymbol *symbol, symbol_info *ret)
780
929k
{
781
929k
  ret->type = bfd_decode_symclass (symbol);
782
783
929k
  if (bfd_is_undefined_symclass (ret->type))
784
115k
    ret->value = 0;
785
814k
  else
786
814k
    ret->value = symbol->value + symbol->section->vma;
787
788
929k
  ret->name = (symbol->name != bfd_symbol_error_name
789
929k
         ? symbol->name : _("<corrupt>"));
790
929k
}
791
792
/*
793
FUNCTION
794
  bfd_copy_private_symbol_data
795
796
SYNOPSIS
797
  bool bfd_copy_private_symbol_data
798
    (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
799
800
DESCRIPTION
801
  Copy private symbol information from @var{isym} in the BFD
802
  @var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}.
803
  Return <<TRUE>> on success, <<FALSE>> on error.  Possible error
804
  returns are:
805
806
  o <<bfd_error_no_memory>> -
807
  Not enough memory exists to create private data for @var{osec}.
808
809
.#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \
810
. BFD_SEND (obfd, _bfd_copy_private_symbol_data, \
811
.     (ibfd, isymbol, obfd, osymbol))
812
.
813
*/
814
815
/* The generic version of the function which returns mini symbols.
816
   This is used when the backend does not provide a more efficient
817
   version.  It just uses BFD asymbol structures as mini symbols.  */
818
819
long
820
_bfd_generic_read_minisymbols (bfd *abfd,
821
             bool dynamic,
822
             void **minisymsp,
823
             unsigned int *sizep)
824
7.98k
{
825
7.98k
  long storage;
826
7.98k
  asymbol **syms = NULL;
827
7.98k
  long symcount;
828
829
7.98k
  if (dynamic)
830
0
    storage = bfd_get_dynamic_symtab_upper_bound (abfd);
831
7.98k
  else
832
7.98k
    storage = bfd_get_symtab_upper_bound (abfd);
833
7.98k
  if (storage < 0)
834
4.38k
    goto error_return;
835
3.59k
  if (storage == 0)
836
10
    return 0;
837
838
3.58k
  syms = (asymbol **) bfd_malloc (storage);
839
3.58k
  if (syms == NULL)
840
0
    goto error_return;
841
842
3.58k
  if (dynamic)
843
0
    symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
844
3.58k
  else
845
3.58k
    symcount = bfd_canonicalize_symtab (abfd, syms);
846
3.58k
  if (symcount < 0)
847
249
    goto error_return;
848
849
3.33k
  if (symcount == 0)
850
    /* We return 0 above when storage is 0.  Exit in the same state
851
       here, so as to not complicate callers with having to deal with
852
       freeing memory for zero symcount.  */
853
77
    free (syms);
854
3.26k
  else
855
3.26k
    {
856
3.26k
      *minisymsp = syms;
857
3.26k
      *sizep = sizeof (asymbol *);
858
3.26k
    }
859
3.33k
  return symcount;
860
861
4.63k
 error_return:
862
4.63k
  bfd_set_error (bfd_error_no_symbols);
863
4.63k
  free (syms);
864
4.63k
  return -1;
865
3.58k
}
866
867
/* The generic version of the function which converts a minisymbol to
868
   an asymbol.  We don't worry about the sym argument we are passed;
869
   we just return the asymbol the minisymbol points to.  */
870
871
asymbol *
872
_bfd_generic_minisymbol_to_symbol (bfd *abfd ATTRIBUTE_UNUSED,
873
           bool dynamic ATTRIBUTE_UNUSED,
874
           const void *minisym,
875
           asymbol *sym ATTRIBUTE_UNUSED)
876
7.14M
{
877
7.14M
  return *(asymbol **) minisym;
878
7.14M
}
879
880
/* Look through stabs debugging information in .stab and .stabstr
881
   sections to find the source file and line closest to a desired
882
   location.  This is used by COFF and ELF targets.  It sets *pfound
883
   to TRUE if it finds some information.  The *pinfo field is used to
884
   pass cached information in and out of this routine; this first time
885
   the routine is called for a BFD, *pinfo should be NULL.  The value
886
   placed in *pinfo should be saved with the BFD, and passed back each
887
   time this function is called.  */
888
889
/* We use a cache by default.  */
890
891
#define ENABLE_CACHING
892
893
/* We keep an array of indexentry structures to record where in the
894
   stabs section we should look to find line number information for a
895
   particular address.  */
896
897
struct indexentry
898
{
899
  bfd_vma val;
900
  bfd_byte *stab;
901
  bfd_byte *str;
902
  char *directory_name;
903
  char *file_name;
904
  char *function_name;
905
  int idx;
906
};
907
908
/* Compare two indexentry structures.  This is called via qsort.  */
909
910
static int
911
cmpindexentry (const void *a, const void *b)
912
3.59k
{
913
3.59k
  const struct indexentry *contestantA = (const struct indexentry *) a;
914
3.59k
  const struct indexentry *contestantB = (const struct indexentry *) b;
915
916
3.59k
  if (contestantA->val < contestantB->val)
917
920
    return -1;
918
2.67k
  if (contestantA->val > contestantB->val)
919
1.28k
    return 1;
920
1.38k
  return contestantA->idx - contestantB->idx;
921
2.67k
}
922
923
/* A pointer to this structure is stored in *pinfo.  */
924
925
struct stab_find_info
926
{
927
  /* The .stab section.  */
928
  asection *stabsec;
929
  /* The .stabstr section.  */
930
  asection *strsec;
931
  /* The contents of the .stab section.  */
932
  bfd_byte *stabs;
933
  /* The contents of the .stabstr section.  */
934
  bfd_byte *strs;
935
936
  /* A table that indexes stabs by memory address.  */
937
  struct indexentry *indextable;
938
  /* The number of entries in indextable.  */
939
  int indextablesize;
940
941
#ifdef ENABLE_CACHING
942
  /* Cached values to restart quickly.  */
943
  struct indexentry *cached_indexentry;
944
  bfd_vma cached_offset;
945
  bfd_byte *cached_stab;
946
  char *cached_file_name;
947
#endif
948
949
  /* Saved ptr to malloc'ed filename.  */
950
  char *filename;
951
};
952
953
bool
954
_bfd_stab_section_find_nearest_line (bfd *abfd,
955
             asymbol **symbols,
956
             asection *section,
957
             bfd_vma offset,
958
             bool *pfound,
959
             const char **pfilename,
960
             const char **pfnname,
961
             unsigned int *pline,
962
             void **pinfo)
963
225k
{
964
225k
  struct stab_find_info *info;
965
225k
  bfd_size_type stabsize, strsize;
966
225k
  bfd_byte *stab, *str;
967
225k
  bfd_byte *nul_fun, *nul_str;
968
225k
  bfd_size_type stroff;
969
225k
  struct indexentry *indexentry;
970
225k
  char *file_name;
971
225k
  char *directory_name;
972
225k
  bool saw_line, saw_func;
973
974
225k
  *pfound = false;
975
225k
  *pfilename = bfd_get_filename (abfd);
976
225k
  *pfnname = NULL;
977
225k
  *pline = 0;
978
979
  /* Stabs entries use a 12 byte format:
980
       4 byte string table index
981
       1 byte stab type
982
       1 byte stab other field
983
       2 byte stab desc field
984
       4 byte stab value
985
     FIXME: This will have to change for a 64 bit object format.
986
987
     The stabs symbols are divided into compilation units.  For the
988
     first entry in each unit, the type of 0, the value is the length
989
     of the string table for this unit, and the desc field is the
990
     number of stabs symbols for this unit.  */
991
992
225k
#define STRDXOFF (0)
993
225k
#define TYPEOFF (4)
994
225k
#define OTHEROFF (5)
995
225k
#define DESCOFF (6)
996
225k
#define VALOFF (8)
997
225k
#define STABSIZE (12)
998
999
225k
  info = (struct stab_find_info *) *pinfo;
1000
225k
  if (info != NULL)
1001
220k
    {
1002
220k
      if (info->stabsec == NULL || info->strsec == NULL)
1003
219k
  {
1004
    /* No usable stabs debugging information.  */
1005
219k
    return true;
1006
219k
  }
1007
1008
774
      stabsize = (info->stabsec->rawsize
1009
774
      ? info->stabsec->rawsize
1010
774
      : info->stabsec->size);
1011
774
      strsize = (info->strsec->rawsize
1012
774
     ? info->strsec->rawsize
1013
774
     : info->strsec->size);
1014
774
    }
1015
5.29k
  else
1016
5.29k
    {
1017
5.29k
      long reloc_size, reloc_count;
1018
5.29k
      arelent **reloc_vector;
1019
5.29k
      int i;
1020
5.29k
      char *function_name;
1021
5.29k
      bfd_size_type amt = sizeof *info;
1022
1023
5.29k
      info = (struct stab_find_info *) bfd_zalloc (abfd, amt);
1024
5.29k
      if (info == NULL)
1025
0
  return false;
1026
5.29k
      *pinfo = info;
1027
1028
      /* FIXME: When using the linker --split-by-file or
1029
   --split-by-reloc options, it is possible for the .stab and
1030
   .stabstr sections to be split.  We should handle that.  */
1031
1032
5.29k
      info->stabsec = bfd_get_section_by_name (abfd, ".stab");
1033
5.29k
      info->strsec = bfd_get_section_by_name (abfd, ".stabstr");
1034
1035
5.29k
      if (info->stabsec == NULL || info->strsec == NULL)
1036
5.04k
  {
1037
    /* Try SOM section names.  */
1038
5.04k
    info->stabsec = bfd_get_section_by_name (abfd, "$GDB_SYMBOLS$");
1039
5.04k
    info->strsec  = bfd_get_section_by_name (abfd, "$GDB_STRINGS$");
1040
1041
5.04k
    if (info->stabsec == NULL || info->strsec == NULL)
1042
5.04k
      return true;
1043
5.04k
  }
1044
1045
248
      if ((info->stabsec->flags & SEC_HAS_CONTENTS) == 0
1046
248
    || (info->strsec->flags & SEC_HAS_CONTENTS) == 0)
1047
12
  goto out;
1048
1049
236
      stabsize = (info->stabsec->rawsize
1050
236
      ? info->stabsec->rawsize
1051
236
      : info->stabsec->size);
1052
236
      stabsize = (stabsize / STABSIZE) * STABSIZE;
1053
236
      strsize = (info->strsec->rawsize
1054
236
     ? info->strsec->rawsize
1055
236
     : info->strsec->size);
1056
1057
236
      if (stabsize == 0 || strsize == 0)
1058
5
  goto out;
1059
1060
231
      if (!bfd_malloc_and_get_section (abfd, info->stabsec, &info->stabs))
1061
12
  goto out;
1062
219
      if (!bfd_malloc_and_get_section (abfd, info->strsec, &info->strs))
1063
2
  goto out1;
1064
1065
      /* Stab strings ought to be nul terminated.  Ensure the last one
1066
   is, to prevent running off the end of the buffer.  */
1067
217
      info->strs[strsize - 1] = 0;
1068
1069
      /* If this is a relocatable object file, we have to relocate
1070
   the entries in .stab.  This should always be simple 32 bit
1071
   relocations against symbols defined in this object file, so
1072
   this should be no big deal.  */
1073
217
      reloc_size = bfd_get_reloc_upper_bound (abfd, info->stabsec);
1074
217
      if (reloc_size < 0)
1075
1
  goto out2;
1076
216
      reloc_vector = (arelent **) bfd_malloc (reloc_size);
1077
216
      if (reloc_vector == NULL && reloc_size != 0)
1078
0
  goto out2;
1079
216
      reloc_count = bfd_canonicalize_reloc (abfd, info->stabsec, reloc_vector,
1080
216
              symbols);
1081
216
      if (reloc_count < 0)
1082
65
  {
1083
81
  out3:
1084
81
    free (reloc_vector);
1085
82
  out2:
1086
82
    free (info->strs);
1087
82
    info->strs = NULL;
1088
84
  out1:
1089
84
    free (info->stabs);
1090
84
    info->stabs = NULL;
1091
113
  out:
1092
113
    info->stabsec = NULL;
1093
113
    return false;
1094
84
  }
1095
151
      if (reloc_count > 0)
1096
74
  {
1097
74
    arelent **pr;
1098
1099
630
    for (pr = reloc_vector; *pr != NULL; pr++)
1100
572
      {
1101
572
        arelent *r;
1102
572
        unsigned long val;
1103
572
        asymbol *sym;
1104
572
        bfd_size_type octets;
1105
1106
572
        r = *pr;
1107
        /* Ignore R_*_NONE relocs.  */
1108
572
        if (r->howto->dst_mask == 0)
1109
538
    continue;
1110
1111
34
        octets = r->address * bfd_octets_per_byte (abfd, NULL);
1112
34
        if (r->howto->rightshift != 0
1113
34
      || bfd_get_reloc_size (r->howto) != 4
1114
34
      || r->howto->bitsize != 32
1115
34
      || r->howto->pc_relative
1116
34
      || r->howto->bitpos != 0
1117
34
      || r->howto->dst_mask != 0xffffffff
1118
34
      || octets > stabsize - 4)
1119
16
    {
1120
16
      _bfd_error_handler
1121
16
        (_("unsupported .stab relocation"));
1122
16
      bfd_set_error (bfd_error_invalid_operation);
1123
16
      goto out3;
1124
16
    }
1125
1126
18
        val = bfd_get_32 (abfd, info->stabs + octets);
1127
18
        val &= r->howto->src_mask;
1128
18
        sym = *r->sym_ptr_ptr;
1129
18
        val += sym->value + sym->section->vma + r->addend;
1130
18
        bfd_put_32 (abfd, (bfd_vma) val, info->stabs + octets);
1131
18
      }
1132
74
  }
1133
1134
135
      free (reloc_vector);
1135
1136
      /* First time through this function, build a table matching
1137
   function VM addresses to stabs, then sort based on starting
1138
   VM address.  Do this in two passes: once to count how many
1139
   table entries we'll need, and a second to actually build the
1140
   table.  */
1141
1142
135
      info->indextablesize = 0;
1143
135
      nul_fun = NULL;
1144
19.3k
      for (stab = info->stabs; stab < info->stabs + stabsize; stab += STABSIZE)
1145
19.1k
  {
1146
19.1k
    if (stab[TYPEOFF] == (bfd_byte) N_SO)
1147
828
      {
1148
        /* if we did not see a function def, leave space for one.  */
1149
828
        if (nul_fun != NULL)
1150
666
    ++info->indextablesize;
1151
1152
        /* N_SO with null name indicates EOF */
1153
828
        if (bfd_get_32 (abfd, stab + STRDXOFF) == 0)
1154
48
    nul_fun = NULL;
1155
780
        else
1156
780
    {
1157
780
      nul_fun = stab;
1158
1159
      /* two N_SO's in a row is a filename and directory. Skip */
1160
780
      if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize
1161
780
          && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO)
1162
489
        stab += STABSIZE;
1163
780
    }
1164
828
      }
1165
18.3k
    else if (stab[TYPEOFF] == (bfd_byte) N_FUN
1166
18.3k
       && bfd_get_32 (abfd, stab + STRDXOFF) != 0)
1167
308
      {
1168
308
        nul_fun = NULL;
1169
308
        ++info->indextablesize;
1170
308
      }
1171
19.1k
  }
1172
1173
135
      if (nul_fun != NULL)
1174
70
  ++info->indextablesize;
1175
1176
135
      if (info->indextablesize == 0)
1177
15
  {
1178
15
    free (info->strs);
1179
15
    info->strs = NULL;
1180
15
    free (info->stabs);
1181
15
    info->stabs = NULL;
1182
15
    info->stabsec = NULL;
1183
15
    return true;
1184
15
  }
1185
120
      ++info->indextablesize;
1186
1187
120
      amt = info->indextablesize;
1188
120
      amt *= sizeof (struct indexentry);
1189
120
      info->indextable = (struct indexentry *) bfd_malloc (amt);
1190
120
      if (info->indextable == NULL)
1191
0
  goto out3;
1192
1193
120
      file_name = NULL;
1194
120
      directory_name = NULL;
1195
120
      nul_fun = NULL;
1196
120
      stroff = 0;
1197
1198
120
      for (i = 0, stab = info->stabs, nul_str = str = info->strs;
1199
18.7k
     i < info->indextablesize && stab < info->stabs + stabsize;
1200
18.6k
     stab += STABSIZE)
1201
18.6k
  {
1202
18.6k
    switch (stab[TYPEOFF])
1203
18.6k
      {
1204
9.19k
      case 0:
1205
        /* This is the first entry in a compilation unit.  */
1206
9.19k
        if ((bfd_size_type) ((info->strs + strsize) - str) < stroff)
1207
8.84k
    break;
1208
356
        str += stroff;
1209
356
        stroff = bfd_get_32 (abfd, stab + VALOFF);
1210
356
        break;
1211
1212
826
      case N_SO:
1213
        /* The main file name.  */
1214
1215
        /* The following code creates a new indextable entry with
1216
     a NULL function name if there were no N_FUNs in a file.
1217
     Note that a N_SO without a file name is an EOF and
1218
     there could be 2 N_SO following it with the new filename
1219
     and directory.  */
1220
826
        if (nul_fun != NULL)
1221
666
    {
1222
666
      info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF);
1223
666
      info->indextable[i].stab = nul_fun;
1224
666
      info->indextable[i].str = nul_str;
1225
666
      info->indextable[i].directory_name = directory_name;
1226
666
      info->indextable[i].file_name = file_name;
1227
666
      info->indextable[i].function_name = NULL;
1228
666
      info->indextable[i].idx = i;
1229
666
      ++i;
1230
666
    }
1231
1232
826
        directory_name = NULL;
1233
826
        file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1234
826
        if (file_name == (char *) str)
1235
46
    {
1236
46
      file_name = NULL;
1237
46
      nul_fun = NULL;
1238
46
    }
1239
780
        else
1240
780
    {
1241
780
      nul_fun = stab;
1242
780
      nul_str = str;
1243
780
      if (file_name >= (char *) info->strs + strsize
1244
780
          || file_name < (char *) str)
1245
770
        file_name = NULL;
1246
780
      if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize
1247
780
          && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO)
1248
489
        {
1249
          /* Two consecutive N_SOs are a directory and a
1250
       file name.  */
1251
489
          stab += STABSIZE;
1252
489
          directory_name = file_name;
1253
489
          file_name = ((char *) str
1254
489
           + bfd_get_32 (abfd, stab + STRDXOFF));
1255
489
          if (file_name >= (char *) info->strs + strsize
1256
489
        || file_name < (char *) str)
1257
469
      file_name = NULL;
1258
489
        }
1259
780
    }
1260
826
        break;
1261
1262
143
      case N_SOL:
1263
        /* The name of an include file.  */
1264
143
        file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1265
        /* PR 17512: file: 0c680a1f.  */
1266
        /* PR 17512: file: 5da8aec4.  */
1267
143
        if (file_name >= (char *) info->strs + strsize
1268
143
      || file_name < (char *) str)
1269
89
    file_name = NULL;
1270
143
        break;
1271
1272
348
      case N_FUN:
1273
        /* A function name.  */
1274
348
        function_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1275
348
        if (function_name == (char *) str)
1276
40
    continue;
1277
308
        if (function_name >= (char *) info->strs + strsize
1278
308
      || function_name < (char *) str)
1279
125
    function_name = NULL;
1280
1281
308
        nul_fun = NULL;
1282
308
        info->indextable[i].val = bfd_get_32 (abfd, stab + VALOFF);
1283
308
        info->indextable[i].stab = stab;
1284
308
        info->indextable[i].str = str;
1285
308
        info->indextable[i].directory_name = directory_name;
1286
308
        info->indextable[i].file_name = file_name;
1287
308
        info->indextable[i].function_name = function_name;
1288
308
        info->indextable[i].idx = i;
1289
308
        ++i;
1290
308
        break;
1291
18.6k
      }
1292
18.6k
  }
1293
1294
120
      if (nul_fun != NULL)
1295
70
  {
1296
70
    info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF);
1297
70
    info->indextable[i].stab = nul_fun;
1298
70
    info->indextable[i].str = nul_str;
1299
70
    info->indextable[i].directory_name = directory_name;
1300
70
    info->indextable[i].file_name = file_name;
1301
70
    info->indextable[i].function_name = NULL;
1302
70
    info->indextable[i].idx = i;
1303
70
    ++i;
1304
70
  }
1305
1306
120
      info->indextable[i].val = (bfd_vma) -1;
1307
120
      info->indextable[i].stab = info->stabs + stabsize;
1308
120
      info->indextable[i].str = str;
1309
120
      info->indextable[i].directory_name = NULL;
1310
120
      info->indextable[i].file_name = NULL;
1311
120
      info->indextable[i].function_name = NULL;
1312
120
      info->indextable[i].idx = i;
1313
120
      ++i;
1314
1315
120
      info->indextablesize = i;
1316
120
      qsort (info->indextable, (size_t) i, sizeof (struct indexentry),
1317
120
       cmpindexentry);
1318
120
    }
1319
1320
  /* We are passed a section relative offset.  The offsets in the
1321
     stabs information are absolute.  */
1322
894
  offset += bfd_section_vma (section);
1323
1324
894
#ifdef ENABLE_CACHING
1325
894
  if (info->cached_indexentry != NULL
1326
894
      && offset >= info->cached_offset
1327
894
      && offset < (info->cached_indexentry + 1)->val)
1328
181
    {
1329
181
      stab = info->cached_stab;
1330
181
      indexentry = info->cached_indexentry;
1331
181
      file_name = info->cached_file_name;
1332
181
    }
1333
713
  else
1334
713
#endif
1335
713
    {
1336
713
      long low, high;
1337
713
      long mid = -1;
1338
1339
      /* Cache non-existent or invalid.  Do binary search on
1340
   indextable.  */
1341
713
      indexentry = NULL;
1342
1343
713
      low = 0;
1344
713
      high = info->indextablesize - 1;
1345
1.81k
      while (low != high)
1346
1.55k
  {
1347
1.55k
    mid = (high + low) / 2;
1348
1.55k
    if (offset >= info->indextable[mid].val
1349
1.55k
        && offset < info->indextable[mid + 1].val)
1350
455
      {
1351
455
        indexentry = &info->indextable[mid];
1352
455
        break;
1353
455
      }
1354
1355
1.10k
    if (info->indextable[mid].val > offset)
1356
892
      high = mid;
1357
209
    else
1358
209
      low = mid + 1;
1359
1.10k
  }
1360
1361
713
      if (indexentry == NULL)
1362
258
  return true;
1363
1364
455
      stab = indexentry->stab + STABSIZE;
1365
455
      file_name = indexentry->file_name;
1366
455
    }
1367
1368
636
  directory_name = indexentry->directory_name;
1369
636
  str = indexentry->str;
1370
1371
636
  saw_line = false;
1372
636
  saw_func = false;
1373
11.5k
  for (; stab < (indexentry+1)->stab; stab += STABSIZE)
1374
11.1k
    {
1375
11.1k
      bool done;
1376
11.1k
      bfd_vma val;
1377
1378
11.1k
      done = false;
1379
1380
11.1k
      switch (stab[TYPEOFF])
1381
11.1k
  {
1382
200
  case N_SOL:
1383
    /* The name of an include file.  */
1384
200
    val = bfd_get_32 (abfd, stab + VALOFF);
1385
200
    if (val <= offset)
1386
124
      {
1387
124
        file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF);
1388
124
        if (file_name >= (char *) info->strs + strsize
1389
124
      || file_name < (char *) str)
1390
36
    file_name = NULL;
1391
124
        *pline = 0;
1392
124
      }
1393
200
    break;
1394
1395
120
  case N_SLINE:
1396
245
  case N_DSLINE:
1397
446
  case N_BSLINE:
1398
    /* A line number.  If the function was specified, then the value
1399
       is relative to the start of the function.  Otherwise, the
1400
       value is an absolute address.  */
1401
446
    val = ((indexentry->function_name ? indexentry->val : 0)
1402
446
     + bfd_get_32 (abfd, stab + VALOFF));
1403
    /* If this line starts before our desired offset, or if it's
1404
       the first line we've been able to find, use it.  The
1405
       !saw_line check works around a bug in GCC 2.95.3, which emits
1406
       the first N_SLINE late.  */
1407
446
    if (!saw_line || val <= offset)
1408
383
      {
1409
383
        *pline = bfd_get_16 (abfd, stab + DESCOFF);
1410
1411
383
#ifdef ENABLE_CACHING
1412
383
        info->cached_stab = stab;
1413
383
        info->cached_offset = val;
1414
383
        info->cached_file_name = file_name;
1415
383
        info->cached_indexentry = indexentry;
1416
383
#endif
1417
383
      }
1418
446
    if (val > offset)
1419
159
      done = true;
1420
446
    saw_line = true;
1421
446
    break;
1422
1423
51
  case N_FUN:
1424
231
  case N_SO:
1425
231
    if (saw_func || saw_line)
1426
78
      done = true;
1427
231
    saw_func = true;
1428
231
    break;
1429
11.1k
  }
1430
1431
11.1k
      if (done)
1432
237
  break;
1433
11.1k
    }
1434
1435
636
  *pfound = true;
1436
1437
636
  if (file_name == NULL || IS_ABSOLUTE_PATH (file_name)
1438
636
      || directory_name == NULL)
1439
619
    *pfilename = file_name;
1440
17
  else
1441
17
    {
1442
17
      size_t dirlen;
1443
1444
17
      dirlen = strlen (directory_name);
1445
17
      if (info->filename == NULL
1446
17
    || filename_ncmp (info->filename, directory_name, dirlen) != 0
1447
17
    || filename_cmp (info->filename + dirlen, file_name) != 0)
1448
10
  {
1449
10
    size_t len;
1450
1451
    /* Don't free info->filename here.  objdump and other
1452
       apps keep a copy of a previously returned file name
1453
       pointer.  */
1454
10
    len = strlen (file_name) + 1;
1455
10
    info->filename = (char *) bfd_alloc (abfd, dirlen + len);
1456
10
    if (info->filename == NULL)
1457
0
      return false;
1458
10
    memcpy (info->filename, directory_name, dirlen);
1459
10
    memcpy (info->filename + dirlen, file_name, len);
1460
10
  }
1461
1462
17
      *pfilename = info->filename;
1463
17
    }
1464
1465
636
  if (indexentry->function_name != NULL)
1466
63
    {
1467
63
      char *s;
1468
1469
      /* This will typically be something like main:F(0,1), so we want
1470
   to clobber the colon.  It's OK to change the name, since the
1471
   string is in our own local storage anyhow.  */
1472
63
      s = strchr (indexentry->function_name, ':');
1473
63
      if (s != NULL)
1474
0
  *s = '\0';
1475
1476
63
      *pfnname = indexentry->function_name;
1477
63
    }
1478
1479
636
  return true;
1480
636
}
1481
1482
void
1483
_bfd_stab_cleanup (bfd *abfd ATTRIBUTE_UNUSED, void **pinfo)
1484
1.51M
{
1485
1.51M
  struct stab_find_info *info = (struct stab_find_info *) *pinfo;
1486
1.51M
  if (info == NULL)
1487
1.50M
    return;
1488
1489
5.23k
  free (info->indextable);
1490
5.23k
  free (info->strs);
1491
5.23k
  free (info->stabs);
1492
5.23k
}
1493
1494
long
1495
_bfd_nosymbols_canonicalize_symtab (bfd *abfd ATTRIBUTE_UNUSED,
1496
            asymbol **location ATTRIBUTE_UNUSED)
1497
31
{
1498
31
  return 0;
1499
31
}
1500
1501
void
1502
_bfd_nosymbols_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
1503
           void *afile ATTRIBUTE_UNUSED,
1504
           asymbol *symbol ATTRIBUTE_UNUSED,
1505
           bfd_print_symbol_type how ATTRIBUTE_UNUSED)
1506
0
{
1507
0
}
1508
1509
void
1510
_bfd_nosymbols_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1511
        asymbol *sym ATTRIBUTE_UNUSED,
1512
        symbol_info *ret ATTRIBUTE_UNUSED)
1513
0
{
1514
0
}
1515
1516
const char *
1517
_bfd_nosymbols_get_symbol_version_string (bfd *abfd,
1518
            asymbol *symbol ATTRIBUTE_UNUSED,
1519
            bool base_p ATTRIBUTE_UNUSED,
1520
            bool *hidden ATTRIBUTE_UNUSED)
1521
1.87M
{
1522
1.87M
  return (const char *) _bfd_ptr_bfd_null_error (abfd);
1523
1.87M
}
1524
1525
bool
1526
_bfd_nosymbols_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
1527
          const char *name ATTRIBUTE_UNUSED)
1528
0
{
1529
0
  return false;
1530
0
}
1531
1532
alent *
1533
_bfd_nosymbols_get_lineno (bfd *abfd, asymbol *sym ATTRIBUTE_UNUSED)
1534
0
{
1535
0
  return (alent *) _bfd_ptr_bfd_null_error (abfd);
1536
0
}
1537
1538
bool
1539
_bfd_nosymbols_find_nearest_line
1540
    (bfd *abfd,
1541
     asymbol **symbols ATTRIBUTE_UNUSED,
1542
     asection *section ATTRIBUTE_UNUSED,
1543
     bfd_vma offset ATTRIBUTE_UNUSED,
1544
     const char **filename_ptr ATTRIBUTE_UNUSED,
1545
     const char **functionname_ptr ATTRIBUTE_UNUSED,
1546
     unsigned int *line_ptr ATTRIBUTE_UNUSED,
1547
     unsigned int *discriminator_ptr ATTRIBUTE_UNUSED)
1548
2.55k
{
1549
2.55k
  return _bfd_bool_bfd_false_error (abfd);
1550
2.55k
}
1551
1552
bool
1553
_bfd_nosymbols_find_nearest_line_with_alt
1554
    (bfd *abfd,
1555
     const char *alt_filename ATTRIBUTE_UNUSED,
1556
     asymbol **symbols ATTRIBUTE_UNUSED,
1557
     asection *section ATTRIBUTE_UNUSED,
1558
     bfd_vma offset ATTRIBUTE_UNUSED,
1559
     const char **filename_ptr ATTRIBUTE_UNUSED,
1560
     const char **functionname_ptr ATTRIBUTE_UNUSED,
1561
     unsigned int *line_ptr ATTRIBUTE_UNUSED,
1562
     unsigned int *discriminator_ptr ATTRIBUTE_UNUSED)
1563
0
{
1564
0
  return _bfd_bool_bfd_false_error (abfd);
1565
0
}
1566
1567
bool
1568
_bfd_nosymbols_find_line (bfd *abfd,
1569
        asymbol **symbols ATTRIBUTE_UNUSED,
1570
        asymbol *symbol ATTRIBUTE_UNUSED,
1571
        const char **filename_ptr ATTRIBUTE_UNUSED,
1572
        unsigned int *line_ptr ATTRIBUTE_UNUSED)
1573
27.7k
{
1574
27.7k
  return _bfd_bool_bfd_false_error (abfd);
1575
27.7k
}
1576
1577
bool
1578
_bfd_nosymbols_find_inliner_info
1579
    (bfd *abfd,
1580
     const char **filename_ptr ATTRIBUTE_UNUSED,
1581
     const char **functionname_ptr ATTRIBUTE_UNUSED,
1582
     unsigned int *line_ptr ATTRIBUTE_UNUSED)
1583
0
{
1584
0
  return _bfd_bool_bfd_false_error (abfd);
1585
0
}
1586
1587
asymbol *
1588
_bfd_nosymbols_bfd_make_debug_symbol (bfd *abfd)
1589
0
{
1590
0
  return (asymbol *) _bfd_ptr_bfd_null_error (abfd);
1591
0
}
1592
1593
long
1594
_bfd_nosymbols_read_minisymbols (bfd *abfd,
1595
         bool dynamic ATTRIBUTE_UNUSED,
1596
         void **minisymsp ATTRIBUTE_UNUSED,
1597
         unsigned int *sizep ATTRIBUTE_UNUSED)
1598
0
{
1599
0
  return _bfd_long_bfd_n1_error (abfd);
1600
0
}
1601
1602
asymbol *
1603
_bfd_nosymbols_minisymbol_to_symbol (bfd *abfd,
1604
             bool dynamic ATTRIBUTE_UNUSED,
1605
             const void *minisym ATTRIBUTE_UNUSED,
1606
             asymbol *sym ATTRIBUTE_UNUSED)
1607
0
{
1608
0
  return (asymbol *) _bfd_ptr_bfd_null_error (abfd);
1609
0
}
1610
1611
long
1612
_bfd_nodynamic_get_synthetic_symtab (bfd *abfd,
1613
             long symcount ATTRIBUTE_UNUSED,
1614
             asymbol **syms ATTRIBUTE_UNUSED,
1615
             long dynsymcount ATTRIBUTE_UNUSED,
1616
             asymbol **dynsyms ATTRIBUTE_UNUSED,
1617
             asymbol **ret ATTRIBUTE_UNUSED)
1618
3.30k
{
1619
3.30k
  return _bfd_long_bfd_n1_error (abfd);
1620
3.30k
}