diff --git a/src/cmd/internal/objfile/macho.go b/src/cmd/internal/objfile/macho.go
index eaf665f..d2b4228 100644
--- a/src/cmd/internal/objfile/macho.go
+++ b/src/cmd/internal/objfile/macho.go
@@ -87,6 +87,13 @@
if pclntab, err = sect.Data(); err != nil {
return 0, nil, err
}
+ return textStart, pclntab, nil
+ }
+ if sect := f.macho.Section("__lrodata_gopcln"); sect != nil {
+ if pclntab, err = sect.Data(); err != nil {
+ return 0, nil, err
+ }
+ return textStart, pclntab, nil
}
return textStart, pclntab, nil
}
diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index 5b6dabb..c9fe261 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -2140,7 +2140,7 @@
}
/* gopclntab */
- sect = state.allocateNamedSectionAndAssignSyms(segro, ".gopclntab", sym.SPCLNTAB, sym.SRODATA, 04)
+ sect = state.allocateNamedSectionAndAssignSyms(segro, ".lrodata.gopclntab", sym.SPCLNTAB, sym.SRODATA, 04)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pcheader", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.funcnametab", 0), sect)
diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go
index bc7504e..727c5cc 100644
--- a/src/cmd/link/link_test.go
+++ b/src/cmd/link/link_test.go
@@ -1879,7 +1879,7 @@
}
for _, sec := range mf.Sections {
- if sec.Name == "__gopclntab" {
+ if sec.Name == "__gopclntab" || sec.Name == "__lrodata_gopcln" {
data, err := sec.Data()
if err != nil {
t.Fatal(err)
diff --git a/src/runtime/stkframe.go b/src/runtime/stkframe.go
index b63c0b4..56cb874 100644
--- a/src/runtime/stkframe.go
+++ b/src/runtime/stkframe.go
@@ -269,6 +269,11 @@
ptr := uintptr(unsafe.Pointer(&methodValueCallFrameObjs[0]))
var mod *moduledata
for datap := &firstmoduledata; datap != nil; datap = datap.next {
+ // Check if ptr is in pclntab section (gofunc to epclntab).
+ if datap.gofunc <= ptr && ptr < datap.epclntab {
+ mod = datap
+ break
+ }
if datap.noptrbss <= ptr && ptr < datap.enoptrbss {
mod = datap
break