mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link, runtime, debug/gosym: move pclntab magic to internal/abi
Change-Id: I2d3c41b0e61b994d7b04bd16a791fd226dc45269 Reviewed-on: https://go-review.googlesource.com/c/go/+/720302 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
312b2034a4
commit
43cfd785e7
4 changed files with 54 additions and 25 deletions
|
|
@ -261,7 +261,7 @@ func (state *pclntab) generatePCHeader(ctxt *Link) {
|
||||||
|
|
||||||
// Write header.
|
// Write header.
|
||||||
// Keep in sync with runtime/symtab.go:pcHeader and package debug/gosym.
|
// Keep in sync with runtime/symtab.go:pcHeader and package debug/gosym.
|
||||||
header.SetUint32(ctxt.Arch, 0, 0xfffffff1)
|
header.SetUint32(ctxt.Arch, 0, uint32(abi.CurrentPCLnTabMagic))
|
||||||
header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC))
|
header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC))
|
||||||
header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize))
|
header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize))
|
||||||
off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc))
|
off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc))
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ package gosym
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"internal/abi"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
@ -174,13 +175,6 @@ func (t *LineTable) isGo12() bool {
|
||||||
return t.version >= ver12
|
return t.version >= ver12
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
go12magic = 0xfffffffb
|
|
||||||
go116magic = 0xfffffffa
|
|
||||||
go118magic = 0xfffffff0
|
|
||||||
go120magic = 0xfffffff1
|
|
||||||
)
|
|
||||||
|
|
||||||
// uintptr returns the pointer-sized value encoded at b.
|
// uintptr returns the pointer-sized value encoded at b.
|
||||||
// The pointer size is dictated by the table being read.
|
// The pointer size is dictated by the table being read.
|
||||||
func (t *LineTable) uintptr(b []byte) uint64 {
|
func (t *LineTable) uintptr(b []byte) uint64 {
|
||||||
|
|
@ -220,24 +214,29 @@ func (t *LineTable) parsePclnTab() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var possibleVersion version
|
var possibleVersion version
|
||||||
leMagic := binary.LittleEndian.Uint32(t.Data)
|
|
||||||
beMagic := binary.BigEndian.Uint32(t.Data)
|
// The magic numbers are chosen such that reading the value with
|
||||||
|
// a different endianness does not result in the same value.
|
||||||
|
// That lets us the magic number to determine the endianness.
|
||||||
|
leMagic := abi.PCLnTabMagic(binary.LittleEndian.Uint32(t.Data))
|
||||||
|
beMagic := abi.PCLnTabMagic(binary.BigEndian.Uint32(t.Data))
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case leMagic == go12magic:
|
case leMagic == abi.Go12PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.LittleEndian, ver12
|
t.binary, possibleVersion = binary.LittleEndian, ver12
|
||||||
case beMagic == go12magic:
|
case beMagic == abi.Go12PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.BigEndian, ver12
|
t.binary, possibleVersion = binary.BigEndian, ver12
|
||||||
case leMagic == go116magic:
|
case leMagic == abi.Go116PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.LittleEndian, ver116
|
t.binary, possibleVersion = binary.LittleEndian, ver116
|
||||||
case beMagic == go116magic:
|
case beMagic == abi.Go116PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.BigEndian, ver116
|
t.binary, possibleVersion = binary.BigEndian, ver116
|
||||||
case leMagic == go118magic:
|
case leMagic == abi.Go118PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.LittleEndian, ver118
|
t.binary, possibleVersion = binary.LittleEndian, ver118
|
||||||
case beMagic == go118magic:
|
case beMagic == abi.Go118PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.BigEndian, ver118
|
t.binary, possibleVersion = binary.BigEndian, ver118
|
||||||
case leMagic == go120magic:
|
case leMagic == abi.Go120PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.LittleEndian, ver120
|
t.binary, possibleVersion = binary.LittleEndian, ver120
|
||||||
case beMagic == go120magic:
|
case beMagic == abi.Go120PCLnTabMagic:
|
||||||
t.binary, possibleVersion = binary.BigEndian, ver120
|
t.binary, possibleVersion = binary.BigEndian, ver120
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,36 @@
|
||||||
|
|
||||||
package abi
|
package abi
|
||||||
|
|
||||||
|
// PCLnTabMagic is the version at the start of the PC/line table.
|
||||||
|
// This is the start of the .pclntab section, and is also runtime.pcHeader.
|
||||||
|
// The magic numbers are chosen such that reading the value with
|
||||||
|
// a different endianness does not result in the same value.
|
||||||
|
// That lets us the magic number to determine the endianness.
|
||||||
|
type PCLnTabMagic uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Initial PCLnTabMagic value used in Go 1.2 through Go 1.15.
|
||||||
|
Go12PCLnTabMagic PCLnTabMagic = 0xfffffffb
|
||||||
|
// PCLnTabMagic value used in Go 1.16 through Go 1.17.
|
||||||
|
// Several fields added to header (CL 241598).
|
||||||
|
Go116PCLnTabMagic PCLnTabMagic = 0xfffffffa
|
||||||
|
// PCLnTabMagic value used in Go 1.18 through Go 1.19.
|
||||||
|
// Entry PC of func data changed from address to offset (CL 351463).
|
||||||
|
Go118PCLnTabMagic PCLnTabMagic = 0xfffffff0
|
||||||
|
// PCLnTabMagic value used in Go 1.20 and later.
|
||||||
|
// A ":" was added to generated symbol names (#37762).
|
||||||
|
Go120PCLnTabMagic PCLnTabMagic = 0xfffffff1
|
||||||
|
|
||||||
|
// CurrentPCLnTabMagic is the value emitted by the current toolchain.
|
||||||
|
// This is written by the linker to the pcHeader and read by the
|
||||||
|
// runtime and debug/gosym (and external tools like Delve).
|
||||||
|
//
|
||||||
|
// Change this value when updating the pclntab version.
|
||||||
|
// Changing this exported value is OK because is an
|
||||||
|
// internal package.
|
||||||
|
CurrentPCLnTabMagic = Go120PCLnTabMagic
|
||||||
|
)
|
||||||
|
|
||||||
// A FuncFlag records bits about a function, passed to the runtime.
|
// A FuncFlag records bits about a function, passed to the runtime.
|
||||||
type FuncFlag uint8
|
type FuncFlag uint8
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -374,7 +374,7 @@ func (f *_func) funcInfo() funcInfo {
|
||||||
|
|
||||||
// pcHeader holds data used by the pclntab lookups.
|
// pcHeader holds data used by the pclntab lookups.
|
||||||
type pcHeader struct {
|
type pcHeader struct {
|
||||||
magic uint32 // 0xFFFFFFF1
|
magic abi.PCLnTabMagic // abi.Go1NNPcLnTabMagic
|
||||||
pad1, pad2 uint8 // 0,0
|
pad1, pad2 uint8 // 0,0
|
||||||
minLC uint8 // min instruction size
|
minLC uint8 // min instruction size
|
||||||
ptrSize uint8 // size of a ptr in bytes
|
ptrSize uint8 // size of a ptr in bytes
|
||||||
|
|
@ -623,7 +623,7 @@ const debugPcln = false
|
||||||
func moduledataverify1(datap *moduledata) {
|
func moduledataverify1(datap *moduledata) {
|
||||||
// Check that the pclntab's format is valid.
|
// Check that the pclntab's format is valid.
|
||||||
hdr := datap.pcHeader
|
hdr := datap.pcHeader
|
||||||
if hdr.magic != 0xfffffff1 || hdr.pad1 != 0 || hdr.pad2 != 0 ||
|
if hdr.magic != abi.CurrentPCLnTabMagic || hdr.pad1 != 0 || hdr.pad2 != 0 ||
|
||||||
hdr.minLC != sys.PCQuantum || hdr.ptrSize != goarch.PtrSize {
|
hdr.minLC != sys.PCQuantum || hdr.ptrSize != goarch.PtrSize {
|
||||||
println("runtime: pcHeader: magic=", hex(hdr.magic), "pad1=", hdr.pad1, "pad2=", hdr.pad2,
|
println("runtime: pcHeader: magic=", hex(hdr.magic), "pad1=", hdr.pad1, "pad2=", hdr.pad2,
|
||||||
"minLC=", hdr.minLC, "ptrSize=", hdr.ptrSize, "pluginpath=", datap.pluginpath)
|
"minLC=", hdr.minLC, "ptrSize=", hdr.ptrSize, "pluginpath=", datap.pluginpath)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue