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  }