]> Cypherpunks repositories - gostls13.git/commit
debug/dwarf: fix problem with DWARF 5 and Seek method
authorThan McIntosh <thanm@golang.org>
Fri, 7 Mar 2025 19:16:28 +0000 (14:16 -0500)
committerThan McIntosh <thanm@golang.org>
Mon, 10 Mar 2025 16:05:58 +0000 (09:05 -0700)
commite256e640604bff7916ef09451da7f4a6423152a6
tree28e3725997dfb1f8e9950805be882acd43bed9b7
parentc3e7d5f5cee29669d5d824f697e3b16a08815df0
debug/dwarf: fix problem with DWARF 5 and Seek method

When clients use debug/dwarf to examine DWARF 5 binaries, we can run
into problems when the Seek() method is used to skip ahead from a DIE
in one compilation unit to a DIE in another unit. The problem here is
that it is common for DWARF 5 comp units to have attributes (ex:
DW_AT_addr_base) whose value must be applied as an offset when reading
certain forms (ex: DW_FORM_addrx) within that unit. The existing
implementation didn't have a good way to recover these attrs following
the Seek call, and had to essentially punt in this case, resulting in
incorrect attr values.

This patch adds new support for reading and caching the key comp unit
DIE attributes (DW_AT_addr_base, DW_AT_loclists_base, etc) prior to
visiting any of the DIE entries in a unit, storing the cache values of
these attrs the main table of units. This base attribute
reading/caching behavior also happens (where needed) after Seek calls.

Should resolve delve issue 3861.
Supercedes Go pull request 70400.

Updates #26379.
Fixes #57046.

Change-Id: I536a57e2ba4fc55132d91c7f36f67a91ac408dc3
Reviewed-on: https://go-review.googlesource.com/c/go/+/655976
Reviewed-by: Alessandro Arzilli <alessandro.arzilli@gmail.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/debug/dwarf/entry.go
src/debug/dwarf/entry_test.go
src/debug/dwarf/testdata/issue57046-clang.elf5 [new file with mode: 0755]
src/debug/dwarf/testdata/issue57046_part1.c [new file with mode: 0644]
src/debug/dwarf/testdata/issue57046_part2.c [new file with mode: 0644]
src/debug/dwarf/unit.go