github.com/pkujhd/goloader@v0.0.0-20240411034752-1a28096bd7bd/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  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  	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]uintptr // 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 = module.pclntable
    84  	module.pctab = module.pclntable
    85  	module.cutab = linker.Filetab
    86  	module.filetab = module.pclntable
    87  	module.hasmain = 0
    88  	module.bad = false
    89  	module.gofunc = module.noptrdata
    90  	module.rodata = module.noptrdata
    91  }