GDB (xrefs)
/tmp/gdb-8.1/gdb/minsyms.c
Go to the documentation of this file.
1 /* GDB routines for manipulating the minimal symbol tables.
2  Copyright (C) 1992-2018 Free Software Foundation, Inc.
3  Contributed by Cygnus Support, using pieces from other GDB modules.
4 
5  This file is part of GDB.
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, see <http://www.gnu.org/licenses/>. */
19 
20 
21 /* This file contains support routines for creating, manipulating, and
22  destroying minimal symbol tables.
23 
24  Minimal symbol tables are used to hold some very basic information about
25  all defined global symbols (text, data, bss, abs, etc). The only two
26  required pieces of information are the symbol's name and the address
27  associated with that symbol.
28 
29  In many cases, even if a file was compiled with no special options for
30  debugging at all, as long as was not stripped it will contain sufficient
31  information to build useful minimal symbol tables using this structure.
32 
33  Even when a file contains enough debugging information to build a full
34  symbol table, these minimal symbols are still useful for quickly mapping
35  between names and addresses, and vice versa. They are also sometimes used
36  to figure out what full symbol table entries need to be read in. */
37 
38 
39 #include "defs.h"
40 #include <ctype.h>
41 #include "symtab.h"
42 #include "bfd.h"
43 #include "filenames.h"
44 #include "symfile.h"
45 #include "objfiles.h"
46 #include "demangle.h"
47 #include "value.h"
48 #include "cp-abi.h"
49 #include "target.h"
50 #include "cp-support.h"
51 #include "language.h"
52 #include "cli/cli-utils.h"
53 #include "symbol.h"
54 #include <algorithm>
55 #include "safe-ctype.h"
56 
57 /* See minsyms.h. */
58 
59 bool
61  CORE_ADDR *func_address_p)
62 {
63  CORE_ADDR msym_addr = MSYMBOL_VALUE_ADDRESS (objfile, minsym);
64 
65  switch (minsym->type)
66  {
67  case mst_slot_got_plt:
68  case mst_data:
69  case mst_bss:
70  case mst_abs:
71  case mst_file_data:
72  case mst_file_bss:
73  {
77  if (pc != msym_addr)
78  {
79  if (func_address_p != NULL)
80  *func_address_p = pc;
81  return true;
82  }
83  return false;
84  }
85  default:
86  if (func_address_p != NULL)
87  *func_address_p = msym_addr;
88  return true;
89  }
90 }
91 
92 /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
93  At the end, copy them all into one newly allocated location on an objfile's
94  per-BFD storage obstack. */
95 
96 #define BUNCH_SIZE 127
97 
98 struct msym_bunch
99  {
100  struct msym_bunch *next;
102  };
103 
104 /* See minsyms.h. */
105 
106 unsigned int
107 msymbol_hash_iw (const char *string)
108 {
109  unsigned int hash = 0;
110 
111  while (*string && *string != '(')
112  {
113  string = skip_spaces (string);
114  if (*string && *string != '(')
115  {
116  hash = SYMBOL_HASH_NEXT (hash, *string);
117  ++string;
118  }
119  }
120  return hash;
121 }
122 
123 /* See minsyms.h. */
124 
125 unsigned int
126 msymbol_hash (const char *string)
127 {
128  unsigned int hash = 0;
129 
130  for (; *string; ++string)
131  hash = SYMBOL_HASH_NEXT (hash, *string);
132  return hash;
133 }
134 
135 /* Add the minimal symbol SYM to an objfile's minsym hash table, TABLE. */
136 static void
138  struct minimal_symbol **table)
139 {
140  if (sym->hash_next == NULL)
141  {
142  unsigned int hash
144 
145  sym->hash_next = table[hash];
146  table[hash] = sym;
147  }
148 }
149 
150 /* Add the minimal symbol SYM to an objfile's minsym demangled hash table,
151  TABLE. */
152 static void
154  struct objfile *objfile)
155 {
156  if (sym->demangled_hash_next == NULL)
157  {
158  unsigned int hash = search_name_hash (MSYMBOL_LANGUAGE (sym),
159  MSYMBOL_SEARCH_NAME (sym));
160 
162  auto it = std::lower_bound (vec.begin (), vec.end (),
163  MSYMBOL_LANGUAGE (sym));
164  if (it == vec.end () || *it != MSYMBOL_LANGUAGE (sym))
165  vec.insert (it, MSYMBOL_LANGUAGE (sym));
166 
167  struct minimal_symbol **table
169  unsigned int hash_index = hash % MINIMAL_SYMBOL_HASH_SIZE;
170  sym->demangled_hash_next = table[hash_index];
171  table[hash_index] = sym;
172  }
173 }
174 
175 /* Worker object for lookup_minimal_symbol. Stores temporary results
176  while walking the symbol tables. */
177 
179 {
180  /* External symbols are best. */
182 
183  /* File-local symbols are next best. */
185 
186  /* Symbols for shared library trampolines are next best. */
188 
189  /* Called when a symbol name matches. Check if the minsym is a
190  better type than what we had already found, and record it in one
191  of the members fields if so. Returns true if we collected the
192  real symbol, in which case we can stop searching. */
193  bool maybe_collect (const char *sfile, objfile *objf,
194  minimal_symbol *msymbol);
195 };
196 
197 /* See declaration above. */
198 
199 bool
201  struct objfile *objfile,
202  minimal_symbol *msymbol)
203 {
204  switch (MSYMBOL_TYPE (msymbol))
205  {
206  case mst_file_text:
207  case mst_file_data:
208  case mst_file_bss:
209  if (sfile == NULL
210  || filename_cmp (msymbol->filename, sfile) == 0)
211  {
212  file_symbol.minsym = msymbol;
214  }
215  break;
216 
218 
219  /* If a trampoline symbol is found, we prefer to keep
220  looking for the *real* symbol. If the actual symbol
221  is not found, then we'll use the trampoline
222  entry. */
223  if (trampoline_symbol.minsym == NULL)
224  {
225  trampoline_symbol.minsym = msymbol;
227  }
228  break;
229 
230  case mst_unknown:
231  default:
232  external_symbol.minsym = msymbol;
234  /* We have the real symbol. No use looking further. */
235  return true;
236  }
237 
238  /* Keep looking. */
239  return false;
240 }
241 
242 /* Walk the mangled name hash table, and pass each symbol whose name
243  matches LOOKUP_NAME according to NAMECMP to FOUND. */
244 
245 static void
246 lookup_minimal_symbol_mangled (const char *lookup_name,
247  const char *sfile,
248  struct objfile *objfile,
249  struct minimal_symbol **table,
250  unsigned int hash,
251  int (*namecmp) (const char *, const char *),
252  found_minimal_symbols &found)
253 {
254  for (minimal_symbol *msymbol = table[hash];
255  msymbol != NULL;
256  msymbol = msymbol->hash_next)
257  {
258  const char *symbol_name = MSYMBOL_LINKAGE_NAME (msymbol);
259 
260  if (namecmp (symbol_name, lookup_name) == 0
261  && found.maybe_collect (sfile, objfile, msymbol))
262  return;
263  }
264 }
265 
266 /* Walk the demangled name hash table, and pass each symbol whose name
267  matches LOOKUP_NAME according to MATCHER to FOUND. */
268 
269 static void
271  const char *sfile,
272  struct objfile *objfile,
273  struct minimal_symbol **table,
274  unsigned int hash,
275  symbol_name_matcher_ftype *matcher,
276  found_minimal_symbols &found)
277 {
278  for (minimal_symbol *msymbol = table[hash];
279  msymbol != NULL;
280  msymbol = msymbol->demangled_hash_next)
281  {
282  const char *symbol_name = MSYMBOL_SEARCH_NAME (msymbol);
283 
284  if (matcher (symbol_name, lookup_name, NULL)
285  && found.maybe_collect (sfile, objfile, msymbol))
286  return;
287  }
288 }
289 
290 /* Look through all the current minimal symbol tables and find the
291  first minimal symbol that matches NAME. If OBJF is non-NULL, limit
292  the search to that objfile. If SFILE is non-NULL, the only file-scope
293  symbols considered will be from that source file (global symbols are
294  still preferred). Returns a pointer to the minimal symbol that
295  matches, or NULL if no match is found.
296 
297  Note: One instance where there may be duplicate minimal symbols with
298  the same name is when the symbol tables for a shared library and the
299  symbol tables for an executable contain global symbols with the same
300  names (the dynamic linker deals with the duplication).
301 
302  It's also possible to have minimal symbols with different mangled
303  names, but identical demangled names. For example, the GNU C++ v3
304  ABI requires the generation of two (or perhaps three) copies of
305  constructor functions --- "in-charge", "not-in-charge", and
306  "allocate" copies; destructors may be duplicated as well.
307  Obviously, there must be distinct mangled names for each of these,
308  but the demangled names are all the same: S::S or S::~S. */
309 
311 lookup_minimal_symbol (const char *name, const char *sfile,
312  struct objfile *objf)
313 {
314  struct objfile *objfile;
315  found_minimal_symbols found;
316 
317  unsigned int mangled_hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
318 
319  auto *mangled_cmp
321  ? strcmp
322  : strcasecmp);
323 
324  if (sfile != NULL)
325  sfile = lbasename (sfile);
326 
328 
329  for (objfile = object_files;
330  objfile != NULL && found.external_symbol.minsym == NULL;
331  objfile = objfile->next)
332  {
333  if (objf == NULL || objf == objfile
335  {
337  {
339  "lookup_minimal_symbol (%s, %s, %s)\n",
340  name, sfile != NULL ? sfile : "NULL",
342  }
343 
344  /* Do two passes: the first over the ordinary hash table,
345  and the second over the demangled hash table. */
348  mangled_hash, mangled_cmp, found);
349 
350  /* If not found, try the demangled hash table. */
351  if (found.external_symbol.minsym == NULL)
352  {
353  /* Once for each language in the demangled hash names
354  table (usually just zero or one languages). */
355  for (auto lang : objfile->per_bfd->demangled_hash_languages)
356  {
357  unsigned int hash
358  = (lookup_name.search_name_hash (lang)
360 
363  lookup_name);
364  struct minimal_symbol **msymbol_demangled_hash
366 
367  lookup_minimal_symbol_demangled (lookup_name, sfile, objfile,
368  msymbol_demangled_hash,
369  hash, match, found);
370 
371  if (found.external_symbol.minsym != NULL)
372  break;
373  }
374  }
375  }
376  }
377 
378  /* External symbols are best. */
379  if (found.external_symbol.minsym != NULL)
380  {
382  {
383  minimal_symbol *minsym = found.external_symbol.minsym;
384 
386  "lookup_minimal_symbol (...) = %s (external)\n",
387  host_address_to_string (minsym));
388  }
389  return found.external_symbol;
390  }
391 
392  /* File-local symbols are next best. */
393  if (found.file_symbol.minsym != NULL)
394  {
396  {
397  minimal_symbol *minsym = found.file_symbol.minsym;
398 
400  "lookup_minimal_symbol (...) = %s (file-local)\n",
401  host_address_to_string (minsym));
402  }
403  return found.file_symbol;
404  }
405 
406  /* Symbols for shared library trampolines are next best. */
407  if (found.trampoline_symbol.minsym != NULL)
408  {
410  {
411  minimal_symbol *minsym = found.trampoline_symbol.minsym;
412 
414  "lookup_minimal_symbol (...) = %s (trampoline)\n",
415  host_address_to_string (minsym));
416  }
417 
418  return found.trampoline_symbol;
419  }
420 
421  /* Not found. */
423  fprintf_unfiltered (gdb_stdlog, "lookup_minimal_symbol (...) = NULL\n");
424  return {};
425 }
426 
427 /* See minsyms.h. */
428 
431 {
432  return lookup_minimal_symbol (name, NULL, NULL);
433 }
434 
435 /* See common/symbol.h. */
436 
437 int
439  struct objfile *objfile)
440 {
441  struct bound_minimal_symbol sym
443 
444  if (sym.minsym != NULL)
445  *addr = BMSYMBOL_VALUE_ADDRESS (sym);
446 
447  return sym.minsym == NULL;
448 }
449 
450 /* Get the lookup name form best suitable for linkage name
451  matching. */
452 
453 static const char *
454 linkage_name_str (const lookup_name_info &lookup_name)
455 {
456  /* Unlike most languages (including C++), Ada uses the
457  encoded/linkage name as the search name recorded in symbols. So
458  if debugging in Ada mode, prefer the Ada-encoded name. This also
459  makes Ada's verbatim match syntax ("<...>") work, because
460  "lookup_name.name()" includes the "<>"s, while
461  "lookup_name.ada().lookup_name()" is the encoded name with "<>"s
462  stripped. */
464  return lookup_name.ada ().lookup_name ().c_str ();
465 
466  return lookup_name.name ().c_str ();
467 }
468 
469 /* See minsyms.h. */
470 
471 void
473  const lookup_name_info &lookup_name,
474  void (*callback) (struct minimal_symbol *,
475  void *),
476  void *user_data)
477 {
478 
479  /* The first pass is over the ordinary hash table. */
480  {
481  const char *name = linkage_name_str (lookup_name);
482  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
483  auto *mangled_cmp
485  ? strcmp
486  : strcasecmp);
487 
488  for (minimal_symbol *iter = objf->per_bfd->msymbol_hash[hash];
489  iter != NULL;
490  iter = iter->hash_next)
491  {
492  if (mangled_cmp (MSYMBOL_LINKAGE_NAME (iter), name) == 0)
493  (*callback) (iter, user_data);
494  }
495  }
496 
497  /* The second pass is over the demangled table. Once for each
498  language in the demangled hash names table (usually just zero or
499  one). */
500  for (auto lang : objf->per_bfd->demangled_hash_languages)
501  {
502  const language_defn *lang_def = language_def (lang);
503  symbol_name_matcher_ftype *name_match
504  = get_symbol_name_matcher (lang_def, lookup_name);
505 
506  unsigned int hash
507  = lookup_name.search_name_hash (lang) % MINIMAL_SYMBOL_HASH_SIZE;
508  for (minimal_symbol *iter = objf->per_bfd->msymbol_demangled_hash[hash];
509  iter != NULL;
510  iter = iter->demangled_hash_next)
511  if (name_match (MSYMBOL_SEARCH_NAME (iter), lookup_name, NULL))
512  (*callback) (iter, user_data);
513  }
514 }
515 
516 /* See minsyms.h. */
517 
519 lookup_minimal_symbol_text (const char *name, struct objfile *objf)
520 {
521  struct objfile *objfile;
522  struct minimal_symbol *msymbol;
523  struct bound_minimal_symbol found_symbol = { NULL, NULL };
524  struct bound_minimal_symbol found_file_symbol = { NULL, NULL };
525 
526  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
527 
528  for (objfile = object_files;
529  objfile != NULL && found_symbol.minsym == NULL;
530  objfile = objfile->next)
531  {
532  if (objf == NULL || objf == objfile
534  {
535  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
536  msymbol != NULL && found_symbol.minsym == NULL;
537  msymbol = msymbol->hash_next)
538  {
539  if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
540  (MSYMBOL_TYPE (msymbol) == mst_text
541  || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
542  || MSYMBOL_TYPE (msymbol) == mst_file_text))
543  {
544  switch (MSYMBOL_TYPE (msymbol))
545  {
546  case mst_file_text:
547  found_file_symbol.minsym = msymbol;
548  found_file_symbol.objfile = objfile;
549  break;
550  default:
551  found_symbol.minsym = msymbol;
552  found_symbol.objfile = objfile;
553  break;
554  }
555  }
556  }
557  }
558  }
559  /* External symbols are best. */
560  if (found_symbol.minsym)
561  return found_symbol;
562 
563  /* File-local symbols are next best. */
564  return found_file_symbol;
565 }
566 
567 /* See minsyms.h. */
568 
569 struct minimal_symbol *
571  struct objfile *objf)
572 {
573  struct objfile *objfile;
574  struct minimal_symbol *msymbol;
575 
576  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
577 
578  for (objfile = object_files;
579  objfile != NULL;
580  objfile = objfile->next)
581  {
582  if (objf == NULL || objf == objfile
584  {
585  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
586  msymbol != NULL;
587  msymbol = msymbol->hash_next)
588  {
589  if (MSYMBOL_VALUE_ADDRESS (objfile, msymbol) == pc
590  && strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0)
591  return msymbol;
592  }
593  }
594  }
595 
596  return NULL;
597 }
598 
599 /* See minsyms.h. */
600 
603  struct objfile *objf)
604 {
605  struct objfile *objfile;
606  struct minimal_symbol *msymbol;
607  struct bound_minimal_symbol found_symbol = { NULL, NULL };
608 
609  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
610 
611  for (objfile = object_files;
612  objfile != NULL;
613  objfile = objfile->next)
614  {
615  if (objf == NULL || objf == objfile
617  {
618  for (msymbol = objfile->per_bfd->msymbol_hash[hash];
619  msymbol != NULL;
620  msymbol = msymbol->hash_next)
621  {
622  if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
623  MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
624  {
625  found_symbol.objfile = objfile;
626  found_symbol.minsym = msymbol;
627  return found_symbol;
628  }
629  }
630  }
631  }
632 
633  return found_symbol;
634 }
635 
636 /* A helper function that makes *PC section-relative. This searches
637  the sections of OBJFILE and if *PC is in a section, it subtracts
638  the section offset and returns true. Otherwise it returns
639  false. */
640 
641 static int
643 {
644  struct obj_section *iter;
645 
647  {
648  if (*pc >= obj_section_addr (iter) && *pc < obj_section_endaddr (iter))
649  {
650  *pc -= obj_section_offset (iter);
651  return 1;
652  }
653  }
654 
655  return 0;
656 }
657 
658 /* Search through the minimal symbol table for each objfile and find
659  the symbol whose address is the largest address that is still less
660  than or equal to PC, and matches SECTION (which is not NULL).
661  Returns a pointer to the minimal symbol if such a symbol is found,
662  or NULL if PC is not in a suitable range.
663  Note that we need to look through ALL the minimal symbol tables
664  before deciding on the symbol that comes closest to the specified PC.
665  This is because objfiles can overlap, for example objfile A has .text
666  at 0x100 and .data at 0x40000 and objfile B has .text at 0x234 and
667  .data at 0x40048.
668 
669  If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when
670  there are text and trampoline symbols at the same address.
671  Otherwise prefer mst_text symbols. */
672 
673 static struct bound_minimal_symbol
675  struct obj_section *section,
676  int want_trampoline)
677 {
678  int lo;
679  int hi;
680  int newobj;
681  struct objfile *objfile;
682  struct minimal_symbol *msymbol;
683  struct minimal_symbol *best_symbol = NULL;
684  struct objfile *best_objfile = NULL;
685  struct bound_minimal_symbol result;
686  enum minimal_symbol_type want_type, other_type;
687 
688  want_type = want_trampoline ? mst_solib_trampoline : mst_text;
689  other_type = want_trampoline ? mst_text : mst_solib_trampoline;
690 
691  /* We can not require the symbol found to be in section, because
692  e.g. IRIX 6.5 mdebug relies on this code returning an absolute
693  symbol - but find_pc_section won't return an absolute section and
694  hence the code below would skip over absolute symbols. We can
695  still take advantage of the call to find_pc_section, though - the
696  object file still must match. In case we have separate debug
697  files, search both the file and its separate debug file. There's
698  no telling which one will have the minimal symbols. */
699 
700  gdb_assert (section != NULL);
701 
702  for (objfile = section->objfile;
703  objfile != NULL;
705  {
706  CORE_ADDR pc = pc_in;
707 
708  /* If this objfile has a minimal symbol table, go search it using
709  a binary search. Note that a minimal symbol table always consists
710  of at least two symbols, a "real" symbol and the terminating
711  "null symbol". If there are no real symbols, then there is no
712  minimal symbol table at all. */
713 
715  {
716  int best_zero_sized = -1;
717 
718  msymbol = objfile->per_bfd->msymbols;
719  lo = 0;
721 
722  /* This code assumes that the minimal symbols are sorted by
723  ascending address values. If the pc value is greater than or
724  equal to the first symbol's address, then some symbol in this
725  minimal symbol table is a suitable candidate for being the
726  "best" symbol. This includes the last real symbol, for cases
727  where the pc value is larger than any address in this vector.
728 
729  By iterating until the address associated with the current
730  hi index (the endpoint of the test interval) is less than
731  or equal to the desired pc value, we accomplish two things:
732  (1) the case where the pc value is larger than any minimal
733  symbol address is trivially solved, (2) the address associated
734  with the hi index is always the one we want when the interation
735  terminates. In essence, we are iterating the test interval
736  down until the pc value is pushed out of it from the high end.
737 
738  Warning: this code is trickier than it would appear at first. */
739 
740  if (frob_address (objfile, &pc)
741  && pc >= MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[lo]))
742  {
743  while (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]) > pc)
744  {
745  /* pc is still strictly less than highest address. */
746  /* Note "new" will always be >= lo. */
747  newobj = (lo + hi) / 2;
748  if ((MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[newobj]) >= pc)
749  || (lo == newobj))
750  {
751  hi = newobj;
752  }
753  else
754  {
755  lo = newobj;
756  }
757  }
758 
759  /* If we have multiple symbols at the same address, we want
760  hi to point to the last one. That way we can find the
761  right symbol if it has an index greater than hi. */
762  while (hi < objfile->per_bfd->minimal_symbol_count - 1
763  && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
764  == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi + 1])))
765  hi++;
766 
767  /* Skip various undesirable symbols. */
768  while (hi >= 0)
769  {
770  /* Skip any absolute symbols. This is apparently
771  what adb and dbx do, and is needed for the CM-5.
772  There are two known possible problems: (1) on
773  ELF, apparently end, edata, etc. are absolute.
774  Not sure ignoring them here is a big deal, but if
775  we want to use them, the fix would go in
776  elfread.c. (2) I think shared library entry
777  points on the NeXT are absolute. If we want
778  special handling for this it probably should be
779  triggered by a special mst_abs_or_lib or some
780  such. */
781 
782  if (MSYMBOL_TYPE (&msymbol[hi]) == mst_abs)
783  {
784  hi--;
785  continue;
786  }
787 
788  /* If SECTION was specified, skip any symbol from
789  wrong section. */
790  if (section
791  /* Some types of debug info, such as COFF,
792  don't fill the bfd_section member, so don't
793  throw away symbols on those platforms. */
794  && MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL
796  (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi]),
797  section)))
798  {
799  hi--;
800  continue;
801  }
802 
803  /* If we are looking for a trampoline and this is a
804  text symbol, or the other way around, check the
805  preceding symbol too. If they are otherwise
806  identical prefer that one. */
807  if (hi > 0
808  && MSYMBOL_TYPE (&msymbol[hi]) == other_type
809  && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type
810  && (MSYMBOL_SIZE (&msymbol[hi])
811  == MSYMBOL_SIZE (&msymbol[hi - 1]))
812  && (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
813  == MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1]))
814  && (MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi])
815  == MSYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1])))
816  {
817  hi--;
818  continue;
819  }
820 
821  /* If the minimal symbol has a zero size, save it
822  but keep scanning backwards looking for one with
823  a non-zero size. A zero size may mean that the
824  symbol isn't an object or function (e.g. a
825  label), or it may just mean that the size was not
826  specified. */
827  if (MSYMBOL_SIZE (&msymbol[hi]) == 0)
828  {
829  if (best_zero_sized == -1)
830  best_zero_sized = hi;
831  hi--;
832  continue;
833  }
834 
835  /* If we are past the end of the current symbol, try
836  the previous symbol if it has a larger overlapping
837  size. This happens on i686-pc-linux-gnu with glibc;
838  the nocancel variants of system calls are inside
839  the cancellable variants, but both have sizes. */
840  if (hi > 0
841  && MSYMBOL_SIZE (&msymbol[hi]) != 0
842  && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
843  + MSYMBOL_SIZE (&msymbol[hi]))
844  && pc < (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi - 1])
845  + MSYMBOL_SIZE (&msymbol[hi - 1])))
846  {
847  hi--;
848  continue;
849  }
850 
851  /* Otherwise, this symbol must be as good as we're going
852  to get. */
853  break;
854  }
855 
856  /* If HI has a zero size, and best_zero_sized is set,
857  then we had two or more zero-sized symbols; prefer
858  the first one we found (which may have a higher
859  address). Also, if we ran off the end, be sure
860  to back up. */
861  if (best_zero_sized != -1
862  && (hi < 0 || MSYMBOL_SIZE (&msymbol[hi]) == 0))
863  hi = best_zero_sized;
864 
865  /* If the minimal symbol has a non-zero size, and this
866  PC appears to be outside the symbol's contents, then
867  refuse to use this symbol. If we found a zero-sized
868  symbol with an address greater than this symbol's,
869  use that instead. We assume that if symbols have
870  specified sizes, they do not overlap. */
871 
872  if (hi >= 0
873  && MSYMBOL_SIZE (&msymbol[hi]) != 0
874  && pc >= (MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi])
875  + MSYMBOL_SIZE (&msymbol[hi])))
876  {
877  if (best_zero_sized != -1)
878  hi = best_zero_sized;
879  else
880  /* Go on to the next object file. */
881  continue;
882  }
883 
884  /* The minimal symbol indexed by hi now is the best one in this
885  objfile's minimal symbol table. See if it is the best one
886  overall. */
887 
888  if (hi >= 0
889  && ((best_symbol == NULL) ||
890  (MSYMBOL_VALUE_RAW_ADDRESS (best_symbol) <
891  MSYMBOL_VALUE_RAW_ADDRESS (&msymbol[hi]))))
892  {
893  best_symbol = &msymbol[hi];
894  best_objfile = objfile;
895  }
896  }
897  }
898  }
899 
900  result.minsym = best_symbol;
901  result.objfile = best_objfile;
902  return result;
903 }
904 
907 {
908  if (section == NULL)
909  {
910  /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to
911  force the section but that (well unless you're doing overlay
912  debugging) always returns NULL making the call somewhat useless. */
913  section = find_pc_section (pc);
914  if (section == NULL)
915  {
916  struct bound_minimal_symbol result;
917 
918  memset (&result, 0, sizeof (result));
919  return result;
920  }
921  }
922  return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
923 }
924 
925 /* See minsyms.h. */
926 
929 {
930  struct obj_section *section = find_pc_section (pc);
931 
932  if (section == NULL)
933  {
934  struct bound_minimal_symbol result;
935 
936  memset (&result, 0, sizeof (result));
937  return result;
938  }
939  return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
940 }
941 
942 /* Return non-zero iff PC is in an STT_GNU_IFUNC function resolver. */
943 
944 int
946 {
948 
949  return msymbol.minsym && MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc;
950 }
951 
952 /* See elf_gnu_ifunc_resolve_addr for its real implementation. */
953 
954 static CORE_ADDR
956 {
957  error (_("GDB cannot resolve STT_GNU_IFUNC symbol at address %s without "
958  "the ELF support compiled in."),
959  paddress (gdbarch, pc));
960 }
961 
962 /* See elf_gnu_ifunc_resolve_name for its real implementation. */
963 
964 static int
965 stub_gnu_ifunc_resolve_name (const char *function_name,
966  CORE_ADDR *function_address_p)
967 {
968  error (_("GDB cannot resolve STT_GNU_IFUNC symbol \"%s\" without "
969  "the ELF support compiled in."),
970  function_name);
971 }
972 
973 /* See elf_gnu_ifunc_resolver_stop for its real implementation. */
974 
975 static void
977 {
978  internal_error (__FILE__, __LINE__,
979  _("elf_gnu_ifunc_resolver_stop cannot be reached."));
980 }
981 
982 /* See elf_gnu_ifunc_resolver_return_stop for its real implementation. */
983 
984 static void
986 {
987  internal_error (__FILE__, __LINE__,
988  _("elf_gnu_ifunc_resolver_return_stop cannot be reached."));
989 }
990 
991 /* See elf_gnu_ifunc_fns for its real implementation. */
992 
993 static const struct gnu_ifunc_fns stub_gnu_ifunc_fns =
994 {
999 };
1000 
1001 /* A placeholder for &elf_gnu_ifunc_fns. */
1002 
1004 
1005 /* See minsyms.h. */
1006 
1007 struct bound_minimal_symbol
1009 {
1010  struct bound_minimal_symbol result;
1011  struct objfile *objfile;
1012  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
1013 
1015  {
1016  struct minimal_symbol *msym;
1017 
1018  for (msym = objfile->per_bfd->msymbol_hash[hash];
1019  msym != NULL;
1020  msym = msym->hash_next)
1021  {
1022  if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0)
1023  {
1024  result.minsym = msym;
1025  result.objfile = objfile;
1026  return result;
1027  }
1028  }
1029  }
1030 
1031  memset (&result, 0, sizeof (result));
1032  return result;
1033 }
1034 
1035 
1036 /* Return leading symbol character for a BFD. If BFD is NULL,
1037  return the leading symbol character from the main objfile. */
1038 
1039 static int
1041 {
1042  if (abfd != NULL)
1043  return bfd_get_symbol_leading_char (abfd);
1044  if (symfile_objfile != NULL && symfile_objfile->obfd != NULL)
1045  return bfd_get_symbol_leading_char (symfile_objfile->obfd);
1046  return 0;
1047 }
1048 
1049 /* See minsyms.h. */
1050 
1052 : m_objfile (obj),
1053  m_msym_bunch (NULL),
1054  /* Note that presetting m_msym_bunch_index to BUNCH_SIZE causes the
1055  first call to save a minimal symbol to allocate the memory for
1056  the first bunch. */
1057  m_msym_bunch_index (BUNCH_SIZE),
1058  m_msym_count (0)
1059 {
1060 }
1061 
1062 /* Discard the currently collected minimal symbols, if any. If we wish
1063  to save them for later use, we must have already copied them somewhere
1064  else before calling this function.
1065 
1066  FIXME: We could allocate the minimal symbol bunches on their own
1067  obstack and then simply blow the obstack away when we are done with
1068  it. Is it worth the extra trouble though? */
1069 
1071 {
1072  struct msym_bunch *next;
1073 
1074  while (m_msym_bunch != NULL)
1075  {
1076  next = m_msym_bunch->next;
1077  xfree (m_msym_bunch);
1078  m_msym_bunch = next;
1079  }
1080 }
1081 
1082 /* See minsyms.h. */
1083 
1084 void
1086  enum minimal_symbol_type ms_type)
1087 {
1088  int section;
1089 
1090  switch (ms_type)
1091  {
1092  case mst_text:
1093  case mst_text_gnu_ifunc:
1094  case mst_file_text:
1095  case mst_solib_trampoline:
1096  section = SECT_OFF_TEXT (m_objfile);
1097  break;
1098  case mst_data:
1099  case mst_file_data:
1100  section = SECT_OFF_DATA (m_objfile);
1101  break;
1102  case mst_bss:
1103  case mst_file_bss:
1104  section = SECT_OFF_BSS (m_objfile);
1105  break;
1106  default:
1107  section = -1;
1108  }
1109 
1110  record_with_info (name, address, ms_type, section);
1111 }
1112 
1113 /* See minsyms.h. */
1114 
1115 struct minimal_symbol *
1116 minimal_symbol_reader::record_full (const char *name, int name_len,
1117  bool copy_name, CORE_ADDR address,
1118  enum minimal_symbol_type ms_type,
1119  int section)
1120 {
1121  struct msym_bunch *newobj;
1122  struct minimal_symbol *msymbol;
1123 
1124  /* Don't put gcc_compiled, __gnu_compiled_cplus, and friends into
1125  the minimal symbols, because if there is also another symbol
1126  at the same address (e.g. the first function of the file),
1127  lookup_minimal_symbol_by_pc would have no way of getting the
1128  right one. */
1129  if (ms_type == mst_file_text && name[0] == 'g'
1130  && (strcmp (name, GCC_COMPILED_FLAG_SYMBOL) == 0
1131  || strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0))
1132  return (NULL);
1133 
1134  /* It's safe to strip the leading char here once, since the name
1135  is also stored stripped in the minimal symbol table. */
1137  {
1138  ++name;
1139  --name_len;
1140  }
1141 
1142  if (ms_type == mst_file_text && startswith (name, "__gnu_compiled"))
1143  return (NULL);
1144 
1146  {
1147  newobj = XCNEW (struct msym_bunch);
1148  m_msym_bunch_index = 0;
1149  newobj->next = m_msym_bunch;
1150  m_msym_bunch = newobj;
1151  }
1155  MSYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, m_objfile);
1156 
1157  SET_MSYMBOL_VALUE_ADDRESS (msymbol, address);
1158  MSYMBOL_SECTION (msymbol) = section;
1159 
1160  MSYMBOL_TYPE (msymbol) = ms_type;
1161  MSYMBOL_TARGET_FLAG_1 (msymbol) = 0;
1162  MSYMBOL_TARGET_FLAG_2 (msymbol) = 0;
1163  /* Do not use the SET_MSYMBOL_SIZE macro to initialize the size,
1164  as it would also set the has_size flag. */
1165  msymbol->size = 0;
1166 
1167  /* The hash pointers must be cleared! If they're not,
1168  add_minsym_to_hash_table will NOT add this msymbol to the hash table. */
1169  msymbol->hash_next = NULL;
1170  msymbol->demangled_hash_next = NULL;
1171 
1172  /* If we already read minimal symbols for this objfile, then don't
1173  ever allocate a new one. */
1175  {
1178  }
1179  m_msym_count++;
1180  return msymbol;
1181 }
1182 
1183 /* Compare two minimal symbols by address and return a signed result based
1184  on unsigned comparisons, so that we sort into unsigned numeric order.
1185  Within groups with the same address, sort by name. */
1186 
1187 static int
1188 compare_minimal_symbols (const void *fn1p, const void *fn2p)
1189 {
1190  const struct minimal_symbol *fn1;
1191  const struct minimal_symbol *fn2;
1192 
1193  fn1 = (const struct minimal_symbol *) fn1p;
1194  fn2 = (const struct minimal_symbol *) fn2p;
1195 
1197  {
1198  return (-1); /* addr 1 is less than addr 2. */
1199  }
1201  {
1202  return (1); /* addr 1 is greater than addr 2. */
1203  }
1204  else
1205  /* addrs are equal: sort by name */
1206  {
1207  const char *name1 = MSYMBOL_LINKAGE_NAME (fn1);
1208  const char *name2 = MSYMBOL_LINKAGE_NAME (fn2);
1209 
1210  if (name1 && name2) /* both have names */
1211  return strcmp (name1, name2);
1212  else if (name2)
1213  return 1; /* fn1 has no name, so it is "less". */
1214  else if (name1) /* fn2 has no name, so it is "less". */
1215  return -1;
1216  else
1217  return (0); /* Neither has a name, so they're equal. */
1218  }
1219 }
1220 
1221 /* Compact duplicate entries out of a minimal symbol table by walking
1222  through the table and compacting out entries with duplicate addresses
1223  and matching names. Return the number of entries remaining.
1224 
1225  On entry, the table resides between msymbol[0] and msymbol[mcount].
1226  On exit, it resides between msymbol[0] and msymbol[result_count].
1227 
1228  When files contain multiple sources of symbol information, it is
1229  possible for the minimal symbol table to contain many duplicate entries.
1230  As an example, SVR4 systems use ELF formatted object files, which
1231  usually contain at least two different types of symbol tables (a
1232  standard ELF one and a smaller dynamic linking table), as well as
1233  DWARF debugging information for files compiled with -g.
1234 
1235  Without compacting, the minimal symbol table for gdb itself contains
1236  over a 1000 duplicates, about a third of the total table size. Aside
1237  from the potential trap of not noticing that two successive entries
1238  identify the same location, this duplication impacts the time required
1239  to linearly scan the table, which is done in a number of places. So we
1240  just do one linear scan here and toss out the duplicates.
1241 
1242  Note that we are not concerned here about recovering the space that
1243  is potentially freed up, because the strings themselves are allocated
1244  on the storage_obstack, and will get automatically freed when the symbol
1245  table is freed. The caller can free up the unused minimal symbols at
1246  the end of the compacted region if their allocation strategy allows it.
1247 
1248  Also note we only go up to the next to last entry within the loop
1249  and then copy the last entry explicitly after the loop terminates.
1250 
1251  Since the different sources of information for each symbol may
1252  have different levels of "completeness", we may have duplicates
1253  that have one entry with type "mst_unknown" and the other with a
1254  known type. So if the one we are leaving alone has type mst_unknown,
1255  overwrite its type with the type from the one we are compacting out. */
1256 
1257 static int
1258 compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
1259  struct objfile *objfile)
1260 {
1261  struct minimal_symbol *copyfrom;
1262  struct minimal_symbol *copyto;
1263 
1264  if (mcount > 0)
1265  {
1266  copyfrom = copyto = msymbol;
1267  while (copyfrom < msymbol + mcount - 1)
1268  {
1269  if (MSYMBOL_VALUE_RAW_ADDRESS (copyfrom)
1270  == MSYMBOL_VALUE_RAW_ADDRESS ((copyfrom + 1))
1271  && MSYMBOL_SECTION (copyfrom) == MSYMBOL_SECTION (copyfrom + 1)
1272  && strcmp (MSYMBOL_LINKAGE_NAME (copyfrom),
1273  MSYMBOL_LINKAGE_NAME ((copyfrom + 1))) == 0)
1274  {
1275  if (MSYMBOL_TYPE ((copyfrom + 1)) == mst_unknown)
1276  {
1277  MSYMBOL_TYPE ((copyfrom + 1)) = MSYMBOL_TYPE (copyfrom);
1278  }
1279  copyfrom++;
1280  }
1281  else
1282  *copyto++ = *copyfrom++;
1283  }
1284  *copyto++ = *copyfrom++;
1285  mcount = copyto - msymbol;
1286  }
1287  return (mcount);
1288 }
1289 
1290 /* Build (or rebuild) the minimal symbol hash tables. This is necessary
1291  after compacting or sorting the table since the entries move around
1292  thus causing the internal minimal_symbol pointers to become jumbled. */
1293 
1294 static void
1296 {
1297  int i;
1298  struct minimal_symbol *msym;
1299 
1300  /* Clear the hash tables. */
1301  for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
1302  {
1303  objfile->per_bfd->msymbol_hash[i] = 0;
1305  }
1306 
1307  /* Now, (re)insert the actual entries. */
1308  for ((i = objfile->per_bfd->minimal_symbol_count,
1309  msym = objfile->per_bfd->msymbols);
1310  i > 0;
1311  i--, msym++)
1312  {
1313  msym->hash_next = 0;
1315 
1316  msym->demangled_hash_next = 0;
1317  if (MSYMBOL_SEARCH_NAME (msym) != MSYMBOL_LINKAGE_NAME (msym))
1319  }
1320 }
1321 
1322 /* Add the minimal symbols in the existing bunches to the objfile's official
1323  minimal symbol table. In most cases there is no minimal symbol table yet
1324  for this objfile, and the existing bunches are used to create one. Once
1325  in a while (for shared libraries for example), we add symbols (e.g. common
1326  symbols) to an existing objfile.
1327 
1328  Because of the way minimal symbols are collected, we generally have no way
1329  of knowing what source language applies to any particular minimal symbol.
1330  Specifically, we have no way of knowing if the minimal symbol comes from a
1331  C++ compilation unit or not. So for the sake of supporting cached
1332  demangled C++ names, we have no choice but to try and demangle each new one
1333  that comes in. If the demangling succeeds, then we assume it is a C++
1334  symbol and set the symbol's language and demangled name fields
1335  appropriately. Note that in order to avoid unnecessary demanglings, and
1336  allocating obstack space that subsequently can't be freed for the demangled
1337  names, we mark all newly added symbols with language_auto. After
1338  compaction of the minimal symbols, we go back and scan the entire minimal
1339  symbol table looking for these new symbols. For each new symbol we attempt
1340  to demangle it, and if successful, record it as a language_cplus symbol
1341  and cache the demangled form on the symbol obstack. Symbols which don't
1342  demangle are marked as language_unknown symbols, which inhibits future
1343  attempts to demangle them if we later add more minimal symbols. */
1344 
1345 void
1347 {
1348  int bindex;
1349  int mcount;
1350  struct msym_bunch *bunch;
1351  struct minimal_symbol *msymbols;
1352  int alloc_count;
1353 
1355  return;
1356 
1357  if (m_msym_count > 0)
1358  {
1359  if (symtab_create_debug)
1360  {
1362  "Installing %d minimal symbols of objfile %s.\n",
1364  }
1365 
1366  /* Allocate enough space in the obstack, into which we will gather the
1367  bunches of new and existing minimal symbols, sort them, and then
1368  compact out the duplicate entries. Once we have a final table,
1369  we will give back the excess space. */
1370 
1371  alloc_count = m_msym_count + m_objfile->per_bfd->minimal_symbol_count + 1;
1372  obstack_blank (&m_objfile->per_bfd->storage_obstack,
1373  alloc_count * sizeof (struct minimal_symbol));
1374  msymbols = (struct minimal_symbol *)
1375  obstack_base (&m_objfile->per_bfd->storage_obstack);
1376 
1377  /* Copy in the existing minimal symbols, if there are any. */
1378 
1380  memcpy ((char *) msymbols, (char *) m_objfile->per_bfd->msymbols,
1382 
1383  /* Walk through the list of minimal symbol bunches, adding each symbol
1384  to the new contiguous array of symbols. Note that we start with the
1385  current, possibly partially filled bunch (thus we use the current
1386  msym_bunch_index for the first bunch we copy over), and thereafter
1387  each bunch is full. */
1388 
1390 
1391  for (bunch = m_msym_bunch; bunch != NULL; bunch = bunch->next)
1392  {
1393  for (bindex = 0; bindex < m_msym_bunch_index; bindex++, mcount++)
1394  msymbols[mcount] = bunch->contents[bindex];
1396  }
1397 
1398  /* Sort the minimal symbols by address. */
1399 
1400  qsort (msymbols, mcount, sizeof (struct minimal_symbol),
1402 
1403  /* Compact out any duplicates, and free up whatever space we are
1404  no longer using. */
1405 
1406  mcount = compact_minimal_symbols (msymbols, mcount, m_objfile);
1407 
1408  obstack_blank_fast (&m_objfile->per_bfd->storage_obstack,
1409  (mcount + 1 - alloc_count) * sizeof (struct minimal_symbol));
1410  msymbols = (struct minimal_symbol *)
1411  obstack_finish (&m_objfile->per_bfd->storage_obstack);
1412 
1413  /* We also terminate the minimal symbol table with a "null symbol",
1414  which is *not* included in the size of the table. This makes it
1415  easier to find the end of the table when we are handed a pointer
1416  to some symbol in the middle of it. Zero out the fields in the
1417  "null symbol" allocated at the end of the array. Note that the
1418  symbol count does *not* include this null symbol, which is why it
1419  is indexed by mcount and not mcount-1. */
1420 
1421  memset (&msymbols[mcount], 0, sizeof (struct minimal_symbol));
1422 
1423  /* Attach the minimal symbol table to the specified objfile.
1424  The strings themselves are also located in the storage_obstack
1425  of this objfile. */
1426 
1428  m_objfile->per_bfd->msymbols = msymbols;
1429 
1430  /* Now build the hash tables; we can't do this incrementally
1431  at an earlier point since we weren't finished with the obstack
1432  yet. (And if the msymbol obstack gets moved, all the internal
1433  pointers to other msymbols need to be adjusted.) */
1435  }
1436 }
1437 
1438 /* See minsyms.h. */
1439 
1440 void
1442 {
1443  if (! objfile->per_bfd->msymbols)
1445  = ((struct minimal_symbol *)
1446  obstack_alloc (&objfile->per_bfd->storage_obstack,
1447  sizeof (struct minimal_symbol)));
1448 
1449  {
1450  struct minimal_symbol *m
1452 
1453  memset (m, 0, sizeof (*m));
1454  /* Don't rely on these enumeration values being 0's. */
1458  }
1459 }
1460 
1461 /* Check if PC is in a shared library trampoline code stub.
1462  Return minimal symbol for the trampoline entry or NULL if PC is not
1463  in a trampoline code stub. */
1464 
1465 static struct minimal_symbol *
1467 {
1468  struct obj_section *section = find_pc_section (pc);
1469  struct bound_minimal_symbol msymbol;
1470 
1471  if (section == NULL)
1472  return NULL;
1473  msymbol = lookup_minimal_symbol_by_pc_section_1 (pc, section, 1);
1474 
1475  if (msymbol.minsym != NULL
1476  && MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
1477  return msymbol.minsym;
1478  return NULL;
1479 }
1480 
1481 /* If PC is in a shared library trampoline code stub, return the
1482  address of the `real' function belonging to the stub.
1483  Return 0 if PC is not in a trampoline code stub or if the real
1484  function is not found in the minimal symbol table.
1485 
1486  We may fail to find the right function if a function with the
1487  same name is defined in more than one shared library, but this
1488  is considered bad programming style. We could return 0 if we find
1489  a duplicate function in case this matters someday. */
1490 
1491 CORE_ADDR
1493 {
1494  struct objfile *objfile;
1495  struct minimal_symbol *msymbol;
1497 
1498  if (tsymbol != NULL)
1499  {
1500  ALL_MSYMBOLS (objfile, msymbol)
1501  {
1502  if ((MSYMBOL_TYPE (msymbol) == mst_text
1503  || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
1504  && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
1505  MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
1506  return MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
1507 
1508  /* Also handle minimal symbols pointing to function descriptors. */
1509  if (MSYMBOL_TYPE (msymbol) == mst_data
1510  && strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
1511  MSYMBOL_LINKAGE_NAME (tsymbol)) == 0)
1512  {
1513  CORE_ADDR func;
1514 
1517  MSYMBOL_VALUE_ADDRESS (objfile, msymbol),
1518  &current_target);
1519 
1520  /* Ignore data symbols that are not function descriptors. */
1521  if (func != MSYMBOL_VALUE_ADDRESS (objfile, msymbol))
1522  return func;
1523  }
1524  }
1525  }
1526  return 0;
1527 }
1528 
1529 /* See minsyms.h. */
1530 
1531 CORE_ADDR
1533 {
1534  int i;
1535  short section;
1536  struct obj_section *obj_section;
1537  CORE_ADDR result;
1538  struct minimal_symbol *msymbol;
1539 
1540  gdb_assert (minsym.minsym != NULL);
1541 
1542  /* If the minimal symbol has a size, use it. Otherwise use the
1543  lesser of the next minimal symbol in the same section, or the end
1544  of the section, as the end of the function. */
1545 
1546  if (MSYMBOL_SIZE (minsym.minsym) != 0)
1547  return BMSYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym.minsym);
1548 
1549  /* Step over other symbols at this same address, and symbols in
1550  other sections, to find the next symbol in this section with a
1551  different address. */
1552 
1553  msymbol = minsym.minsym;
1554  section = MSYMBOL_SECTION (msymbol);
1555  for (i = 1; MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
1556  {
1557  if ((MSYMBOL_VALUE_RAW_ADDRESS (msymbol + i)
1558  != MSYMBOL_VALUE_RAW_ADDRESS (msymbol))
1559  && MSYMBOL_SECTION (msymbol + i) == section)
1560  break;
1561  }
1562 
1563  obj_section = MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym);
1564  if (MSYMBOL_LINKAGE_NAME (msymbol + i) != NULL
1565  && (MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i)
1567  result = MSYMBOL_VALUE_ADDRESS (minsym.objfile, msymbol + i);
1568  else
1569  /* We got the start address from the last msymbol in the objfile.
1570  So the end address is the end of the section. */
1571  result = obj_section_endaddr (obj_section);
1572 
1573  return result;
1574 }
void iterate_over_minimal_symbols(struct objfile *objf, const lookup_name_info &lookup_name, void(*callback)(struct minimal_symbol *, void *), void *user_data)
Definition: minsyms.c:472
#define BUNCH_SIZE
Definition: minsyms.c:96
const char * string
Definition: signals.c:50
const ada_lookup_name_info & ada() const
Definition: symtab.h:240
static void lookup_minimal_symbol_demangled(const lookup_name_info &lookup_name, const char *sfile, struct objfile *objfile, struct minimal_symbol **table, unsigned int hash, symbol_name_matcher_ftype *matcher, found_minimal_symbols &found)
Definition: minsyms.c:270
#define object_files
Definition: progspace.h:231
static int compare_minimal_symbols(const void *fn1p, const void *fn2p)
Definition: minsyms.c:1188
struct bound_minimal_symbol lookup_minimal_symbol_by_pc_section(CORE_ADDR pc, struct obj_section *section)
Definition: minsyms.c:906
struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline(const char *name, struct objfile *objf)
Definition: minsyms.c:602
bfd * obfd
Definition: objfiles.h:342
#define SECT_OFF_TEXT(objfile)
Definition: objfiles.h:686
struct minimal_symbol * hash_next
Definition: symtab.h:662
static void build_minimal_symbol_hash_tables(struct objfile *objfile)
Definition: minsyms.c:1295
struct msym_bunch * m_msym_bunch
Definition: minsyms.h:141
#define MSYMBOL_LINKAGE_NAME(symbol)
Definition: symtab.h:707
#define MSYMBOL_LANGUAGE(symbol)
Definition: symtab.h:698
bfd_vma CORE_ADDR
Definition: common-types.h:41
struct minimal_symbol contents[BUNCH_SIZE]
Definition: minsyms.c:101
void xfree(void *)
struct objfile * separate_debug_objfile_backlink
Definition: objfiles.h:441
#define GCC2_COMPILED_FLAG_SYMBOL
Definition: symtab.h:1712
void record(const char *name, CORE_ADDR address, enum minimal_symbol_type ms_type)
Definition: minsyms.c:1085
void(* func)(char *)
#define BMSYMBOL_VALUE_ADDRESS(symbol)
Definition: symtab.h:691
static CORE_ADDR stub_gnu_ifunc_resolve_addr(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: minsyms.c:955
#define obj_section_offset(s)
Definition: objfiles.h:136
static void stub_gnu_ifunc_resolver_return_stop(struct breakpoint *b)
Definition: minsyms.c:985
#define SET_MSYMBOL_VALUE_ADDRESS(symbol, new_value)
Definition: symtab.h:693
symbol_name_matcher_ftype * get_symbol_name_matcher(const language_defn *lang, const lookup_name_info &lookup_name)
Definition: language.c:730
CORE_ADDR minimal_symbol_upper_bound(struct bound_minimal_symbol minsym)
Definition: minsyms.c:1532
minimal_symbol * msymbol_hash[MINIMAL_SYMBOL_HASH_SIZE]
Definition: objfiles.h:264
static int frob_address(struct objfile *objfile, CORE_ADDR *pc)
Definition: minsyms.c:642
void * memset(T *s, int c, size_t n)=delete
void internal_error(const char *file, int line, const char *fmt,...)
Definition: errors.c:50
#define obj_section_endaddr(s)
Definition: objfiles.h:146
const struct language_defn * language_def(enum language lang)
Definition: language.c:494
const struct gnu_ifunc_fns * gnu_ifunc_fns_p
Definition: minsyms.c:1003
unsigned int symbol_lookup_debug
Definition: symtab.c:218
bool() symbol_name_matcher_ftype(const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res)
Definition: symtab.h:324
__extension__ enum minimal_symbol_type type
Definition: symtab.h:644
#define MSYMBOL_TARGET_FLAG_2(msymbol)
Definition: symtab.h:671
enum language la_language
Definition: language.h:144
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
Definition: objfiles.h:630
#define MINIMAL_SYMBOL_HASH_SIZE
Definition: objfiles.h:180
char * skip_spaces(char *chp)
Definition: common-utils.c:337
unsigned long size
Definition: symtab.h:637
#define _(String)
Definition: gdb_locale.h:35
#define MSYMBOL_TARGET_FLAG_1(msymbol)
Definition: symtab.h:670
struct objfile_per_bfd_storage * per_bfd
Definition: objfiles.h:347
struct bound_minimal_symbol lookup_minimal_symbol_text(const char *name, struct objfile *objf)
Definition: minsyms.c:519
struct objfile * m_objfile
Definition: minsyms.h:136
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
Definition: utils.c:2745
struct minimal_symbol * record_full(const char *name, int name_len, bool copy_name, CORE_ADDR address, enum minimal_symbol_type ms_type, int section)
Definition: minsyms.c:1116
struct minimal_symbol * lookup_minimal_symbol_by_pc_name(CORE_ADDR pc, const char *name, struct objfile *objf)
Definition: minsyms.c:570
bool maybe_collect(const char *sfile, objfile *objf, minimal_symbol *msymbol)
Definition: minsyms.c:200
#define MSYMBOL_OBJ_SECTION(objfile, symbol)
Definition: symtab.h:700
static struct minimal_symbol * lookup_solib_trampoline_symbol_by_pc(CORE_ADDR pc)
Definition: minsyms.c:1466
#define MSYMBOL_VALUE_RAW_ADDRESS(symbol)
Definition: symtab.h:684
const char *const name
Definition: aarch64-tdep.c:76
minimal_symbol * msymbol_demangled_hash[MINIMAL_SYMBOL_HASH_SIZE]
Definition: objfiles.h:269
int find_minimal_symbol_address(const char *name, CORE_ADDR *addr, struct objfile *objfile)
Definition: minsyms.c:438
minimal_symbol * msymbols
Definition: objfiles.h:242
struct minimal_symbol * demangled_hash_next
Definition: symtab.h:667
struct target_ops current_target
objfile(bfd *, const char *, objfile_flags)
Definition: objfiles.c:373
CORE_ADDR find_solib_trampoline_target(struct frame_info *frame, CORE_ADDR pc)
Definition: minsyms.c:1492
struct bound_minimal_symbol lookup_minimal_symbol_and_objfile(const char *name)
Definition: minsyms.c:1008
const char * filename
Definition: symtab.h:640
CORE_ADDR gdbarch_convert_from_func_ptr_addr(struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ)
Definition: gdbarch.c:3191
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2018
#define SYMBOL_HASH_NEXT(hash, c)
Definition: minsyms.h:184
#define SECT_OFF_DATA(objfile)
Definition: objfiles.h:674
#define MSYMBOL_SIZE(msymbol)
Definition: symtab.h:672
struct gdbarch * get_objfile_arch(const struct objfile *objfile)
Definition: objfiles.c:445
std::vector< enum language > demangled_hash_languages
Definition: objfiles.h:275
bound_minimal_symbol external_symbol
Definition: minsyms.c:181
#define MSYMBOL_SEARCH_NAME(symbol)
Definition: symtab.h:714
static int startswith(const char *string, const char *pattern)
Definition: common-utils.h:107
#define symfile_objfile
Definition: progspace.h:227
struct obj_section * find_pc_section(CORE_ADDR pc)
Definition: objfiles.c:1395
static void lookup_minimal_symbol_mangled(const char *lookup_name, const char *sfile, struct objfile *objfile, struct minimal_symbol **table, unsigned int hash, int(*namecmp)(const char *, const char *), found_minimal_symbols &found)
Definition: minsyms.c:246
const char * objfile_name(const struct objfile *objfile)
Definition: objfiles.c:1557
unsigned int msymbol_hash(const char *string)
Definition: minsyms.c:126
static int get_symbol_leading_char(bfd *abfd)
Definition: minsyms.c:1040
#define gdb_assert(expr)
Definition: gdb_assert.h:32
unsigned long hash(const void *addr, int length)
Definition: bcache.c:98
static const char * linkage_name_str(const lookup_name_info &lookup_name)
Definition: minsyms.c:454
minimal_symbol_reader(struct objfile *)
Definition: minsyms.c:1051
struct msym_bunch * next
Definition: minsyms.c:100
unsigned int search_name_hash(language lang) const
Definition: symtab.h:209
static const struct gnu_ifunc_fns stub_gnu_ifunc_fns
Definition: minsyms.c:993
#define MSYMBOL_TYPE(msymbol)
Definition: symtab.h:680
#define ALL_MSYMBOLS(objfile, m)
Definition: objfiles.h:626
const struct language_defn * current_language
Definition: language.c:81
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
Definition: minsyms.c:928
#define MSYMBOL_SET_NAMES(symbol, linkage_name, len, copy_name, objfile)
Definition: symtab.h:716
static void stub_gnu_ifunc_resolver_stop(struct breakpoint *b)
Definition: minsyms.c:976
#define XCNEW(T)
Definition: poison.h:121
const std::string & name() const
Definition: symtab.h:196
#define GCC_COMPILED_FLAG_SYMBOL
Definition: symtab.h:1707
struct minimal_symbol * record_with_info(const char *name, CORE_ADDR address, enum minimal_symbol_type ms_type, int section)
Definition: minsyms.h:121
struct minimal_symbol * minsym
Definition: minsyms.h:34
#define MSYMBOL_SECTION(symbol)
Definition: symtab.h:699
#define obj_section_addr(s)
Definition: objfiles.h:140
unsigned int search_name_hash(enum language language, const char *search_name)
Definition: symtab.c:1859
struct objfile * objfile_separate_debug_iterate(const struct objfile *parent, const struct objfile *objfile)
Definition: objfiles.c:488
struct bound_minimal_symbol lookup_bound_minimal_symbol(const char *name)
Definition: minsyms.c:430
const char * objfile_debug_name(const struct objfile *objfile)
Definition: objfiles.c:1579
struct objfile * next
Definition: objfiles.h:297
bool msymbol_is_function(struct objfile *objfile, minimal_symbol *minsym, CORE_ADDR *func_address_p)
Definition: minsyms.c:60
#define qsort
Definition: ada-exp.c:2694
bound_minimal_symbol trampoline_symbol
Definition: minsyms.c:187
bound_minimal_symbol file_symbol
Definition: minsyms.c:184
int in_gnu_ifunc_stub(CORE_ADDR pc)
Definition: minsyms.c:945
unsigned int symtab_create_debug
Definition: symtab.c:215
static void add_minsym_to_demangled_hash_table(struct minimal_symbol *sym, struct objfile *objfile)
Definition: minsyms.c:153
static int stub_gnu_ifunc_resolve_name(const char *function_name, CORE_ADDR *function_address_p)
Definition: minsyms.c:965
#define gdb_stdlog
Definition: utils.h:349
static void add_minsym_to_hash_table(struct minimal_symbol *sym, struct minimal_symbol **table)
Definition: minsyms.c:137
#define MSYMBOL_SET_LANGUAGE(symbol, language, obstack)
Definition: symtab.h:712
#define SECT_OFF_BSS(objfile)
Definition: objfiles.h:695
int matching_obj_sections(struct obj_section *obj_first, struct obj_section *obj_second)
Definition: symtab.c:969
auto_obstack storage_obstack
Definition: objfiles.h:195
struct objfile * objfile
Definition: minsyms.h:39
const std::string & lookup_name() const
Definition: symtab.h:100
void terminate_minimal_symbol_table(struct objfile *objfile)
Definition: minsyms.c:1441
minimal_symbol_type
Definition: symtab.h:579
#define ALL_OBJFILES(obj)
Definition: objfiles.h:582
static struct bound_minimal_symbol lookup_minimal_symbol_by_pc_section_1(CORE_ADDR pc_in, struct obj_section *section, int want_trampoline)
Definition: minsyms.c:674
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
Definition: minsyms.c:311
static int compact_minimal_symbols(struct minimal_symbol *msymbol, int mcount, struct objfile *objfile)
Definition: minsyms.c:1258
case_sensitivity
Definition: language.h:90
void error(const char *fmt,...)
Definition: errors.c:38
#define MSYMBOL_VALUE_ADDRESS(objfile, symbol)
Definition: symtab.h:687
char * copy_name(struct stoken token)
Definition: parse.c:761
unsigned int msymbol_hash_iw(const char *string)
Definition: minsyms.c:107