60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package proc
|
|
|
|
import (
|
|
"debug/elf"
|
|
"debug/macho"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/go-delve/delve/pkg/internal/gosym"
|
|
)
|
|
|
|
func readPcLnTableElf(exe *elf.File, path string) (*gosym.Table, uint64, error) {
|
|
// Default section label is .gopclntab
|
|
sectionLabel := ".gopclntab"
|
|
|
|
section := exe.Section(sectionLabel)
|
|
if section == nil {
|
|
// binary may be built with -pie
|
|
sectionLabel = ".data.rel.ro.gopclntab"
|
|
section = exe.Section(sectionLabel)
|
|
if section == nil {
|
|
return nil, 0, errors.New("could not read section .gopclntab")
|
|
}
|
|
}
|
|
tableData, err := section.Data()
|
|
if err != nil {
|
|
return nil, 0, errors.New("found section but could not read .gopclntab")
|
|
}
|
|
|
|
addr := exe.Section(".text").Addr
|
|
lineTable := gosym.NewLineTable(tableData, addr)
|
|
symTable, err := gosym.NewTable([]byte{}, lineTable)
|
|
if err != nil {
|
|
return nil, 0, fmt.Errorf("could not create symbol table from %s ", path)
|
|
}
|
|
return symTable, section.Addr, nil
|
|
}
|
|
|
|
func readPcLnTableMacho(exe *macho.File, path string) (*gosym.Table, uint64, error) {
|
|
// Default section label is __gopclntab
|
|
sectionLabel := "__gopclntab"
|
|
|
|
section := exe.Section(sectionLabel)
|
|
if section == nil {
|
|
return nil, 0, errors.New("could not read section __gopclntab")
|
|
}
|
|
tableData, err := section.Data()
|
|
if err != nil {
|
|
return nil, 0, errors.New("found section but could not read __gopclntab")
|
|
}
|
|
|
|
addr := exe.Section("__text").Addr
|
|
lineTable := gosym.NewLineTable(tableData, addr)
|
|
symTable, err := gosym.NewTable([]byte{}, lineTable)
|
|
if err != nil {
|
|
return nil, 0, fmt.Errorf("could not create symbol table from %s ", path)
|
|
}
|
|
return symTable, section.Addr, nil
|
|
}
|