aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Arzilli <alessandro.arzilli@gmail.com>2024-08-28 10:16:10 +0200
committerGopher Robot <gobot@golang.org>2024-08-30 17:51:51 +0000
commit4f327f271d5cf0f6cc6e1bbac72aecaa25ca6e6f (patch)
treebb9c11e22ceef3216b74319e4c9901edf28c9e8e
parent7300b9e633f8b8cb49e2e95f4c4693657ded3451 (diff)
downloadgo-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>
-rw-r--r--src/debug/macho/file.go28
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()