[PATCH] Fix .debug_line reference above end of section
Tom de Vries
tdevries@suse.de
Thu Mar 4 08:33:43 GMT 2021
On 3/4/21 1:33 AM, Mark Wielaard wrote:
> Hi Tom,
>
> On Tue, Mar 02, 2021 at 02:57:14PM +0100, Tom de Vries wrote:
>> Consider the file test-import-repeatedly from PR26738, combined with a trivial
>> a.out:
>> ...
>> $ cp test-import-repeatedly 1
>> $ gcc -m32 -g ~/hello.c
>> $ cp a.out 2
>> ...
>>
>> When doing multifile optimization, we run into:
>> ...
>> $ dwz -m 3 2 1
>> dwz: 3: .debug_line reference above end of section
>> ...
>>
>> Using --devel-save-temps and src/contrib/gen-dwz-debug-all.sh we get the
>> unoptimized multifile, and find there a CU:
>> ...
>> Compilation Unit @ offset 0x371:
>> Length: 0x6d (32-bit)
>> Version: 4
>> Abbrev Offset: 0x14d
>> Pointer Size: 4
>> <0><37c>: Abbrev Number: 1 (DW_TAG_compile_unit)
>> <37d> DW_AT_stmt_list : 0xda
>> <381> DW_AT_language : 0 (Unknown: 0)
>> <382> DW_AT_comp_dir : ./build-3.8
>> ...
>> which refers to a .debug_line offset 0xda, but the debug_line section only
>> contains an entry at offset 0x0.
>
> I was unable to replicate this, so it is a little harder to comment in
> this. I don't fully understand why this happens, is this because of
> something in the input file or because we move all DIEs with file
> attributes?
>
This is because all the DIEs from the input file that are written into
the unoptimized multifile don't have any attributes referring to the
file table.
> Would it be possible to attach the various temp files to the bug
> report?
>
Done.
>> This can be explained as follows. The DIEs written into the CU do not
>> contain a single DW_AT_decl_file. Consequently, htab_line will be NULL once
>> we get here in write_multifile:
>> ...
>> || (line_htab != NULL && write_multifile_line ()))
>> ...
>> and no .debug_line contribution will be added. However, the CU DIE
>> referencing the .debug_line contribution is written regardless.
>>
>> We could fix this by not writing the DW_AT_stmt_list for the CU DIE in this
>> case, but that would require changing the order in which abbreviations are
>> computed.
>>
>> Instead, fix this conservatively, by removing "line_htab != NULL &&", such we
>> get a minimal .debug_line contribution.
>
> This does look technically OK. write_multifile_line does handle line_htab == NULL
> correctly and sets up multi_line_off which will be used to write the
> DW_AT_stmt_list.
>
> But if the CU doesn't have a DW_AT_stmt_list this will produce an
> unnecessary line table (stub).
Ack. The fix is conservative.
> I cannot immediately see whether this
> is an odd corner case that normally wouldn't happen in practice or if
> that could happen more often.
I've seen this error before, so it's not completely cornercase.
Thanks,
- Tom
More information about the Dwz
mailing list