aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2004-05-24 16:11:17 +0000
committerKevin Buettner <kevinb@redhat.com>2004-05-24 16:11:17 +0000
commit19e2d14b479a1d87427adaf72de4bfa0643186a2 (patch)
tree3f3ef007de7d777b7a3b27b3b54d868c8aeaa977
parent2b6a3be6c8ca554973603dadb51bb209b3a2f7ad (diff)
downloadfsf-binutils-gdb-19e2d14b479a1d87427adaf72de4bfa0643186a2.zip
fsf-binutils-gdb-19e2d14b479a1d87427adaf72de4bfa0643186a2.tar.gz
fsf-binutils-gdb-19e2d14b479a1d87427adaf72de4bfa0643186a2.tar.bz2
* symtab.c (fixup_section): Search section table when lookup by
name fails.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/symtab.c56
2 files changed, 61 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 897eb2b..8f3f782 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2004-05-24 Kevin Buettner <kevinb@redhat.com>
+
+ * symtab.c (fixup_section): Search section table when lookup by
+ name fails.
+
2004-05-24 Randolph Chung <tausq@debian.org>
* hppa-tdep.c: Fix handling of 8-byte structures; they should not
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 31a1635..d9d94a0 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -876,6 +876,62 @@ fixup_section (struct general_symbol_info *ginfo, struct objfile *objfile)
ginfo->bfd_section = SYMBOL_BFD_SECTION (msym);
ginfo->section = SYMBOL_SECTION (msym);
}
+ else if (objfile)
+ {
+ /* Static, function-local variables do appear in the linker
+ (minimal) symbols, but are frequently given names that won't
+ be found via lookup_minimal_symbol(). E.g., it has been
+ observed in frv-uclinux (ELF) executables that a static,
+ function-local variable named "foo" might appear in the
+ linker symbols as "foo.6" or "foo.3". Thus, there is no
+ point in attempting to extend the lookup-by-name mechanism to
+ handle this case due to the fact that there can be multiple
+ names.
+
+ So, instead, search the section table when lookup by name has
+ failed. The ``addr'' and ``endaddr'' fields may have already
+ been relocated. If so, the relocation offset (i.e. the
+ ANOFFSET value) needs to be subtracted from these values when
+ performing the comparison. We unconditionally subtract it,
+ because, when no relocation has been performed, the ANOFFSET
+ value will simply be zero.
+
+ The address of the symbol whose section we're fixing up HAS
+ NOT BEEN adjusted (relocated) yet. It can't have been since
+ the section isn't yet known and knowing the section is
+ necessary in order to add the correct relocation value. In
+ other words, we wouldn't even be in this function (attempting
+ to compute the section) if it were already known.
+
+ Note that it is possible to search the minimal symbols
+ (subtracting the relocation value if necessary) to find the
+ matching minimal symbol, but this is overkill and much less
+ efficient. It is not necessary to find the matching minimal
+ symbol, only its section.
+
+ Note that this technique (of doing a section table search)
+ can fail when unrelocated section addresses overlap. For
+ this reason, we still attempt a lookup by name prior to doing
+ a search of the section table. */
+
+ CORE_ADDR addr;
+ struct obj_section *s;
+
+ addr = ginfo->value.address;
+
+ ALL_OBJFILE_OSECTIONS (objfile, s)
+ {
+ int idx = s->the_bfd_section->index;
+ CORE_ADDR offset = ANOFFSET (objfile->section_offsets, idx);
+
+ if (s->addr - offset <= addr && addr < s->endaddr - offset)
+ {
+ ginfo->bfd_section = s->the_bfd_section;
+ ginfo->section = idx;
+ return;
+ }
+ }
+ }
}
struct symbol *