On 01/14/2015 08:47 AM, Mark Wielaard wrote: > On Wed, 2015-01-14 at 09:26 -0500, Jason P. Leasure wrote: >> The type_offset of a type unit header is relative to the beginning >> of the type unit header. >> >> Signed-off-by: Jason P. Leasure <[email protected]> >> --- >> libdw/dwarf_formref_die.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c >> index 63f6697..8b92e22 100644 >> --- a/libdw/dwarf_formref_die.c >> +++ b/libdw/dwarf_formref_die.c >> @@ -95,7 +95,7 @@ dwarf_formref_die (attr, result) >> >> datap = cu->dbg->sectiondata[IDX_debug_types]->d_buf; >> size = cu->dbg->sectiondata[IDX_debug_types]->d_size; >> - offset = cu->type_offset; >> + offset = cu->start + cu->type_offset; > > Thanks, I believe this is correct. I am surprised we didn't encounter > this earlier. Do you happen to have a testcase for it?
It's a regression from commit 9202665816763, before which cu->start was used with the offset everywhere. I can see this in my dwarvish tool with Jason's example source. You just need a ref_sig8 that's not in the first type_unit, cu->start > 0. So here, struct A has a ref_sig8 to struct B in the second type_unit. In the bad case I see "signature ref_sig8 [30] 0", where those last two bits are supposed to be the offset and tag. I see "signature ref_sig8 [72] structure_type" with 0.160, or with master and this patch, and it expands the tree of attributes from there. Of course you won't want a GUI for tests, but it should be easy to craft this one directly.
