github.com/eh-steve/goloader@v0.0.0-20240111193454-90ff3cfdae39/module.1.18.go (about) 1 //go:build go1.18 && !go1.20 2 // +build go1.18,!go1.20 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 // 0xFFFFFFF0 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 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]*_type // 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 = linker.funcnametab 84 module.pctab = linker.pctab 85 module.cutab = linker.cutab 86 module.filetab = linker.filetab 87 module.hasmain = 0 88 module.bad = false 89 module.gofunc = module.noptrdata 90 module.rodata = module.noptrdata 91 }