RFC: allow syms_from_objfile to take a section offset table directly

Jim Blandy jimb@redhat.com
Mon Nov 25 13:17:00 GMT 2002


This change is useful when you don't have the section_addr_info
structs any more, but you do have the offset table from an existing
objfile --- say, when you're reloading symbols.

A patch that uses the new interface is forthcoming.

Comments welcome, of course.

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).

Index: gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.279
diff -c -r1.279 Makefile.in
*** gdb/Makefile.in	9 Nov 2002 03:14:11 -0000	1.279
--- gdb/Makefile.in	25 Nov 2002 20:32:25 -0000
***************
*** 2207,2213 ****
  	$(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)
  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) \
--- 2207,2214 ----
  	$(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) \
! 	$(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: gdb/rs6000-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/rs6000-nat.c,v
retrieving revision 1.27
diff -c -r1.27 rs6000-nat.c
*** gdb/rs6000-nat.c	26 Jul 2002 23:12:59 -0000	1.27
--- gdb/rs6000-nat.c	25 Nov 2002 20:32:33 -0000
***************
*** 685,691 ****
  {
    struct objfile *obj = (struct objfile *) arg;
  
!   syms_from_objfile (obj, NULL, 0, 0);
    new_symfile_objfile (obj, 0, 0);
    return 1;
  }
--- 685,691 ----
  {
    struct objfile *obj = (struct objfile *) arg;
  
!   syms_from_objfile (obj, NULL, 0, 0, 0, 0);
    new_symfile_objfile (obj, 0, 0);
    return 1;
  }
Index: gdb/symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.73
diff -c -r1.73 symfile.c
*** gdb/symfile.c	25 Nov 2002 20:11:35 -0000	1.73
--- gdb/symfile.c	25 Nov 2002 20:32:35 -0000
***************
*** 42,47 ****
--- 42,48 ----
  #include "gdb_obstack.h"
  #include "completer.h"
  #include "bcache.h"
+ #include "gdb_assert.h"
  
  #include <sys/types.h>
  #include <fcntl.h>
***************
*** 561,568 ****
  
     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.
  
     MAINLINE is nonzero if this is the main symbol file, or zero if
     it's an extra symbol file such as dynamically loaded code.
--- 562,587 ----
  
     OBJFILE is where the symbols are to be read from.
  
!    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.
***************
*** 571,578 ****
     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)
  {
    asection *lower_sect;
    asection *sect;
--- 590,601 ----
     the symbol reading (and complaints can be more terse about it).  */
  
  void
! 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;
***************
*** 581,596 ****
    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. */
  
!   if (addrs == NULL)
      {
        memset (&local_addr, 0, sizeof (local_addr));
        addrs = &local_addr;
      }
  
    init_entry_point_info (objfile);
    find_sym_fns (objfile);
  
--- 604,622 ----
    struct cleanup *old_chain;
    int i;
  
!   gdb_assert (! (addrs && offsets));
  
!   /* 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);
  
***************
*** 663,692 ****
   	 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;
! 	}
      }
  
    /* Initialize symbol reading routines for this objfile, allow complaints to
--- 689,720 ----
   	 this_offset = lower_offset = lower_addr - lower_orig_addr */
  
        /* Calculate offsets for sections. */
!       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
***************
*** 696,702 ****
    (*objfile->sf->sym_init) (objfile);
    clear_complaints (&symfile_complaints, 1, verbo);
  
!   (*objfile->sf->sym_offsets) (objfile, addrs);
  
  #ifndef IBM6000_TARGET
    /* This is a SVR4/SunOS specific hack, I think.  In any event, it
--- 724,744 ----
    (*objfile->sf->sym_init) (objfile);
    clear_complaints (&symfile_complaints, 1, verbo);
  
!   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
***************
*** 877,883 ****
  	      gdb_flush (gdb_stdout);
  	    }
  	}
!       syms_from_objfile (objfile, addrs, mainline, from_tty);
      }
  
    /* We now have at least a partial symbol table.  Check to see if the
--- 919,925 ----
  	      gdb_flush (gdb_stdout);
  	    }
  	}
!       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: gdb/symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.14
diff -c -r1.14 symfile.h
*** gdb/symfile.h	17 Oct 2002 21:16:12 -0000	1.14
--- gdb/symfile.h	25 Nov 2002 20:32:35 -0000
***************
*** 175,181 ****
  extern void init_entry_point_info (struct objfile *);
  
  extern void
! syms_from_objfile (struct objfile *, struct section_addr_info *, int, int);
  
  extern void new_symfile_objfile (struct objfile *, int, int);
  
--- 175,184 ----
  extern void init_entry_point_info (struct objfile *);
  
  extern void
! syms_from_objfile (struct objfile *,
!                    struct section_addr_info *, 
!                    struct section_offsets *, int,
!                    int, int);
  
  extern void new_symfile_objfile (struct objfile *, int, int);
  



More information about the Gdb-patches mailing list