From 02c75f7232cf582a5ec8ec752e14b10cf72f6d1a Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 31 Oct 2007 19:09:14 +0000 Subject: [PATCH] * elfread.c (elf_symtab_read): When constructing a solib trampoline minimal symbol from an undefined dynamic symbol, use proper section. --- gdb/ChangeLog | 5 +++++ gdb/elfread.c | 26 +++++++++++++++++++++++--- 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 + + * 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 * 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; -- 2.30.2