/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-2023 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 | | */ |
346 | | |
347 | | #include "sysdep.h" |
348 | | #include "bfd.h" |
349 | | #include "libbfd.h" |
350 | | #include "safe-ctype.h" |
351 | | #include "bfdlink.h" |
352 | | #include "aout/stab_gnu.h" |
353 | | |
354 | | /* |
355 | | DOCDD |
356 | | INODE |
357 | | symbol handling functions, , typedef asymbol, Symbols |
358 | | SUBSECTION |
359 | | Symbol handling functions |
360 | | */ |
361 | | |
362 | | /* |
363 | | FUNCTION |
364 | | bfd_get_symtab_upper_bound |
365 | | |
366 | | DESCRIPTION |
367 | | Return the number of bytes required to store a vector of pointers |
368 | | to <<asymbols>> for all the symbols in the BFD @var{abfd}, |
369 | | including a terminal NULL pointer. If there are no symbols in |
370 | | the BFD, then return 0. If an error occurs, return -1. |
371 | | |
372 | | .#define bfd_get_symtab_upper_bound(abfd) \ |
373 | | . BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) |
374 | | . |
375 | | */ |
376 | | |
377 | | /* |
378 | | FUNCTION |
379 | | bfd_is_local_label |
380 | | |
381 | | SYNOPSIS |
382 | | bool bfd_is_local_label (bfd *abfd, asymbol *sym); |
383 | | |
384 | | DESCRIPTION |
385 | | Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is |
386 | | a compiler generated local label, else return FALSE. |
387 | | */ |
388 | | |
389 | | bool |
390 | | bfd_is_local_label (bfd *abfd, asymbol *sym) |
391 | 0 | { |
392 | | /* The BSF_SECTION_SYM check is needed for IA-64, where every label that |
393 | | starts with '.' is local. This would accidentally catch section names |
394 | | if we didn't reject them here. */ |
395 | 0 | if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_FILE | BSF_SECTION_SYM)) != 0) |
396 | 0 | return false; |
397 | 0 | if (sym->name == NULL) |
398 | 0 | return false; |
399 | 0 | return bfd_is_local_label_name (abfd, sym->name); |
400 | 0 | } |
401 | | |
402 | | /* |
403 | | FUNCTION |
404 | | bfd_is_local_label_name |
405 | | |
406 | | SYNOPSIS |
407 | | bool bfd_is_local_label_name (bfd *abfd, const char *name); |
408 | | |
409 | | DESCRIPTION |
410 | | Return TRUE if a symbol with the name @var{name} in the BFD |
411 | | @var{abfd} is a compiler generated local label, else return |
412 | | FALSE. This just checks whether the name has the form of a |
413 | | local label. |
414 | | |
415 | | .#define bfd_is_local_label_name(abfd, name) \ |
416 | | . BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) |
417 | | . |
418 | | */ |
419 | | |
420 | | /* |
421 | | FUNCTION |
422 | | bfd_is_target_special_symbol |
423 | | |
424 | | SYNOPSIS |
425 | | bool bfd_is_target_special_symbol (bfd *abfd, asymbol *sym); |
426 | | |
427 | | DESCRIPTION |
428 | | Return TRUE iff a symbol @var{sym} in the BFD @var{abfd} is something |
429 | | special to the particular target represented by the BFD. Such symbols |
430 | | should normally not be mentioned to the user. |
431 | | |
432 | | .#define bfd_is_target_special_symbol(abfd, sym) \ |
433 | | . BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym)) |
434 | | . |
435 | | */ |
436 | | |
437 | | /* |
438 | | FUNCTION |
439 | | bfd_canonicalize_symtab |
440 | | |
441 | | DESCRIPTION |
442 | | Read the symbols from the BFD @var{abfd}, and fills in |
443 | | the vector @var{location} with pointers to the symbols and |
444 | | a trailing NULL. |
445 | | Return the actual number of symbol pointers, not |
446 | | including the NULL. |
447 | | |
448 | | .#define bfd_canonicalize_symtab(abfd, location) \ |
449 | | . BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location)) |
450 | | . |
451 | | */ |
452 | | |
453 | | /* |
454 | | FUNCTION |
455 | | bfd_set_symtab |
456 | | |
457 | | SYNOPSIS |
458 | | bool bfd_set_symtab |
459 | | (bfd *abfd, asymbol **location, unsigned int count); |
460 | | |
461 | | DESCRIPTION |
462 | | Arrange that when the output BFD @var{abfd} is closed, |
463 | | the table @var{location} of @var{count} pointers to symbols |
464 | | will be written. |
465 | | */ |
466 | | |
467 | | bool |
468 | | bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int symcount) |
469 | 252 | { |
470 | 252 | if (abfd->format != bfd_object || bfd_read_p (abfd)) |
471 | 1 | { |
472 | 1 | bfd_set_error (bfd_error_invalid_operation); |
473 | 1 | return false; |
474 | 1 | } |
475 | | |
476 | 251 | abfd->outsymbols = location; |
477 | 251 | abfd->symcount = symcount; |
478 | 251 | return true; |
479 | 252 | } |
480 | | |
481 | | /* |
482 | | FUNCTION |
483 | | bfd_print_symbol_vandf |
484 | | |
485 | | SYNOPSIS |
486 | | void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol); |
487 | | |
488 | | DESCRIPTION |
489 | | Print the value and flags of the @var{symbol} supplied to the |
490 | | stream @var{file}. |
491 | | */ |
492 | | void |
493 | | bfd_print_symbol_vandf (bfd *abfd, void *arg, asymbol *symbol) |
494 | 0 | { |
495 | 0 | FILE *file = (FILE *) arg; |
496 | |
|
497 | 0 | flagword type = symbol->flags; |
498 | |
|
499 | 0 | if (symbol->section != NULL) |
500 | 0 | bfd_fprintf_vma (abfd, file, symbol->value + symbol->section->vma); |
501 | 0 | else |
502 | 0 | bfd_fprintf_vma (abfd, file, symbol->value); |
503 | | |
504 | | /* This presumes that a symbol can not be both BSF_DEBUGGING and |
505 | | BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and |
506 | | BSF_OBJECT. */ |
507 | 0 | fprintf (file, " %c%c%c%c%c%c%c", |
508 | 0 | ((type & BSF_LOCAL) |
509 | 0 | ? (type & BSF_GLOBAL) ? '!' : 'l' |
510 | 0 | : (type & BSF_GLOBAL) ? 'g' |
511 | 0 | : (type & BSF_GNU_UNIQUE) ? 'u' : ' '), |
512 | 0 | (type & BSF_WEAK) ? 'w' : ' ', |
513 | 0 | (type & BSF_CONSTRUCTOR) ? 'C' : ' ', |
514 | 0 | (type & BSF_WARNING) ? 'W' : ' ', |
515 | 0 | (type & BSF_INDIRECT) ? 'I' : (type & BSF_GNU_INDIRECT_FUNCTION) ? 'i' : ' ', |
516 | 0 | (type & BSF_DEBUGGING) ? 'd' : (type & BSF_DYNAMIC) ? 'D' : ' ', |
517 | 0 | ((type & BSF_FUNCTION) |
518 | 0 | ? 'F' |
519 | 0 | : ((type & BSF_FILE) |
520 | 0 | ? 'f' |
521 | 0 | : ((type & BSF_OBJECT) ? 'O' : ' ')))); |
522 | 0 | } |
523 | | |
524 | | /* |
525 | | FUNCTION |
526 | | bfd_make_empty_symbol |
527 | | |
528 | | DESCRIPTION |
529 | | Create a new <<asymbol>> structure for the BFD @var{abfd} |
530 | | and return a pointer to it. |
531 | | |
532 | | This routine is necessary because each back end has private |
533 | | information surrounding the <<asymbol>>. Building your own |
534 | | <<asymbol>> and pointing to it will not create the private |
535 | | information, and will cause problems later on. |
536 | | |
537 | | .#define bfd_make_empty_symbol(abfd) \ |
538 | | . BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) |
539 | | . |
540 | | */ |
541 | | |
542 | | /* |
543 | | FUNCTION |
544 | | _bfd_generic_make_empty_symbol |
545 | | |
546 | | SYNOPSIS |
547 | | asymbol *_bfd_generic_make_empty_symbol (bfd *); |
548 | | |
549 | | DESCRIPTION |
550 | | Create a new <<asymbol>> structure for the BFD @var{abfd} |
551 | | and return a pointer to it. Used by core file routines, |
552 | | binary back-end and anywhere else where no private info |
553 | | is needed. |
554 | | */ |
555 | | |
556 | | asymbol * |
557 | | _bfd_generic_make_empty_symbol (bfd *abfd) |
558 | 53 | { |
559 | 53 | size_t amt = sizeof (asymbol); |
560 | 53 | asymbol *new_symbol = (asymbol *) bfd_zalloc (abfd, amt); |
561 | 53 | if (new_symbol) |
562 | 53 | new_symbol->the_bfd = abfd; |
563 | 53 | return new_symbol; |
564 | 53 | } |
565 | | |
566 | | /* |
567 | | FUNCTION |
568 | | bfd_make_debug_symbol |
569 | | |
570 | | DESCRIPTION |
571 | | Create a new <<asymbol>> structure for the BFD @var{abfd}, |
572 | | to be used as a debugging symbol. |
573 | | |
574 | | .#define bfd_make_debug_symbol(abfd) \ |
575 | | . BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd)) |
576 | | . |
577 | | */ |
578 | | |
579 | | struct section_to_type |
580 | | { |
581 | | const char *section; |
582 | | char type; |
583 | | }; |
584 | | |
585 | | /* Map special section names to POSIX/BSD single-character symbol types. |
586 | | This table is probably incomplete. It is sorted for convenience of |
587 | | adding entries. Since it is so short, a linear search is used. */ |
588 | | static const struct section_to_type stt[] = |
589 | | { |
590 | | {".drectve", 'i'}, /* MSVC's .drective section */ |
591 | | {".edata", 'e'}, /* MSVC's .edata (export) section */ |
592 | | {".idata", 'i'}, /* MSVC's .idata (import) section */ |
593 | | {".pdata", 'p'}, /* MSVC's .pdata (stack unwind) section */ |
594 | | {0, 0} |
595 | | }; |
596 | | |
597 | | /* Return the single-character symbol type corresponding to |
598 | | section S, or '?' for an unknown COFF section. |
599 | | |
600 | | Check for leading strings which match, followed by a number, '.', |
601 | | or '$' so .idata5 matches the .idata entry. */ |
602 | | |
603 | | static char |
604 | | coff_section_type (const char *s) |
605 | 9.11k | { |
606 | 9.11k | const struct section_to_type *t; |
607 | | |
608 | 45.2k | for (t = &stt[0]; t->section; t++) |
609 | 36.2k | { |
610 | 36.2k | size_t len = strlen (t->section); |
611 | 36.2k | if (strncmp (s, t->section, len) == 0 |
612 | 36.2k | && memchr (".$0123456789", s[len], 13) != 0) |
613 | 192 | return t->type; |
614 | 36.2k | } |
615 | | |
616 | 8.92k | return '?'; |
617 | 9.11k | } |
618 | | |
619 | | /* Return the single-character symbol type corresponding to section |
620 | | SECTION, or '?' for an unknown section. This uses section flags to |
621 | | identify sections. |
622 | | |
623 | | FIXME These types are unhandled: e, i, p. If we handled these also, |
624 | | we could perhaps obsolete coff_section_type. */ |
625 | | |
626 | | static char |
627 | | decode_section_type (const struct bfd_section *section) |
628 | 8.92k | { |
629 | 8.92k | if (section->flags & SEC_CODE) |
630 | 3.51k | return 't'; |
631 | 5.41k | if (section->flags & SEC_DATA) |
632 | 4.48k | { |
633 | 4.48k | if (section->flags & SEC_READONLY) |
634 | 2.97k | return 'r'; |
635 | 1.51k | else if (section->flags & SEC_SMALL_DATA) |
636 | 0 | return 'g'; |
637 | 1.51k | else |
638 | 1.51k | return 'd'; |
639 | 4.48k | } |
640 | 925 | if ((section->flags & SEC_HAS_CONTENTS) == 0) |
641 | 709 | { |
642 | 709 | if (section->flags & SEC_SMALL_DATA) |
643 | 0 | return 's'; |
644 | 709 | else |
645 | 709 | return 'b'; |
646 | 709 | } |
647 | 216 | if (section->flags & SEC_DEBUGGING) |
648 | 199 | return 'N'; |
649 | 17 | if ((section->flags & SEC_HAS_CONTENTS) && (section->flags & SEC_READONLY)) |
650 | 17 | return 'n'; |
651 | | |
652 | 0 | return '?'; |
653 | 17 | } |
654 | | |
655 | | /* |
656 | | FUNCTION |
657 | | bfd_decode_symclass |
658 | | |
659 | | SYNOPSIS |
660 | | int bfd_decode_symclass (asymbol *symbol); |
661 | | |
662 | | DESCRIPTION |
663 | | Return a character corresponding to the symbol |
664 | | class of @var{symbol}, or '?' for an unknown class. |
665 | | */ |
666 | | int |
667 | | bfd_decode_symclass (asymbol *symbol) |
668 | 38.6k | { |
669 | 38.6k | char c; |
670 | | |
671 | | /* Paranoia... */ |
672 | 38.6k | if (symbol == NULL || symbol->section == NULL) |
673 | 0 | return '?'; |
674 | | |
675 | 38.6k | if (symbol->section && bfd_is_com_section (symbol->section)) |
676 | 11 | { |
677 | 11 | if (symbol->section->flags & SEC_SMALL_DATA) |
678 | 0 | return 'c'; |
679 | 11 | else |
680 | 11 | return 'C'; |
681 | 11 | } |
682 | 38.6k | if (bfd_is_und_section (symbol->section)) |
683 | 14.2k | { |
684 | 14.2k | if (symbol->flags & BSF_WEAK) |
685 | 260 | { |
686 | | /* If weak, determine if it's specifically an object |
687 | | or non-object weak. */ |
688 | 260 | if (symbol->flags & BSF_OBJECT) |
689 | 0 | return 'v'; |
690 | 260 | else |
691 | 260 | return 'w'; |
692 | 260 | } |
693 | 14.0k | else |
694 | 14.0k | return 'U'; |
695 | 14.2k | } |
696 | 24.3k | if (bfd_is_ind_section (symbol->section)) |
697 | 19 | return 'I'; |
698 | 24.3k | if (symbol->flags & BSF_GNU_INDIRECT_FUNCTION) |
699 | 273 | return 'i'; |
700 | 24.0k | if (symbol->flags & BSF_WEAK) |
701 | 507 | { |
702 | | /* If weak, determine if it's specifically an object |
703 | | or non-object weak. */ |
704 | 507 | if (symbol->flags & BSF_OBJECT) |
705 | 243 | return 'V'; |
706 | 264 | else |
707 | 264 | return 'W'; |
708 | 507 | } |
709 | 23.5k | if (symbol->flags & BSF_GNU_UNIQUE) |
710 | 144 | return 'u'; |
711 | 23.4k | if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL))) |
712 | 4.75k | return '?'; |
713 | | |
714 | 18.6k | if (bfd_is_abs_section (symbol->section)) |
715 | 9.54k | c = 'a'; |
716 | 9.11k | else if (symbol->section) |
717 | 9.11k | { |
718 | 9.11k | c = coff_section_type (symbol->section->name); |
719 | 9.11k | if (c == '?') |
720 | 8.92k | c = decode_section_type (symbol->section); |
721 | 9.11k | } |
722 | 0 | else |
723 | 0 | return '?'; |
724 | 18.6k | if (symbol->flags & BSF_GLOBAL) |
725 | 2.52k | c = TOUPPER (c); |
726 | 18.6k | return c; |
727 | | |
728 | | /* We don't have to handle these cases just yet, but we will soon: |
729 | | N_SETV: 'v'; |
730 | | N_SETA: 'l'; |
731 | | N_SETT: 'x'; |
732 | | N_SETD: 'z'; |
733 | | N_SETB: 's'; |
734 | | N_INDR: 'i'; |
735 | | */ |
736 | 18.6k | } |
737 | | |
738 | | /* |
739 | | FUNCTION |
740 | | bfd_is_undefined_symclass |
741 | | |
742 | | SYNOPSIS |
743 | | bool bfd_is_undefined_symclass (int symclass); |
744 | | |
745 | | DESCRIPTION |
746 | | Returns non-zero if the class symbol returned by |
747 | | bfd_decode_symclass represents an undefined symbol. |
748 | | Returns zero otherwise. |
749 | | */ |
750 | | |
751 | | bool |
752 | | bfd_is_undefined_symclass (int symclass) |
753 | 3.53k | { |
754 | 3.53k | return symclass == 'U' || symclass == 'w' || symclass == 'v'; |
755 | 3.53k | } |
756 | | |
757 | | /* |
758 | | FUNCTION |
759 | | bfd_symbol_info |
760 | | |
761 | | SYNOPSIS |
762 | | void bfd_symbol_info (asymbol *symbol, symbol_info *ret); |
763 | | |
764 | | DESCRIPTION |
765 | | Fill in the basic info about symbol that nm needs. |
766 | | Additional info may be added by the back-ends after |
767 | | calling this function. |
768 | | */ |
769 | | |
770 | | void |
771 | | bfd_symbol_info (asymbol *symbol, symbol_info *ret) |
772 | 3.53k | { |
773 | 3.53k | ret->type = bfd_decode_symclass (symbol); |
774 | | |
775 | 3.53k | if (bfd_is_undefined_symclass (ret->type)) |
776 | 0 | ret->value = 0; |
777 | 3.53k | else |
778 | 3.53k | ret->value = symbol->value + symbol->section->vma; |
779 | | |
780 | 3.53k | ret->name = symbol->name; |
781 | 3.53k | } |
782 | | |
783 | | /* |
784 | | FUNCTION |
785 | | bfd_copy_private_symbol_data |
786 | | |
787 | | SYNOPSIS |
788 | | bool bfd_copy_private_symbol_data |
789 | | (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); |
790 | | |
791 | | DESCRIPTION |
792 | | Copy private symbol information from @var{isym} in the BFD |
793 | | @var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}. |
794 | | Return <<TRUE>> on success, <<FALSE>> on error. Possible error |
795 | | returns are: |
796 | | |
797 | | o <<bfd_error_no_memory>> - |
798 | | Not enough memory exists to create private data for @var{osec}. |
799 | | |
800 | | .#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ |
801 | | . BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ |
802 | | . (ibfd, isymbol, obfd, osymbol)) |
803 | | . |
804 | | */ |
805 | | |
806 | | /* The generic version of the function which returns mini symbols. |
807 | | This is used when the backend does not provide a more efficient |
808 | | version. It just uses BFD asymbol structures as mini symbols. */ |
809 | | |
810 | | long |
811 | | _bfd_generic_read_minisymbols (bfd *abfd, |
812 | | bool dynamic, |
813 | | void **minisymsp, |
814 | | unsigned int *sizep) |
815 | 0 | { |
816 | 0 | long storage; |
817 | 0 | asymbol **syms = NULL; |
818 | 0 | long symcount; |
819 | |
|
820 | 0 | if (dynamic) |
821 | 0 | storage = bfd_get_dynamic_symtab_upper_bound (abfd); |
822 | 0 | else |
823 | 0 | storage = bfd_get_symtab_upper_bound (abfd); |
824 | 0 | if (storage < 0) |
825 | 0 | goto error_return; |
826 | 0 | if (storage == 0) |
827 | 0 | return 0; |
828 | | |
829 | 0 | syms = (asymbol **) bfd_malloc (storage); |
830 | 0 | if (syms == NULL) |
831 | 0 | goto error_return; |
832 | | |
833 | 0 | if (dynamic) |
834 | 0 | symcount = bfd_canonicalize_dynamic_symtab (abfd, syms); |
835 | 0 | else |
836 | 0 | symcount = bfd_canonicalize_symtab (abfd, syms); |
837 | 0 | if (symcount < 0) |
838 | 0 | goto error_return; |
839 | | |
840 | 0 | if (symcount == 0) |
841 | | /* We return 0 above when storage is 0. Exit in the same state |
842 | | here, so as to not complicate callers with having to deal with |
843 | | freeing memory for zero symcount. */ |
844 | 0 | free (syms); |
845 | 0 | else |
846 | 0 | { |
847 | 0 | *minisymsp = syms; |
848 | 0 | *sizep = sizeof (asymbol *); |
849 | 0 | } |
850 | 0 | return symcount; |
851 | | |
852 | 0 | error_return: |
853 | 0 | bfd_set_error (bfd_error_no_symbols); |
854 | 0 | free (syms); |
855 | 0 | return -1; |
856 | 0 | } |
857 | | |
858 | | /* The generic version of the function which converts a minisymbol to |
859 | | an asymbol. We don't worry about the sym argument we are passed; |
860 | | we just return the asymbol the minisymbol points to. */ |
861 | | |
862 | | asymbol * |
863 | | _bfd_generic_minisymbol_to_symbol (bfd *abfd ATTRIBUTE_UNUSED, |
864 | | bool dynamic ATTRIBUTE_UNUSED, |
865 | | const void *minisym, |
866 | | asymbol *sym ATTRIBUTE_UNUSED) |
867 | 0 | { |
868 | 0 | return *(asymbol **) minisym; |
869 | 0 | } |
870 | | |
871 | | /* Look through stabs debugging information in .stab and .stabstr |
872 | | sections to find the source file and line closest to a desired |
873 | | location. This is used by COFF and ELF targets. It sets *pfound |
874 | | to TRUE if it finds some information. The *pinfo field is used to |
875 | | pass cached information in and out of this routine; this first time |
876 | | the routine is called for a BFD, *pinfo should be NULL. The value |
877 | | placed in *pinfo should be saved with the BFD, and passed back each |
878 | | time this function is called. */ |
879 | | |
880 | | /* We use a cache by default. */ |
881 | | |
882 | | #define ENABLE_CACHING |
883 | | |
884 | | /* We keep an array of indexentry structures to record where in the |
885 | | stabs section we should look to find line number information for a |
886 | | particular address. */ |
887 | | |
888 | | struct indexentry |
889 | | { |
890 | | bfd_vma val; |
891 | | bfd_byte *stab; |
892 | | bfd_byte *str; |
893 | | char *directory_name; |
894 | | char *file_name; |
895 | | char *function_name; |
896 | | int idx; |
897 | | }; |
898 | | |
899 | | /* Compare two indexentry structures. This is called via qsort. */ |
900 | | |
901 | | static int |
902 | | cmpindexentry (const void *a, const void *b) |
903 | 0 | { |
904 | 0 | const struct indexentry *contestantA = (const struct indexentry *) a; |
905 | 0 | const struct indexentry *contestantB = (const struct indexentry *) b; |
906 | |
|
907 | 0 | if (contestantA->val < contestantB->val) |
908 | 0 | return -1; |
909 | 0 | if (contestantA->val > contestantB->val) |
910 | 0 | return 1; |
911 | 0 | return contestantA->idx - contestantB->idx; |
912 | 0 | } |
913 | | |
914 | | /* A pointer to this structure is stored in *pinfo. */ |
915 | | |
916 | | struct stab_find_info |
917 | | { |
918 | | /* The .stab section. */ |
919 | | asection *stabsec; |
920 | | /* The .stabstr section. */ |
921 | | asection *strsec; |
922 | | /* The contents of the .stab section. */ |
923 | | bfd_byte *stabs; |
924 | | /* The contents of the .stabstr section. */ |
925 | | bfd_byte *strs; |
926 | | |
927 | | /* A table that indexes stabs by memory address. */ |
928 | | struct indexentry *indextable; |
929 | | /* The number of entries in indextable. */ |
930 | | int indextablesize; |
931 | | |
932 | | #ifdef ENABLE_CACHING |
933 | | /* Cached values to restart quickly. */ |
934 | | struct indexentry *cached_indexentry; |
935 | | bfd_vma cached_offset; |
936 | | bfd_byte *cached_stab; |
937 | | char *cached_file_name; |
938 | | #endif |
939 | | |
940 | | /* Saved ptr to malloc'ed filename. */ |
941 | | char *filename; |
942 | | }; |
943 | | |
944 | | bool |
945 | | _bfd_stab_section_find_nearest_line (bfd *abfd, |
946 | | asymbol **symbols, |
947 | | asection *section, |
948 | | bfd_vma offset, |
949 | | bool *pfound, |
950 | | const char **pfilename, |
951 | | const char **pfnname, |
952 | | unsigned int *pline, |
953 | | void **pinfo) |
954 | 0 | { |
955 | 0 | struct stab_find_info *info; |
956 | 0 | bfd_size_type stabsize, strsize; |
957 | 0 | bfd_byte *stab, *str; |
958 | 0 | bfd_byte *nul_fun, *nul_str; |
959 | 0 | bfd_size_type stroff; |
960 | 0 | struct indexentry *indexentry; |
961 | 0 | char *file_name; |
962 | 0 | char *directory_name; |
963 | 0 | bool saw_line, saw_func; |
964 | |
|
965 | 0 | *pfound = false; |
966 | 0 | *pfilename = bfd_get_filename (abfd); |
967 | 0 | *pfnname = NULL; |
968 | 0 | *pline = 0; |
969 | | |
970 | | /* Stabs entries use a 12 byte format: |
971 | | 4 byte string table index |
972 | | 1 byte stab type |
973 | | 1 byte stab other field |
974 | | 2 byte stab desc field |
975 | | 4 byte stab value |
976 | | FIXME: This will have to change for a 64 bit object format. |
977 | | |
978 | | The stabs symbols are divided into compilation units. For the |
979 | | first entry in each unit, the type of 0, the value is the length |
980 | | of the string table for this unit, and the desc field is the |
981 | | number of stabs symbols for this unit. */ |
982 | |
|
983 | 0 | #define STRDXOFF (0) |
984 | 0 | #define TYPEOFF (4) |
985 | 0 | #define OTHEROFF (5) |
986 | 0 | #define DESCOFF (6) |
987 | 0 | #define VALOFF (8) |
988 | 0 | #define STABSIZE (12) |
989 | |
|
990 | 0 | info = (struct stab_find_info *) *pinfo; |
991 | 0 | if (info != NULL) |
992 | 0 | { |
993 | 0 | if (info->stabsec == NULL || info->strsec == NULL) |
994 | 0 | { |
995 | | /* No usable stabs debugging information. */ |
996 | 0 | return true; |
997 | 0 | } |
998 | | |
999 | 0 | stabsize = (info->stabsec->rawsize |
1000 | 0 | ? info->stabsec->rawsize |
1001 | 0 | : info->stabsec->size); |
1002 | 0 | strsize = (info->strsec->rawsize |
1003 | 0 | ? info->strsec->rawsize |
1004 | 0 | : info->strsec->size); |
1005 | 0 | } |
1006 | 0 | else |
1007 | 0 | { |
1008 | 0 | long reloc_size, reloc_count; |
1009 | 0 | arelent **reloc_vector; |
1010 | 0 | int i; |
1011 | 0 | char *function_name; |
1012 | 0 | bfd_size_type amt = sizeof *info; |
1013 | |
|
1014 | 0 | info = (struct stab_find_info *) bfd_zalloc (abfd, amt); |
1015 | 0 | if (info == NULL) |
1016 | 0 | return false; |
1017 | 0 | *pinfo = info; |
1018 | | |
1019 | | /* FIXME: When using the linker --split-by-file or |
1020 | | --split-by-reloc options, it is possible for the .stab and |
1021 | | .stabstr sections to be split. We should handle that. */ |
1022 | |
|
1023 | 0 | info->stabsec = bfd_get_section_by_name (abfd, ".stab"); |
1024 | 0 | info->strsec = bfd_get_section_by_name (abfd, ".stabstr"); |
1025 | |
|
1026 | 0 | if (info->stabsec == NULL || info->strsec == NULL) |
1027 | 0 | { |
1028 | | /* Try SOM section names. */ |
1029 | 0 | info->stabsec = bfd_get_section_by_name (abfd, "$GDB_SYMBOLS$"); |
1030 | 0 | info->strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); |
1031 | |
|
1032 | 0 | if (info->stabsec == NULL || info->strsec == NULL) |
1033 | 0 | return true; |
1034 | 0 | } |
1035 | | |
1036 | 0 | if ((info->stabsec->flags & SEC_HAS_CONTENTS) == 0 |
1037 | 0 | || (info->strsec->flags & SEC_HAS_CONTENTS) == 0) |
1038 | 0 | goto out; |
1039 | | |
1040 | 0 | stabsize = (info->stabsec->rawsize |
1041 | 0 | ? info->stabsec->rawsize |
1042 | 0 | : info->stabsec->size); |
1043 | 0 | stabsize = (stabsize / STABSIZE) * STABSIZE; |
1044 | 0 | strsize = (info->strsec->rawsize |
1045 | 0 | ? info->strsec->rawsize |
1046 | 0 | : info->strsec->size); |
1047 | |
|
1048 | 0 | if (stabsize == 0 || strsize == 0) |
1049 | 0 | goto out; |
1050 | | |
1051 | 0 | if (!bfd_malloc_and_get_section (abfd, info->stabsec, &info->stabs)) |
1052 | 0 | goto out; |
1053 | 0 | if (!bfd_malloc_and_get_section (abfd, info->strsec, &info->strs)) |
1054 | 0 | goto out1; |
1055 | | |
1056 | | /* Stab strings ought to be nul terminated. Ensure the last one |
1057 | | is, to prevent running off the end of the buffer. */ |
1058 | 0 | info->strs[strsize - 1] = 0; |
1059 | | |
1060 | | /* If this is a relocatable object file, we have to relocate |
1061 | | the entries in .stab. This should always be simple 32 bit |
1062 | | relocations against symbols defined in this object file, so |
1063 | | this should be no big deal. */ |
1064 | 0 | reloc_size = bfd_get_reloc_upper_bound (abfd, info->stabsec); |
1065 | 0 | if (reloc_size < 0) |
1066 | 0 | goto out2; |
1067 | 0 | reloc_vector = (arelent **) bfd_malloc (reloc_size); |
1068 | 0 | if (reloc_vector == NULL && reloc_size != 0) |
1069 | 0 | goto out2; |
1070 | 0 | reloc_count = bfd_canonicalize_reloc (abfd, info->stabsec, reloc_vector, |
1071 | 0 | symbols); |
1072 | 0 | if (reloc_count < 0) |
1073 | 0 | { |
1074 | 0 | out3: |
1075 | 0 | free (reloc_vector); |
1076 | 0 | out2: |
1077 | 0 | free (info->strs); |
1078 | 0 | info->strs = NULL; |
1079 | 0 | out1: |
1080 | 0 | free (info->stabs); |
1081 | 0 | info->stabs = NULL; |
1082 | 0 | out: |
1083 | 0 | info->stabsec = NULL; |
1084 | 0 | return false; |
1085 | 0 | } |
1086 | 0 | if (reloc_count > 0) |
1087 | 0 | { |
1088 | 0 | arelent **pr; |
1089 | |
|
1090 | 0 | for (pr = reloc_vector; *pr != NULL; pr++) |
1091 | 0 | { |
1092 | 0 | arelent *r; |
1093 | 0 | unsigned long val; |
1094 | 0 | asymbol *sym; |
1095 | 0 | bfd_size_type octets; |
1096 | |
|
1097 | 0 | r = *pr; |
1098 | | /* Ignore R_*_NONE relocs. */ |
1099 | 0 | if (r->howto->dst_mask == 0) |
1100 | 0 | continue; |
1101 | | |
1102 | 0 | octets = r->address * bfd_octets_per_byte (abfd, NULL); |
1103 | 0 | if (r->howto->rightshift != 0 |
1104 | 0 | || bfd_get_reloc_size (r->howto) != 4 |
1105 | 0 | || r->howto->bitsize != 32 |
1106 | 0 | || r->howto->pc_relative |
1107 | 0 | || r->howto->bitpos != 0 |
1108 | 0 | || r->howto->dst_mask != 0xffffffff |
1109 | 0 | || octets > stabsize - 4) |
1110 | 0 | { |
1111 | 0 | _bfd_error_handler |
1112 | 0 | (_("unsupported .stab relocation")); |
1113 | 0 | bfd_set_error (bfd_error_invalid_operation); |
1114 | 0 | goto out3; |
1115 | 0 | } |
1116 | | |
1117 | 0 | val = bfd_get_32 (abfd, info->stabs + octets); |
1118 | 0 | val &= r->howto->src_mask; |
1119 | 0 | sym = *r->sym_ptr_ptr; |
1120 | 0 | val += sym->value + sym->section->vma + r->addend; |
1121 | 0 | bfd_put_32 (abfd, (bfd_vma) val, info->stabs + octets); |
1122 | 0 | } |
1123 | 0 | } |
1124 | | |
1125 | 0 | free (reloc_vector); |
1126 | | |
1127 | | /* First time through this function, build a table matching |
1128 | | function VM addresses to stabs, then sort based on starting |
1129 | | VM address. Do this in two passes: once to count how many |
1130 | | table entries we'll need, and a second to actually build the |
1131 | | table. */ |
1132 | |
|
1133 | 0 | info->indextablesize = 0; |
1134 | 0 | nul_fun = NULL; |
1135 | 0 | for (stab = info->stabs; stab < info->stabs + stabsize; stab += STABSIZE) |
1136 | 0 | { |
1137 | 0 | if (stab[TYPEOFF] == (bfd_byte) N_SO) |
1138 | 0 | { |
1139 | | /* if we did not see a function def, leave space for one. */ |
1140 | 0 | if (nul_fun != NULL) |
1141 | 0 | ++info->indextablesize; |
1142 | | |
1143 | | /* N_SO with null name indicates EOF */ |
1144 | 0 | if (bfd_get_32 (abfd, stab + STRDXOFF) == 0) |
1145 | 0 | nul_fun = NULL; |
1146 | 0 | else |
1147 | 0 | { |
1148 | 0 | nul_fun = stab; |
1149 | | |
1150 | | /* two N_SO's in a row is a filename and directory. Skip */ |
1151 | 0 | if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize |
1152 | 0 | && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO) |
1153 | 0 | stab += STABSIZE; |
1154 | 0 | } |
1155 | 0 | } |
1156 | 0 | else if (stab[TYPEOFF] == (bfd_byte) N_FUN |
1157 | 0 | && bfd_get_32 (abfd, stab + STRDXOFF) != 0) |
1158 | 0 | { |
1159 | 0 | nul_fun = NULL; |
1160 | 0 | ++info->indextablesize; |
1161 | 0 | } |
1162 | 0 | } |
1163 | |
|
1164 | 0 | if (nul_fun != NULL) |
1165 | 0 | ++info->indextablesize; |
1166 | |
|
1167 | 0 | if (info->indextablesize == 0) |
1168 | 0 | { |
1169 | 0 | free (info->strs); |
1170 | 0 | info->strs = NULL; |
1171 | 0 | free (info->stabs); |
1172 | 0 | info->stabs = NULL; |
1173 | 0 | info->stabsec = NULL; |
1174 | 0 | return true; |
1175 | 0 | } |
1176 | 0 | ++info->indextablesize; |
1177 | |
|
1178 | 0 | amt = info->indextablesize; |
1179 | 0 | amt *= sizeof (struct indexentry); |
1180 | 0 | info->indextable = (struct indexentry *) bfd_malloc (amt); |
1181 | 0 | if (info->indextable == NULL) |
1182 | 0 | goto out3; |
1183 | | |
1184 | 0 | file_name = NULL; |
1185 | 0 | directory_name = NULL; |
1186 | 0 | nul_fun = NULL; |
1187 | 0 | stroff = 0; |
1188 | |
|
1189 | 0 | for (i = 0, stab = info->stabs, nul_str = str = info->strs; |
1190 | 0 | i < info->indextablesize && stab < info->stabs + stabsize; |
1191 | 0 | stab += STABSIZE) |
1192 | 0 | { |
1193 | 0 | switch (stab[TYPEOFF]) |
1194 | 0 | { |
1195 | 0 | case 0: |
1196 | | /* This is the first entry in a compilation unit. */ |
1197 | 0 | if ((bfd_size_type) ((info->strs + strsize) - str) < stroff) |
1198 | 0 | break; |
1199 | 0 | str += stroff; |
1200 | 0 | stroff = bfd_get_32 (abfd, stab + VALOFF); |
1201 | 0 | break; |
1202 | | |
1203 | 0 | case N_SO: |
1204 | | /* The main file name. */ |
1205 | | |
1206 | | /* The following code creates a new indextable entry with |
1207 | | a NULL function name if there were no N_FUNs in a file. |
1208 | | Note that a N_SO without a file name is an EOF and |
1209 | | there could be 2 N_SO following it with the new filename |
1210 | | and directory. */ |
1211 | 0 | if (nul_fun != NULL) |
1212 | 0 | { |
1213 | 0 | info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF); |
1214 | 0 | info->indextable[i].stab = nul_fun; |
1215 | 0 | info->indextable[i].str = nul_str; |
1216 | 0 | info->indextable[i].directory_name = directory_name; |
1217 | 0 | info->indextable[i].file_name = file_name; |
1218 | 0 | info->indextable[i].function_name = NULL; |
1219 | 0 | info->indextable[i].idx = i; |
1220 | 0 | ++i; |
1221 | 0 | } |
1222 | |
|
1223 | 0 | directory_name = NULL; |
1224 | 0 | file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); |
1225 | 0 | if (file_name == (char *) str) |
1226 | 0 | { |
1227 | 0 | file_name = NULL; |
1228 | 0 | nul_fun = NULL; |
1229 | 0 | } |
1230 | 0 | else |
1231 | 0 | { |
1232 | 0 | nul_fun = stab; |
1233 | 0 | nul_str = str; |
1234 | 0 | if (file_name >= (char *) info->strs + strsize |
1235 | 0 | || file_name < (char *) str) |
1236 | 0 | file_name = NULL; |
1237 | 0 | if (stab + STABSIZE + TYPEOFF < info->stabs + stabsize |
1238 | 0 | && *(stab + STABSIZE + TYPEOFF) == (bfd_byte) N_SO) |
1239 | 0 | { |
1240 | | /* Two consecutive N_SOs are a directory and a |
1241 | | file name. */ |
1242 | 0 | stab += STABSIZE; |
1243 | 0 | directory_name = file_name; |
1244 | 0 | file_name = ((char *) str |
1245 | 0 | + bfd_get_32 (abfd, stab + STRDXOFF)); |
1246 | 0 | if (file_name >= (char *) info->strs + strsize |
1247 | 0 | || file_name < (char *) str) |
1248 | 0 | file_name = NULL; |
1249 | 0 | } |
1250 | 0 | } |
1251 | 0 | break; |
1252 | | |
1253 | 0 | case N_SOL: |
1254 | | /* The name of an include file. */ |
1255 | 0 | file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); |
1256 | | /* PR 17512: file: 0c680a1f. */ |
1257 | | /* PR 17512: file: 5da8aec4. */ |
1258 | 0 | if (file_name >= (char *) info->strs + strsize |
1259 | 0 | || file_name < (char *) str) |
1260 | 0 | file_name = NULL; |
1261 | 0 | break; |
1262 | | |
1263 | 0 | case N_FUN: |
1264 | | /* A function name. */ |
1265 | 0 | function_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); |
1266 | 0 | if (function_name == (char *) str) |
1267 | 0 | continue; |
1268 | 0 | if (function_name >= (char *) info->strs + strsize |
1269 | 0 | || function_name < (char *) str) |
1270 | 0 | function_name = NULL; |
1271 | |
|
1272 | 0 | nul_fun = NULL; |
1273 | 0 | info->indextable[i].val = bfd_get_32 (abfd, stab + VALOFF); |
1274 | 0 | info->indextable[i].stab = stab; |
1275 | 0 | info->indextable[i].str = str; |
1276 | 0 | info->indextable[i].directory_name = directory_name; |
1277 | 0 | info->indextable[i].file_name = file_name; |
1278 | 0 | info->indextable[i].function_name = function_name; |
1279 | 0 | info->indextable[i].idx = i; |
1280 | 0 | ++i; |
1281 | 0 | break; |
1282 | 0 | } |
1283 | 0 | } |
1284 | | |
1285 | 0 | if (nul_fun != NULL) |
1286 | 0 | { |
1287 | 0 | info->indextable[i].val = bfd_get_32 (abfd, nul_fun + VALOFF); |
1288 | 0 | info->indextable[i].stab = nul_fun; |
1289 | 0 | info->indextable[i].str = nul_str; |
1290 | 0 | info->indextable[i].directory_name = directory_name; |
1291 | 0 | info->indextable[i].file_name = file_name; |
1292 | 0 | info->indextable[i].function_name = NULL; |
1293 | 0 | info->indextable[i].idx = i; |
1294 | 0 | ++i; |
1295 | 0 | } |
1296 | |
|
1297 | 0 | info->indextable[i].val = (bfd_vma) -1; |
1298 | 0 | info->indextable[i].stab = info->stabs + stabsize; |
1299 | 0 | info->indextable[i].str = str; |
1300 | 0 | info->indextable[i].directory_name = NULL; |
1301 | 0 | info->indextable[i].file_name = NULL; |
1302 | 0 | info->indextable[i].function_name = NULL; |
1303 | 0 | info->indextable[i].idx = i; |
1304 | 0 | ++i; |
1305 | |
|
1306 | 0 | info->indextablesize = i; |
1307 | 0 | qsort (info->indextable, (size_t) i, sizeof (struct indexentry), |
1308 | 0 | cmpindexentry); |
1309 | 0 | } |
1310 | | |
1311 | | /* We are passed a section relative offset. The offsets in the |
1312 | | stabs information are absolute. */ |
1313 | 0 | offset += bfd_section_vma (section); |
1314 | |
|
1315 | 0 | #ifdef ENABLE_CACHING |
1316 | 0 | if (info->cached_indexentry != NULL |
1317 | 0 | && offset >= info->cached_offset |
1318 | 0 | && offset < (info->cached_indexentry + 1)->val) |
1319 | 0 | { |
1320 | 0 | stab = info->cached_stab; |
1321 | 0 | indexentry = info->cached_indexentry; |
1322 | 0 | file_name = info->cached_file_name; |
1323 | 0 | } |
1324 | 0 | else |
1325 | 0 | #endif |
1326 | 0 | { |
1327 | 0 | long low, high; |
1328 | 0 | long mid = -1; |
1329 | | |
1330 | | /* Cache non-existent or invalid. Do binary search on |
1331 | | indextable. */ |
1332 | 0 | indexentry = NULL; |
1333 | |
|
1334 | 0 | low = 0; |
1335 | 0 | high = info->indextablesize - 1; |
1336 | 0 | while (low != high) |
1337 | 0 | { |
1338 | 0 | mid = (high + low) / 2; |
1339 | 0 | if (offset >= info->indextable[mid].val |
1340 | 0 | && offset < info->indextable[mid + 1].val) |
1341 | 0 | { |
1342 | 0 | indexentry = &info->indextable[mid]; |
1343 | 0 | break; |
1344 | 0 | } |
1345 | | |
1346 | 0 | if (info->indextable[mid].val > offset) |
1347 | 0 | high = mid; |
1348 | 0 | else |
1349 | 0 | low = mid + 1; |
1350 | 0 | } |
1351 | |
|
1352 | 0 | if (indexentry == NULL) |
1353 | 0 | return true; |
1354 | | |
1355 | 0 | stab = indexentry->stab + STABSIZE; |
1356 | 0 | file_name = indexentry->file_name; |
1357 | 0 | } |
1358 | | |
1359 | 0 | directory_name = indexentry->directory_name; |
1360 | 0 | str = indexentry->str; |
1361 | |
|
1362 | 0 | saw_line = false; |
1363 | 0 | saw_func = false; |
1364 | 0 | for (; stab < (indexentry+1)->stab; stab += STABSIZE) |
1365 | 0 | { |
1366 | 0 | bool done; |
1367 | 0 | bfd_vma val; |
1368 | |
|
1369 | 0 | done = false; |
1370 | |
|
1371 | 0 | switch (stab[TYPEOFF]) |
1372 | 0 | { |
1373 | 0 | case N_SOL: |
1374 | | /* The name of an include file. */ |
1375 | 0 | val = bfd_get_32 (abfd, stab + VALOFF); |
1376 | 0 | if (val <= offset) |
1377 | 0 | { |
1378 | 0 | file_name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); |
1379 | 0 | if (file_name >= (char *) info->strs + strsize |
1380 | 0 | || file_name < (char *) str) |
1381 | 0 | file_name = NULL; |
1382 | 0 | *pline = 0; |
1383 | 0 | } |
1384 | 0 | break; |
1385 | | |
1386 | 0 | case N_SLINE: |
1387 | 0 | case N_DSLINE: |
1388 | 0 | case N_BSLINE: |
1389 | | /* A line number. If the function was specified, then the value |
1390 | | is relative to the start of the function. Otherwise, the |
1391 | | value is an absolute address. */ |
1392 | 0 | val = ((indexentry->function_name ? indexentry->val : 0) |
1393 | 0 | + bfd_get_32 (abfd, stab + VALOFF)); |
1394 | | /* If this line starts before our desired offset, or if it's |
1395 | | the first line we've been able to find, use it. The |
1396 | | !saw_line check works around a bug in GCC 2.95.3, which emits |
1397 | | the first N_SLINE late. */ |
1398 | 0 | if (!saw_line || val <= offset) |
1399 | 0 | { |
1400 | 0 | *pline = bfd_get_16 (abfd, stab + DESCOFF); |
1401 | |
|
1402 | 0 | #ifdef ENABLE_CACHING |
1403 | 0 | info->cached_stab = stab; |
1404 | 0 | info->cached_offset = val; |
1405 | 0 | info->cached_file_name = file_name; |
1406 | 0 | info->cached_indexentry = indexentry; |
1407 | 0 | #endif |
1408 | 0 | } |
1409 | 0 | if (val > offset) |
1410 | 0 | done = true; |
1411 | 0 | saw_line = true; |
1412 | 0 | break; |
1413 | | |
1414 | 0 | case N_FUN: |
1415 | 0 | case N_SO: |
1416 | 0 | if (saw_func || saw_line) |
1417 | 0 | done = true; |
1418 | 0 | saw_func = true; |
1419 | 0 | break; |
1420 | 0 | } |
1421 | | |
1422 | 0 | if (done) |
1423 | 0 | break; |
1424 | 0 | } |
1425 | | |
1426 | 0 | *pfound = true; |
1427 | |
|
1428 | 0 | if (file_name == NULL || IS_ABSOLUTE_PATH (file_name) |
1429 | 0 | || directory_name == NULL) |
1430 | 0 | *pfilename = file_name; |
1431 | 0 | else |
1432 | 0 | { |
1433 | 0 | size_t dirlen; |
1434 | |
|
1435 | 0 | dirlen = strlen (directory_name); |
1436 | 0 | if (info->filename == NULL |
1437 | 0 | || filename_ncmp (info->filename, directory_name, dirlen) != 0 |
1438 | 0 | || filename_cmp (info->filename + dirlen, file_name) != 0) |
1439 | 0 | { |
1440 | 0 | size_t len; |
1441 | | |
1442 | | /* Don't free info->filename here. objdump and other |
1443 | | apps keep a copy of a previously returned file name |
1444 | | pointer. */ |
1445 | 0 | len = strlen (file_name) + 1; |
1446 | 0 | info->filename = (char *) bfd_alloc (abfd, dirlen + len); |
1447 | 0 | if (info->filename == NULL) |
1448 | 0 | return false; |
1449 | 0 | memcpy (info->filename, directory_name, dirlen); |
1450 | 0 | memcpy (info->filename + dirlen, file_name, len); |
1451 | 0 | } |
1452 | | |
1453 | 0 | *pfilename = info->filename; |
1454 | 0 | } |
1455 | | |
1456 | 0 | if (indexentry->function_name != NULL) |
1457 | 0 | { |
1458 | 0 | char *s; |
1459 | | |
1460 | | /* This will typically be something like main:F(0,1), so we want |
1461 | | to clobber the colon. It's OK to change the name, since the |
1462 | | string is in our own local storage anyhow. */ |
1463 | 0 | s = strchr (indexentry->function_name, ':'); |
1464 | 0 | if (s != NULL) |
1465 | 0 | *s = '\0'; |
1466 | |
|
1467 | 0 | *pfnname = indexentry->function_name; |
1468 | 0 | } |
1469 | |
|
1470 | 0 | return true; |
1471 | 0 | } |
1472 | | |
1473 | | void |
1474 | | _bfd_stab_cleanup (bfd *abfd ATTRIBUTE_UNUSED, void **pinfo) |
1475 | 4.23k | { |
1476 | 4.23k | struct stab_find_info *info = (struct stab_find_info *) *pinfo; |
1477 | 4.23k | if (info == NULL) |
1478 | 4.23k | return; |
1479 | | |
1480 | 0 | free (info->indextable); |
1481 | 0 | free (info->strs); |
1482 | 0 | free (info->stabs); |
1483 | 0 | } |
1484 | | |
1485 | | long |
1486 | | _bfd_nosymbols_canonicalize_symtab (bfd *abfd ATTRIBUTE_UNUSED, |
1487 | | asymbol **location ATTRIBUTE_UNUSED) |
1488 | 0 | { |
1489 | 0 | return 0; |
1490 | 0 | } |
1491 | | |
1492 | | void |
1493 | | _bfd_nosymbols_print_symbol (bfd *abfd ATTRIBUTE_UNUSED, |
1494 | | void *afile ATTRIBUTE_UNUSED, |
1495 | | asymbol *symbol ATTRIBUTE_UNUSED, |
1496 | | bfd_print_symbol_type how ATTRIBUTE_UNUSED) |
1497 | 0 | { |
1498 | 0 | } |
1499 | | |
1500 | | void |
1501 | | _bfd_nosymbols_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, |
1502 | | asymbol *sym ATTRIBUTE_UNUSED, |
1503 | | symbol_info *ret ATTRIBUTE_UNUSED) |
1504 | 0 | { |
1505 | 0 | } |
1506 | | |
1507 | | const char * |
1508 | | _bfd_nosymbols_get_symbol_version_string (bfd *abfd, |
1509 | | asymbol *symbol ATTRIBUTE_UNUSED, |
1510 | | bool base_p ATTRIBUTE_UNUSED, |
1511 | | bool *hidden ATTRIBUTE_UNUSED) |
1512 | 0 | { |
1513 | 0 | return (const char *) _bfd_ptr_bfd_null_error (abfd); |
1514 | 0 | } |
1515 | | |
1516 | | bool |
1517 | | _bfd_nosymbols_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, |
1518 | | const char *name ATTRIBUTE_UNUSED) |
1519 | 0 | { |
1520 | 0 | return false; |
1521 | 0 | } |
1522 | | |
1523 | | alent * |
1524 | | _bfd_nosymbols_get_lineno (bfd *abfd, asymbol *sym ATTRIBUTE_UNUSED) |
1525 | 0 | { |
1526 | 0 | return (alent *) _bfd_ptr_bfd_null_error (abfd); |
1527 | 0 | } |
1528 | | |
1529 | | bool |
1530 | | _bfd_nosymbols_find_nearest_line |
1531 | | (bfd *abfd, |
1532 | | asymbol **symbols ATTRIBUTE_UNUSED, |
1533 | | asection *section ATTRIBUTE_UNUSED, |
1534 | | bfd_vma offset ATTRIBUTE_UNUSED, |
1535 | | const char **filename_ptr ATTRIBUTE_UNUSED, |
1536 | | const char **functionname_ptr ATTRIBUTE_UNUSED, |
1537 | | unsigned int *line_ptr ATTRIBUTE_UNUSED, |
1538 | | unsigned int *discriminator_ptr ATTRIBUTE_UNUSED) |
1539 | 0 | { |
1540 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1541 | 0 | } |
1542 | | |
1543 | | bool |
1544 | | _bfd_nosymbols_find_nearest_line_with_alt |
1545 | | (bfd *abfd, |
1546 | | const char *alt_filename ATTRIBUTE_UNUSED, |
1547 | | asymbol **symbols ATTRIBUTE_UNUSED, |
1548 | | asection *section ATTRIBUTE_UNUSED, |
1549 | | bfd_vma offset ATTRIBUTE_UNUSED, |
1550 | | const char **filename_ptr ATTRIBUTE_UNUSED, |
1551 | | const char **functionname_ptr ATTRIBUTE_UNUSED, |
1552 | | unsigned int *line_ptr ATTRIBUTE_UNUSED, |
1553 | | unsigned int *discriminator_ptr ATTRIBUTE_UNUSED) |
1554 | 0 | { |
1555 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1556 | 0 | } |
1557 | | |
1558 | | bool |
1559 | | _bfd_nosymbols_find_line (bfd *abfd, |
1560 | | asymbol **symbols ATTRIBUTE_UNUSED, |
1561 | | asymbol *symbol ATTRIBUTE_UNUSED, |
1562 | | const char **filename_ptr ATTRIBUTE_UNUSED, |
1563 | | unsigned int *line_ptr ATTRIBUTE_UNUSED) |
1564 | 0 | { |
1565 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1566 | 0 | } |
1567 | | |
1568 | | bool |
1569 | | _bfd_nosymbols_find_inliner_info |
1570 | | (bfd *abfd, |
1571 | | const char **filename_ptr ATTRIBUTE_UNUSED, |
1572 | | const char **functionname_ptr ATTRIBUTE_UNUSED, |
1573 | | unsigned int *line_ptr ATTRIBUTE_UNUSED) |
1574 | 0 | { |
1575 | 0 | return _bfd_bool_bfd_false_error (abfd); |
1576 | 0 | } |
1577 | | |
1578 | | asymbol * |
1579 | | _bfd_nosymbols_bfd_make_debug_symbol (bfd *abfd) |
1580 | 0 | { |
1581 | 0 | return (asymbol *) _bfd_ptr_bfd_null_error (abfd); |
1582 | 0 | } |
1583 | | |
1584 | | long |
1585 | | _bfd_nosymbols_read_minisymbols (bfd *abfd, |
1586 | | bool dynamic ATTRIBUTE_UNUSED, |
1587 | | void **minisymsp ATTRIBUTE_UNUSED, |
1588 | | unsigned int *sizep ATTRIBUTE_UNUSED) |
1589 | 0 | { |
1590 | 0 | return _bfd_long_bfd_n1_error (abfd); |
1591 | 0 | } |
1592 | | |
1593 | | asymbol * |
1594 | | _bfd_nosymbols_minisymbol_to_symbol (bfd *abfd, |
1595 | | bool dynamic ATTRIBUTE_UNUSED, |
1596 | | const void *minisym ATTRIBUTE_UNUSED, |
1597 | | asymbol *sym ATTRIBUTE_UNUSED) |
1598 | 0 | { |
1599 | 0 | return (asymbol *) _bfd_ptr_bfd_null_error (abfd); |
1600 | 0 | } |
1601 | | |
1602 | | long |
1603 | | _bfd_nodynamic_get_synthetic_symtab (bfd *abfd, |
1604 | | long symcount ATTRIBUTE_UNUSED, |
1605 | | asymbol **syms ATTRIBUTE_UNUSED, |
1606 | | long dynsymcount ATTRIBUTE_UNUSED, |
1607 | | asymbol **dynsyms ATTRIBUTE_UNUSED, |
1608 | | asymbol **ret ATTRIBUTE_UNUSED) |
1609 | 0 | { |
1610 | 0 | return _bfd_long_bfd_n1_error (abfd); |
1611 | 0 | } |