From 8240bcfba31d7a7cafb172f41de57bdf4d4b1cee Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Tue, 26 Nov 2002 02:32:13 +0000 Subject: [PATCH] * 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). --- gdb/ChangeLog | 10 +++++ gdb/Makefile.in | 3 +- gdb/rs6000-nat.c | 2 +- gdb/symfile.c | 110 ++++++++++++++++++++++++++++++++--------------- gdb/symfile.h | 5 ++- 5 files changed, 93 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ed3e9c781b2..b089ef83713 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index aa401e47f7e..2d1d1bb9915 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) \ diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 65256f44711..bf784cef35a 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -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; } diff --git a/gdb/symfile.c b/gdb/symfile.c index 0ede698f3c3..800b65ffc04 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -42,6 +42,7 @@ #include "gdb_obstack.h" #include "completer.h" #include "bcache.h" +#include "gdb_assert.h" #include #include @@ -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 diff --git a/gdb/symfile.h b/gdb/symfile.h index 62dfcefb54b..66c8d971fe2 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -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); -- 2.47.2