github.com/pkujhd/goloader@v0.0.0-20240411034752-1a28096bd7bd/module.1.20.go (about) 1 //go:build go1.20 && !go1.21 2 // +build go1.20,!go1.21 3 4 package goloader 5 6 import ( 7 "unsafe" 8 ) 9 10 const magic uint32 = 0xFFFFFFF1 11 12 // pcHeader holds data used by the pclntab lookups. 13 type pcHeader struct { 14 magic uint32 // 0xFFFFFFF1 15 pad1, pad2 uint8 // 0,0 16 minLC uint8 // min instruction size 17 ptrSize uint8 // size of a ptr in bytes 18 nfunc int // number of functions in the module 19 nfiles uint // number of entries in the file tab 20 textStart uintptr // base for function entry PC offsets in this module, equal to moduledata.text 21 funcnameOffset uintptr // offset to the funcnametab variable from pcHeader 22 cuOffset uintptr // offset to the cutab variable from pcHeader 23 filetabOffset uintptr // offset to the filetab variable from pcHeader 24 pctabOffset uintptr // offset to the pctab variable from pcHeader 25 pclnOffset uintptr // offset to the pclntab variable from pcHeader 26 } 27 28 // moduledata records information about the layout of the executable 29 // image. It is written by the linker. Any changes here must be 30 // matched changes to the code in cmd/link/internal/ld/symtab.go:symtab. 31 // moduledata is stored in statically allocated non-pointer memory; 32 // none of the pointers here are visible to the garbage collector. 33 type moduledata struct { 34 pcHeader *pcHeader 35 funcnametab []byte 36 cutab []uint32 37 filetab []byte 38 pctab []byte 39 pclntable []byte 40 ftab []functab 41 findfunctab uintptr 42 minpc, maxpc uintptr 43 44 text, etext uintptr 45 noptrdata, enoptrdata uintptr 46 data, edata uintptr 47 bss, ebss uintptr 48 noptrbss, enoptrbss uintptr 49 covctrs, ecovctrs uintptr 50 end, gcdata, gcbss uintptr 51 types, etypes uintptr 52 rodata uintptr 53 gofunc uintptr // go.func.* 54 55 textsectmap []textsect 56 typelinks []int32 // offsets from types 57 itablinks []*itab 58 59 ptab []ptabEntry 60 61 pluginpath string 62 pkghashes []modulehash 63 64 modulename string 65 modulehashes []modulehash 66 67 hasmain uint8 // 1 if module contains the main function, 0 otherwise 68 69 gcdatamask, gcbssmask bitvector 70 71 typemap map[typeOff]uintptr // offset to *_rtype in previous module 72 73 bad bool // module failed to load and should be ignored 74 75 next *moduledata 76 } 77 78 func initmodule(module *moduledata, linker *Linker) { 79 module.pcHeader = (*pcHeader)(unsafe.Pointer(&(module.pclntable[0]))) 80 module.pcHeader.textStart = module.text 81 module.pcHeader.nfunc = len(module.ftab) 82 module.pcHeader.nfiles = (uint)(len(module.filetab)) 83 module.funcnametab = module.pclntable 84 module.pctab = module.pclntable 85 module.cutab = linker.Filetab 86 module.filetab = module.pclntable 87 module.hasmain = 0 88 module.bad = false 89 module.gofunc = module.noptrdata 90 module.rodata = module.noptrdata 91 }