]> Git Repo - binutils.git/blobdiff - gdb/minsyms.c
* win32-nat.c (handle_load_dll): dos_path_to_unix_path renamed to
[binutils.git] / gdb / minsyms.c
index e36302ea8ed92c80d74ae0b40eec52d261adf49f..608ae70e04c1e57489a7b42c3883c6f02e9b59e7 100644 (file)
@@ -1,5 +1,5 @@
 /* GDB routines for manipulating the minimal symbol tables.
-   Copyright 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+   Copyright 1992, 1993, 1994, 1996, 1996 Free Software Foundation, Inc.
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
 This file is part of GDB.
@@ -253,6 +253,55 @@ lookup_minimal_symbol_text (name, sfile, objf)
   return NULL;
 }
 
+/* Look through all the current minimal symbol tables and find the
+   first minimal symbol that matches NAME and of solib trampoline type.  
+   If OBJF is non-NULL, limit
+   the search to that objfile.  If SFILE is non-NULL, limit the search
+   to that source file.  Returns a pointer to the minimal symbol that
+   matches, or NULL if no match is found.
+*/
+   
+struct minimal_symbol *
+lookup_minimal_symbol_solib_trampoline (name, sfile, objf)
+     register const char *name;
+     const char *sfile;
+     struct objfile *objf;
+{
+  struct objfile *objfile;
+  struct minimal_symbol *msymbol;
+  struct minimal_symbol *found_symbol = NULL;
+
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+  if (sfile != NULL)
+    {
+      char *p = strrchr (sfile, '/');
+      if (p != NULL)
+       sfile = p + 1;
+    }
+#endif
+
+  for (objfile = object_files;
+       objfile != NULL && found_symbol == NULL;
+       objfile = objfile -> next)
+    {
+      if (objf == NULL || objf == objfile)
+       {
+         for (msymbol = objfile -> msymbols;
+              msymbol != NULL && SYMBOL_NAME (msymbol) != NULL &&
+              found_symbol == NULL;
+              msymbol++)
+           {
+             if (SYMBOL_MATCHES_NAME (msymbol, name) && 
+                 MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
+               return msymbol;
+           }
+       }
+    }
+
+  return NULL;
+}
+
+
 /* Search through the minimal symbol table for each objfile and find the
    symbol whose address is the largest address that is still less than or
    equal to PC.  Returns a pointer to the minimal symbol if such a symbol
@@ -273,6 +322,12 @@ lookup_minimal_symbol_by_pc (pc)
   register struct minimal_symbol *msymbol;
   register struct minimal_symbol *best_symbol = NULL;
 
+  /* pc has to be in a known section. This ensures that anything beyond
+     the end of the last segment doesn't appear to be part of the last
+     function in the last segment.  */
+  if (find_pc_section (pc) == NULL)
+    return NULL;
+
   for (objfile = object_files;
        objfile != NULL;
        objfile = objfile -> next)
@@ -450,6 +505,7 @@ prim_record_minimal_symbol (name, address, ms_type, objfile)
 
 /* Record a minimal symbol in the msym bunches.  Returns the symbol
    newly created.  */
+
 struct minimal_symbol *
 prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
                                     objfile)
@@ -492,7 +548,8 @@ prim_record_minimal_symbol_and_info (name, address, ms_type, info, section,
       msym_bunch = new;
     }
   msymbol = &msym_bunch -> contents[msym_bunch_index];
-  SYMBOL_NAME (msymbol) = (char *) name;
+  SYMBOL_NAME (msymbol) = obsavestring ((char *) name, strlen (name),
+                                       &objfile->symbol_obstack);
   SYMBOL_INIT_LANGUAGE_SPECIFIC (msymbol, language_unknown);
   SYMBOL_VALUE_ADDRESS (msymbol) = address;
   SYMBOL_SECTION (msymbol) = section;
This page took 0.022085 seconds and 4 git commands to generate.