// generator to fill in its data later.
func (state *pclntab) generatePCHeader(ctxt *Link) {
ldr := ctxt.loader
- textStartOff := int64(8 + 2*ctxt.Arch.PtrSize)
size := int64(8 + 8*ctxt.Arch.PtrSize)
writeHeader := func(ctxt *Link, s loader.Sym) {
header := ctxt.loader.MakeSymbolUpdater(s)
header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize))
off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc))
off = header.SetUint(ctxt.Arch, off, uint64(state.nfiles))
- if off != textStartOff {
- panic(fmt.Sprintf("pcHeader textStartOff: %d != %d", off, textStartOff))
- }
- off += int64(ctxt.Arch.PtrSize) // skip runtimeText relocation
+ off = header.SetUintptr(ctxt.Arch, off, 0) // unused
off = writeSymOffset(off, state.funcnametab)
off = writeSymOffset(off, state.cutab)
off = writeSymOffset(off, state.filetab)
}
state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader)
- // Create the runtimeText relocation.
- sb := ldr.MakeSymbolUpdater(state.pcheader)
- sb.SetAddr(ctxt.Arch, textStartOff, ldr.Lookup("runtime.text", 0))
}
// walkFuncs iterates over the funcs, calling a function for each unique
// pcHeader holds data used by the pclntab lookups.
type pcHeader struct {
- magic uint32 // 0xFFFFFFF1
- pad1, pad2 uint8 // 0,0
- minLC uint8 // min instruction size
- ptrSize uint8 // size of a ptr in bytes
- nfunc int // number of functions in the module
- nfiles uint // number of entries in the file tab
- textStart uintptr // base for function entry PC offsets in this module, equal to moduledata.text
+ magic uint32 // 0xFFFFFFF1
+ pad1, pad2 uint8 // 0,0
+ minLC uint8 // min instruction size
+ ptrSize uint8 // size of a ptr in bytes
+ nfunc int // number of functions in the module
+ nfiles uint // number of entries in the file tab
+
+ // The next field used to be textStart. This is no longer stored
+ // as it requires a relocation. Code should use the moduledata text
+ // field instead. This unused field can be removed in coordination
+ // with Delve.
+ _ uintptr
+
funcnameOffset uintptr // offset to the funcnametab variable from pcHeader
cuOffset uintptr // offset to the cutab variable from pcHeader
filetabOffset uintptr // offset to the filetab variable from pcHeader
// Check that the pclntab's format is valid.
hdr := datap.pcHeader
if hdr.magic != 0xfffffff1 || hdr.pad1 != 0 || hdr.pad2 != 0 ||
- hdr.minLC != sys.PCQuantum || hdr.ptrSize != goarch.PtrSize || hdr.textStart != datap.text {
+ hdr.minLC != sys.PCQuantum || hdr.ptrSize != goarch.PtrSize {
println("runtime: pcHeader: magic=", hex(hdr.magic), "pad1=", hdr.pad1, "pad2=", hdr.pad2,
- "minLC=", hdr.minLC, "ptrSize=", hdr.ptrSize, "pcHeader.textStart=", hex(hdr.textStart),
- "text=", hex(datap.text), "pluginpath=", datap.pluginpath)
+ "minLC=", hdr.minLC, "ptrSize=", hdr.ptrSize, "pluginpath=", datap.pluginpath)
throw("invalid function symbol table")
}