From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18985 invoked by alias); 26 Nov 2002 02:28:39 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18922 invoked from network); 26 Nov 2002 02:28:20 -0000 Received: from unknown (HELO zenia.red-bean.com) (66.244.67.22) by sources.redhat.com with SMTP; 26 Nov 2002 02:28:20 -0000 Received: (from jimb@localhost) by zenia.red-bean.com (8.11.6/8.11.6) id gAQ29aZ27148; Mon, 25 Nov 2002 21:09:36 -0500 To: Elena Zannoni Cc: gdb-patches@sources.redhat.com Subject: Re: RFC: allow syms_from_objfile to take a section offset table directly References: <15842.38074.837841.272380@localhost.redhat.com> From: Jim Blandy Date: Mon, 25 Nov 2002 18:28:00 -0000 In-Reply-To: <15842.38074.837841.272380@localhost.redhat.com> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2.92 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-11/txt/msg00632.txt.bz2 Elena Zannoni writes: > I must confess, I have a problem. I can't read anything but unified diffs. > Jim, could you please please repost diff -u output? Sure: 2002-11-25 Jim Blandy * 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/ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.3502 diff -u -r1.3502 ChangeLog --- gdb/ChangeLog 25 Nov 2002 21:00:51 -0000 1.3502 +++ gdb/ChangeLog 26 Nov 2002 02:25:44 -0000 @@ -1,5 +1,15 @@ 2002-11-25 Jim Blandy + * 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: gdb/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.279 diff -u -r1.279 Makefile.in --- gdb/Makefile.in 9 Nov 2002 03:14:11 -0000 1.279 +++ gdb/Makefile.in 26 Nov 2002 02:25:46 -0000 @@ -2207,7 +2207,8 @@ $(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: gdb/rs6000-nat.c =================================================================== RCS file: /cvs/src/src/gdb/rs6000-nat.c,v retrieving revision 1.27 diff -u -r1.27 rs6000-nat.c --- gdb/rs6000-nat.c 26 Jul 2002 23:12:59 -0000 1.27 +++ gdb/rs6000-nat.c 26 Nov 2002 02:25:54 -0000 @@ -685,7 +685,7 @@ { 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: gdb/symfile.c =================================================================== RCS file: /cvs/src/src/gdb/symfile.c,v retrieving revision 1.74 diff -u -r1.74 symfile.c --- gdb/symfile.c 25 Nov 2002 21:00:51 -0000 1.74 +++ gdb/symfile.c 26 Nov 2002 02:25:56 -0000 @@ -42,6 +42,7 @@ #include "gdb_obstack.h" #include "completer.h" #include "bcache.h" +#include "gdb_assert.h" #include #include @@ -571,8 +572,26 @@ 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 @@ 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 @@ 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 @@ 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 @@ (*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 @@ 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: gdb/symfile.h =================================================================== RCS file: /cvs/src/src/gdb/symfile.h,v retrieving revision 1.14 diff -u -r1.14 symfile.h --- gdb/symfile.h 17 Oct 2002 21:16:12 -0000 1.14 +++ gdb/symfile.h 26 Nov 2002 02:25:56 -0000 @@ -175,7 +175,10 @@ 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);