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