summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2007-10-31 19:09:14 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2007-10-31 19:09:14 +0000
commit02c75f7232cf582a5ec8ec752e14b10cf72f6d1a (patch)
tree7008b4b41fbbbcf65a7449937950be86d050b238 /gdb
parent8f3bca322366c93d642c4fca6e880660c3dc029f (diff)
downloadbinutils-gdb-02c75f7232cf582a5ec8ec752e14b10cf72f6d1a.tar.gz
* elfread.c (elf_symtab_read): When constructing a solib trampoline
minimal symbol from an undefined dynamic symbol, use proper section.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/elfread.c26
2 files changed, 28 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c32d77c65c2..d95746c3e03 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-31 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * elfread.c (elf_symtab_read): When constructing a solib trampoline
+ minimal symbol from an undefined dynamic symbol, use proper section.
+
2007-10-31 Markus Deuling <deuling@de.ibm.com>
* arm-linux-nat.c (fetch_register, fetch_regs): Use get_regcache_arch
diff --git a/gdb/elfread.c b/gdb/elfread.c
index e479a7698a7..26ee99e4701 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -240,6 +240,8 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
&& (sym->flags & BSF_FUNCTION))
{
struct minimal_symbol *msym;
+ bfd *abfd = objfile->obfd;
+ asection *sect;
/* Symbol is a reference to a function defined in
a shared library.
@@ -252,10 +254,28 @@ elf_symtab_read (struct objfile *objfile, int dynamic,
symaddr = sym->value;
if (symaddr == 0)
continue;
- symaddr += offset;
+
+ /* sym->section is the undefined section. However, we want to
+ record the section where the PLT stub resides with the
+ minimal symbol. Search the section table for the one that
+ covers the stub's address. */
+ for (sect = abfd->sections; sect != NULL; sect = sect->next)
+ {
+ if ((bfd_get_section_flags (abfd, sect) & SEC_ALLOC) == 0)
+ continue;
+
+ if (symaddr >= bfd_get_section_vma (abfd, sect)
+ && symaddr < bfd_get_section_vma (abfd, sect)
+ + bfd_get_section_size (sect))
+ break;
+ }
+ if (!sect)
+ continue;
+
+ symaddr += ANOFFSET (objfile->section_offsets, sect->index);
+
msym = record_minimal_symbol
- ((char *) sym->name, symaddr,
- mst_solib_trampoline, sym->section, objfile);
+ ((char *) sym->name, symaddr, mst_solib_trampoline, sect, objfile);
if (msym != NULL)
msym->filename = filesymname;
continue;