github.com/pkujhd/goloader@v0.0.0-20240411034752-1a28096bd7bd/module.1.21.go (about) 1 //go:build go1.21 && !go1.23 2 // +build go1.21,!go1.23 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 // This slice records the initializing tasks that need to be 65 // done to start up the program. It is built by the linker. 66 inittasks []*initTask 67 68 modulename string 69 modulehashes []modulehash 70 71 hasmain uint8 // 1 if module contains the main function, 0 otherwise 72 73 gcdatamask, gcbssmask bitvector 74 75 typemap map[typeOff]uintptr // offset to *_rtype in previous module 76 77 bad bool // module failed to load and should be ignored 78 79 next *moduledata 80 } 81 82 func initmodule(module *moduledata, linker *Linker) { 83 module.pcHeader = (*pcHeader)(unsafe.Pointer(&(module.pclntable[0]))) 84 module.pcHeader.textStart = module.text 85 module.pcHeader.nfunc = len(module.ftab) 86 module.pcHeader.nfiles = (uint)(len(module.filetab)) 87 module.funcnametab = module.pclntable 88 module.pctab = module.pclntable 89 module.cutab = linker.Filetab 90 module.filetab = module.pclntable 91 module.hasmain = 0 92 module.bad = false 93 module.gofunc = module.noptrdata 94 module.rodata = module.noptrdata 95 }