]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* symfile.c: #include "gdb_assert.h".
authorJim Blandy <jimb@codesourcery.com>
Tue, 26 Nov 2002 02:32:13 +0000 (02:32 +0000)
committerJim Blandy <jimb@codesourcery.com>
Tue, 26 Nov 2002 02:32:13 +0000 (02:32 +0000)
(syms_from_objfile): Add the ability to pass in a section offset
table directly, as an alternative to the section_addr_info table.
Document arguments better.
(symbol_file_add): Pass extra arguments to syms_from_objfile.
* symfile.h (syms_from_objfile): Update declaration.
* rs6000-nat.c (objfile_symbol_add): Pass new arguments to
syms_from_objfile.
* Makefile.in (symfile.o): List dependency on $(gdb_assert_h).

gdb/ChangeLog
gdb/Makefile.in
gdb/rs6000-nat.c
gdb/symfile.c
gdb/symfile.h

index ed3e9c781b26dbc1c1d6d38b58a60b6e78d87965..b089ef837135836d5803ab9a24829cb70425dbbd 100644 (file)
@@ -1,5 +1,15 @@
 2002-11-25  Jim Blandy  <jimb@redhat.com>
 
+       * symfile.c: #include "gdb_assert.h".
+       (syms_from_objfile): Add the ability to pass in a section offset
+       table directly, as an alternative to the section_addr_info table.
+       Document arguments better.
+       (symbol_file_add): Pass extra arguments to syms_from_objfile.
+       * symfile.h (syms_from_objfile): Update declaration.
+       * rs6000-nat.c (objfile_symbol_add): Pass new arguments to
+       syms_from_objfile.
+       * Makefile.in (symfile.o): List dependency on $(gdb_assert_h).
+
        * symfile.c (init_objfile_sect_indices): New function.
        (default_symfile_offsets): Move the section-index-initializing
        stuff into init_objfile_sect_indices, and call that.
index aa401e47f7ee8e743a1c7752ac3bb035ff4f455b..2d1d1bb99150b895a32085001b7391b000636a3a 100644 (file)
@@ -2207,7 +2207,8 @@ symfile.o: symfile.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(gdbcore_h) \
        $(frame_h) $(target_h) $(value_h) $(symfile_h) $(objfiles_h) \
        $(gdbcmd_h) $(breakpoint_h) $(language_h) $(complaints_h) \
        $(demangle_h) $(inferior_h) $(gdb_stabs_h) $(gdb_obstack_h) \
-       $(completer_h) $(bcache_h) $(gdb_string_h) $(gdb_stat_h) $(source_h)
+       $(completer_h) $(bcache_h) $(gdb_string_h) $(gdb_stat_h) $(source_h) \
+       $(gdb_assert_h)
 symm-nat.o: symm-nat.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
        $(target_h) $(regcache_h) $(gdb_stat_h) $(gdbcore_h) $(gdbcore_h)
 symm-tdep.o: symm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
index 65256f447118ee3485077059fd4d01a79d2b917e..bf784cef35a26574c6225ff85004dfbb3f95bfa7 100644 (file)
@@ -685,7 +685,7 @@ objfile_symbol_add (void *arg)
 {
   struct objfile *obj = (struct objfile *) arg;
 
-  syms_from_objfile (obj, NULL, 0, 0);
+  syms_from_objfile (obj, NULL, 0, 0, 0, 0);
   new_symfile_objfile (obj, 0, 0);
   return 1;
 }
index 0ede698f3c3dd4f32c15509e0fd4065604656df5..800b65ffc0492d17df0ed40436e63afd48e0827f 100644 (file)
@@ -42,6 +42,7 @@
 #include "gdb_obstack.h"
 #include "completer.h"
 #include "bcache.h"
+#include "gdb_assert.h"
 
 #include <sys/types.h>
 #include <fcntl.h>
