[PATCH] libbacktrace: Fix up DWARF5 .debug_line handling [PR98716]
Ian Lance Taylor
iant@golang.org
Mon Jan 18 20:11:02 GMT 2021
On Mon, Jan 18, 2021 at 10:44 AM Jakub Jelinek via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> When GCC (since the switch to -gdwarf-5 by default) is configured and built
> against recent binutils (2.35.1 if slightly patched, or 2.36 or trunk),
> the assembler emits DWARF5 .debug_line rather than DWARF4 or older
> .debug_line.
>
> Seems some DWARF5 support has been added to libbacktrace, but there is one
> problem. The DWARF5 spec (like DWARF4 spec) says that the initial value of
> file is 1, but unlike DWARF4 and earlier which had in the filename table
> entries starting with 1, DWARF5 has an 0 entry before that (which is
> supposed to match DW_AT_name and DW_AT_comps_dir pair in the .debug_info
> CU).
>
> The following patch fixes that.
>
> On i686-linux when built against those new binutils this fixes (the
> c-c++-common tests for both C and C++):
> -FAIL: c-c++-common/asan/alloca_big_alignment.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/alloca_big_alignment.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/alloca_detect_custom_size.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/alloca_detect_custom_size.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/alloca_overflow_partial.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/alloca_overflow_partial.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/alloca_overflow_right.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/alloca_overflow_right.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/alloca_underflow_left.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/alloca_underflow_left.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/global-overflow-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/global-overflow-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/heap-overflow-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/heap-overflow-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/null-deref-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/null-deref-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/sanity-check-pure-c-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/sanity-check-pure-c-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/strncpy-overflow-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/strncpy-overflow-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: c-c++-common/asan/use-after-free-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: c-c++-common/asan/use-after-free-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: g++.dg/asan/large-func-test-1.C -O2 -flto -fno-use-linker-plugin -flto-partition=none output pattern test
> -FAIL: g++.dg/asan/large-func-test-1.C -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects output pattern test
> -FAIL: TestCaller
>
> Bootstrapped/regtested on x86_64-linux and i686-linux (2.35.1 binutils but
> not patched) and i686-linux (latest binutils), x86_64-linux regtest still
> pending, ok for trunk?
>
> 2021-01-18 Jakub Jelinek <jakub@redhat.com>
>
> PR debug/98716
> * dwarf.c (read_line_program): For DWARF5 .debug_line headers,
> start with hdr->filenames[1] rather than hdr->filenames[0].
>
> --- libbacktrace/dwarf.c.jj 2021-01-04 10:25:53.495067802 +0100
> +++ libbacktrace/dwarf.c 2021-01-18 14:27:05.034589998 +0100
> @@ -2715,8 +2715,11 @@ read_line_program (struct backtrace_stat
>
> address = 0;
> op_index = 0;
> - if (hdr->filenames_count > 0)
> - reset_filename = hdr->filenames[0];
> + /* The initial file is file with index 1. In DWARF4 and earlier
> + filename table starts with entry 1, while in DWARF5 it starts
> + with entry 0 which should match the CU's DW_AT_name attribute. */
> + if (hdr->filenames_count > (hdr->version >= 5))
> + reset_filename = hdr->filenames[hdr->version >= 5];
> else
> reset_filename = "";
> filename = reset_filename;
Thanks, but I think more changes are needed. Looking up entries in
the filenames array will be off by one for DWARF 5 in other places as
well, specifically when handling DW_LNS_set_file and DW_AT_call_file.
I'm testing a larger patch now.
Ian
More information about the Gcc-patches
mailing list