diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/rs6000-nat.c | 2 | ||||
-rw-r--r-- | gdb/symfile.c | 110 | ||||
-rw-r--r-- | gdb/symfile.h | 6 |
5 files changed, 94 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 46274015ab4..81e1f69e924 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2003-01-22 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). + 2003-01-22 Daniel Jacobowitz <drow@mvista.com> Original patch by Tom Tromey <tromey@cygnus.com> and diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 2dda3772fa7..21828a5e114 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2220,7 +2220,7 @@ symfile.o: symfile.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(gdbcore_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) \ - $(readline_h) + $(gdb_assert_h) $(readline_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 65b4130c608..4aed8d8a939 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -684,7 +684,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 a01b25b6551..1cc5d502048 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -43,6 +43,7 @@ #include "completer.h" #include "bcache.h" #include <readline/readline.h> +#include "gdb_assert.h" #include <sys/types.h> #include <fcntl.h> @@ -572,8 +573,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. @@ -582,8 +601,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; @@ -592,16 +615,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); @@ -674,30 +700,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 @@ -707,7 +735,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 @@ -888,7 +930,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 38d1145e4f3..060eb4cdee9 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -174,8 +174,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); +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); |