@@ -571,8 +572,26 @@ default_symfile_offsets (struct objfile *objfile,
 
    OBJFILE is where the symbols are to be read from.
 
-   ADDR is the address where the text segment was loaded, unless the
-   objfile is the main symbol file, in which case it is zero.
+   ADDRS is the list of section load addresses.  If the user has given
+   an 'add-symbol-file' command, then this is the list of offsets and
+   addresses he or she provided as arguments to the command; or, if
+   we're handling a shared library, these are the actual addresses the
+   sections are loaded at, according to the inferior's dynamic linker
+   (as gleaned by GDB's shared library code).  We convert each address
+   into an offset from the section VMA's as it appears in the object
+   file, and then call the file's sym_offsets function to convert this
+   into a format-specific offset table --- a `struct section_offsets'.
+   If ADDRS is non-zero, OFFSETS must be zero.
+
+   OFFSETS is a table of section offsets already in the right
+   format-specific representation.  NUM_OFFSETS is the number of
+   elements present in OFFSETS->offsets.  If OFFSETS is non-zero, we
+   assume this is the proper table the call to sym_offsets described
+   above would produce.  Instead of calling sym_offsets, we just dump
+   it right into objfile->section_offsets.  (When we're re-reading
+   symbols from an objfile, we don't have the original load address
+   list any more; all we have is the section offset table.)  If
+   OFFSETS is non-zero, ADDRS must be zero.
 
    MAINLINE is nonzero if this is the main symbol file, or zero if
    it's an extra symbol file such as dynamically loaded code.
@@ -581,8 +600,12 @@ default_symfile_offsets (struct objfile *objfile,
    the symbol reading (and complaints can be more terse about it).  */
 
 void
-syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
-                  int mainline, int verbo)
+syms_from_objfile (struct objfile *objfile,
+                   struct section_addr_info *addrs,
+                   struct section_offsets *offsets,
+                   int num_offsets,
+                  int mainline,
+                   int verbo)
 {
   asection *lower_sect;
   asection *sect;
@@ -591,16 +614,19 @@ syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
   struct cleanup *old_chain;
   int i;
 
-  /* If ADDRS is NULL, initialize the local section_addr_info struct and
-     point ADDRS to it.  We now establish the convention that an addr of
-     zero means no load address was specified. */
+  gdb_assert (! (addrs && offsets));
 
-  if (addrs == NULL)
+  /* If ADDRS and OFFSETS are both NULL, put together a dummy address
+     list.  We now establish the convention that an addr of zero means
+     no load address was specified. */
+  if (! addrs && ! offsets)
     {
       memset (&local_addr, 0, sizeof (local_addr));
       addrs = &local_addr;
     }
 
+  /* Now either addrs or offsets is non-zero.  */
+
   init_entry_point_info (objfile);
   find_sym_fns (objfile);
 
@@ -673,30 +699,32 @@ syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
         this_offset = lower_offset = lower_addr - lower_orig_addr */
 
       /* Calculate offsets for sections. */
-      for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++)
-       {
-         if (addrs->other[i].addr != 0)
-           {
-             sect = bfd_get_section_by_name (objfile->obfd,
-                                              addrs->other[i].name);
-             if (sect)
-               {
-                 addrs->other[i].addr
-                    -= bfd_section_vma (objfile->obfd, sect);
-                 lower_offset = addrs->other[i].addr;
-                 /* This is the index used by BFD. */
-                 addrs->other[i].sectindex = sect->index ;
-               }
-             else
-               {
-                 warning ("section %s not found in %s", addrs->other[i].name, 
-                          objfile->name);
-                 addrs->other[i].addr = 0;
-               }
-           }
-         else
-           addrs->other[i].addr = lower_offset;
-       }
+      if (addrs)
+        for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++)
+          {
+            if (addrs->other[i].addr != 0)
+              {
+                sect = bfd_get_section_by_name (objfile->obfd,
+                                                addrs->other[i].name);
+                if (sect)
+                  {
+                    addrs->other[i].addr
+                      -= bfd_section_vma (objfile->obfd, sect);
+                    lower_offset = addrs->other[i].addr;
+                    /* This is the index used by BFD. */
+                    addrs->other[i].sectindex = sect->index ;
+                  }
+                else
+                  {
+                    warning ("section %s not found in %s",
+                             addrs->other[i].name, 
+                             objfile->name);
+                    addrs->other[i].addr = 0;
+                  }
+              }
+            else
+              addrs->other[i].addr = lower_offset;
+          }
     }
 
   /* Initialize symbol reading routines for this objfile, allow complaints to
@@ -706,7 +734,21 @@ syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
   (*objfile->sf->sym_init) (objfile);
   clear_complaints (&symfile_complaints, 1, verbo);
 
-  (*objfile->sf->sym_offsets) (objfile, addrs);
+  if (addrs)
+    (*objfile->sf->sym_offsets) (objfile, addrs);
+  else
+    {
+      size_t size = SIZEOF_N_SECTION_OFFSETS (num_offsets);
+
+      /* Just copy in the offset table directly as given to us.  */
+      objfile->num_sections = num_offsets;
+      objfile->section_offsets
+        = ((struct section_offsets *)
+           obstack_alloc (&objfile->psymbol_obstack, size));
+      memcpy (objfile->section_offsets, offsets, size);
+
+      init_objfile_sect_indices (objfile);
+    }
 
 #ifndef IBM6000_TARGET
   /* This is a SVR4/SunOS specific hack, I think.  In any event, it
@@ -887,7 +929,7 @@ symbol_file_add (char *name, int from_tty, struct section_addr_info *addrs,
              gdb_flush (gdb_stdout);
            }
        }
-      syms_from_objfile (objfile, addrs, mainline, from_tty);
+      syms_from_objfile (objfile, addrs, 0, 0, mainline, from_tty);
     }
 
   /* We now have at least a partial symbol table.  Check to see if the
index 62dfcefb54b56574a2aef45334890936f1cde18a..66c8d971fe2b9b0fdd1fa306e21dfec32c161838 100644 (file)
@@ -175,7 +175,10 @@ extern void add_symtab_fns (struct sym_fns *);
 extern void init_entry_point_info (struct objfile *);
 
 extern void
-syms_from_objfile (struct objfile *, struct section_addr_info *, int, int);
+syms_from_objfile (struct objfile *,
+                   struct section_addr_info *, 
+                   struct section_offsets *, int,
+                   int, int);
 
 extern void new_symfile_objfile (struct objfile *, int, int);