mirror of
https://github.com/golang/go
synced 2024-11-26 04:37:59 -07:00
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>
This commit is contained in:
parent
7300b9e633
commit
4f327f271d
@ -610,15 +610,33 @@ func (f *File) Section(name string) *Section {
|
|||||||
// DWARF returns the DWARF debug information for the Mach-O file.
|
// DWARF returns the DWARF debug information for the Mach-O file.
|
||||||
func (f *File) DWARF() (*dwarf.Data, error) {
|
func (f *File) DWARF() (*dwarf.Data, error) {
|
||||||
dwarfSuffix := func(s *Section) string {
|
dwarfSuffix := func(s *Section) string {
|
||||||
|
sectname := s.Name
|
||||||
|
var pfx int
|
||||||
switch {
|
switch {
|
||||||
case strings.HasPrefix(s.Name, "__debug_"):
|
case strings.HasPrefix(sectname, "__debug_"):
|
||||||
return s.Name[8:]
|
pfx = 8
|
||||||
case strings.HasPrefix(s.Name, "__zdebug_"):
|
case strings.HasPrefix(sectname, "__zdebug_"):
|
||||||
return s.Name[9:]
|
pfx = 9
|
||||||
default:
|
default:
|
||||||
return ""
|
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) {
|
sectionData := func(s *Section) ([]byte, error) {
|
||||||
b, err := s.Data()
|
b, err := s.Data()
|
||||||
|
Loading…
Reference in New Issue
Block a user