diff options
| author | Alessandro Arzilli <alessandro.arzilli@gmail.com> | 2024-08-28 10:16:10 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2024-08-30 17:51:51 +0000 |
| commit | 4f327f271d5cf0f6cc6e1bbac72aecaa25ca6e6f (patch) | |
| tree | bb9c11e22ceef3216b74319e4c9901edf28c9e8e /src/debug | |
| parent | 7300b9e633f8b8cb49e2e95f4c4693657ded3451 (diff) | |
| download | go-4f327f271d5cf0f6cc6e1bbac72aecaa25ca6e6f.tar.xz | |
debug/macho: fix DWARF for section names longer than 16 chars
The Mach-O file format truncates section names to 16 characters
maximum, which makes some sections unrecognizable to debug/dwarf.
This CL works around this problem by re-expanding the truncated section
names.
This problem was originally reported as:
https://github.com/go-delve/delve/issues/3797
Change-Id: I8c4a02493b8d5c3f63c831da43f6292124edf670
Reviewed-on: https://go-review.googlesource.com/c/go/+/608995
Auto-Submit: Ian Lance Taylor <iant@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/debug')
| -rw-r--r-- | src/debug/macho/file.go | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/debug/macho/file.go b/src/debug/macho/file.go index 7b11bb2954..fcf28c4b25 100644 --- a/src/debug/macho/file.go +++ b/src/debug/macho/file.go @@ -610,15 +610,33 @@ func (f *File) Section(name string) *Section { // DWARF returns the DWARF debug information for the Mach-O file. func (f *File) DWARF() (*dwarf.Data, error) { dwarfSuffix := func(s *Section) string { + sectname := s.Name + var pfx int switch { - case strings.HasPrefix(s.Name, "__debug_"): - return s.Name[8:] - case strings.HasPrefix(s.Name, "__zdebug_"): - return s.Name[9:] + case strings.HasPrefix(sectname, "__debug_"): + pfx = 8 + case strings.HasPrefix(sectname, "__zdebug_"): + pfx = 9 default: return "" } - + // Mach-O executables truncate section names to 16 characters, mangling some DWARF sections. + // As of DWARFv5 these are the only problematic section names (see DWARFv5 Appendix G). + for _, longname := range []string{ + "__debug_str_offsets", + "__zdebug_line_str", + "__zdebug_loclists", + "__zdebug_pubnames", + "__zdebug_pubtypes", + "__zdebug_rnglists", + "__zdebug_str_offsets", + } { + if sectname == longname[:16] { + sectname = longname + break + } + } + return sectname[pfx:] } sectionData := func(s *Section) ([]byte, error) { b, err := s.Data() |
