Fix ia64-linux binutils readelf -s testsuite failure.
[external/binutils.git] / bfd / syms.c
1 /* 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 }