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  }