if err != nil {
return nil, err
}
+ syms, err := e.raw.symbols()
+ if err == nil {
+ for _, s := range syms {
+ if s.Name == "runtime.text" {
+ textStart = s.Addr
+ break
+ }
+ }
+ }
return gosym.NewTable(symtab, gosym.NewLineTable(pclntab, textStart))
}
binary binary.ByteOrder
quantum uint32
ptrsize uint32
- textStart uintptr // address of runtime.text symbol (1.18+)
+ textStart uint64 // address of runtime.text symbol (1.18+)
funcnametab []byte
cutab []byte
funcdata []byte
case ver118:
t.nfunctab = uint32(offset(0))
t.nfiletab = uint32(offset(1))
- t.textStart = uintptr(offset(2))
+ t.textStart = t.PC // use the start PC instead of reading from the table, which may be unrelocated
t.funcnametab = data(3)
t.cutab = data(4)
t.filetab = data(5)
func (f funcTab) pc(i int) uint64 {
u := f.uint(f.functab[2*i*f.sz:])
if f.version >= ver118 {
- u += uint64(f.textStart)
+ u += f.textStart
}
return u
}
if f.t.version >= ver118 {
// TODO: support multiple text sections.
// See runtime/symtab.go:(*moduledata).textAddr.
- return uint64(f.t.binary.Uint32(f.data)) + uint64(f.t.textStart)
+ return uint64(f.t.binary.Uint32(f.data)) + f.t.textStart
}
return f.t.uintptr(f.data)
}