> Is it only with testfile-macros?
> All other testfiles always run correctly?

Yes, it only happens with the testfile-macros check at 0xb.

> Do you have the whole call stack of that failed __libdw_read_offset
> call? Which source line in tests/dwarf-getmacros.c prints the "(null)"?

I'm having a hard time triggering the problem in a controlled environment. So 
far I didn't manage to create a stack trace. The (null) is the result of 
passing a value of null to dwarf-getmacros.c:88. I get an errno of 
DWARF_E_INVALID_OFFSET at the assert failure. So I put some debug messages into 
all places where that is generated and this is how I found the source of this. 
It seems I can't trigger the effect if I put the debug output directly into 
__libdw_in_section (but maybe I was just very unlucky). If I put it in 
READ_AND_RELOCATE I can see that the check always fails before it outputs 
(null) or hits the assertion.

>> Experiments show that the address is 
>> frequently not in the section we're checking there, but still valid. 
>> Just dropping the check makes the test succeed.
> 
> I think this might be related to our "fake" CU and attributes we invent
> in libdw/dwarf_getmacros.c (read_macros). See around this comment:
> 
>           /* We pretend this is a DW_AT_GNU_macros attribute so that
>              DW_FORM_sec_offset forms get correctly interpreted as
>              offset into .debug_macro.  */
> 
> If that is the issue then we might need to somehow make
> READ_AND_RELOCATE and/or __libdw_in_section aware that the CU is fake
> and the check isn't needed. In which case we probably need to add some
> flag "fake" to the CU and pass the CU to the various __libdw_read_*
> functions to disable that sanity check in READ_AND_RELOCATE.

We don't set type_offset on the fake_cu, but we read it via cu_sec_idx when 
calling __libdw_read_offset from dwarf_formstring. This seems wrong.

Ulf

Reply via email to