> > Looking deeper into this, the problem is that GDB determins that
> > this symbol is in the .data section. The code that recognizes
> > function descriptors for ia64 checks first that the associated
> > section name is ".opd", or else checks the name of the symbol
> > with is_vtable_name() (see ia64-tdep.c:ia64_convert_from_func_ptr_addr).
> >
> > I double checked /lib/ld-linux-ia64.so.2, and unless I'm mistaken,
> > the debugger is correct. Our address is inside the .data section
> > of the loader. There is no .opd section in sight.
Eric Botcazou suggested that an address pointing to the .data section
should never be some code because the .data section is not executable;
So we could simply check the flags of our section, and if it doesn't
have the CODE flag set, then assume it's a function descriptor.
I have succesfully tested the following patch with gdb-6.8 (HEAD is
having some issues causing the inferior to fail to start with a SIGILL
at the moment - I'll look at that next).
2008-04-25 Joel Brobecker <brobecker@adacore.com>
* ia64-tdep.c (ia64_convert_from_func_ptr_addr): Treat addresses
pointing inside a non-executable section as function descriptors.
Results before and after the patch:
+------------+------------+----------------------------------------------------+
| FAIL | PASS | attach.exp: after attach2, reach tbreak postloop |
| FAIL | PASS | attach.exp: after attach2, exit |
| UNRESOLVED | PASS | attach.exp: before attach3, flush exec |
| UNRESOLVED | PASS | attach.exp: attach when process' a.out not in cwd |
| FAIL | PASS | attach.exp: c |
+------------+------------+----------------------------------------------------+
The attached patch is something that I would consider for gdb-6.8.
For gdb-head, I might even go one step farther and remove the check
for the .opd section name just above, since the new check should
handle the .opd section as well.
I'm also wondering about the vtable-related symbols, but that's
harder for me to verify...
What do you think?
--
Joel
-------------- next part --------------
Index: ia64-tdep.c
===================================================================
--- ia64-tdep.c (revision 130268)
+++ ia64-tdep.c (working copy)
@@ -3328,6 +3328,12 @@ ia64_convert_from_func_ptr_addr (struct
if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
return read_memory_unsigned_integer (addr, 8);
+ /* If ADDR points to a section that is not executable, then it cannot
+ be pointing to a function. So it must be pointing to a function
+ descriptor. */
+ if (s && (s->the_bfd_section->flags & SEC_CODE) == 0)
+ return read_memory_unsigned_integer (addr, 8);
+
/* There are also descriptors embedded in vtables. */
if (s)
{