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