2023-02-25 12:12:40 +00:00
|
|
|
// go:build go1.18 && !go1.20
|
2023-11-27 13:15:03 +00:00
|
|
|
//go:build go1.18 && !go1.20
|
2023-02-25 12:12:40 +00:00
|
|
|
// +build go1.18,!go1.20
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2021 ByteDance Inc.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package loader
|
|
|
|
|
|
|
|
import (
|
2024-05-06 09:50:47 +01:00
|
|
|
`github.com/bytedance/sonic/loader/internal/rt`
|
2023-02-25 12:12:40 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
_Magic uint32 = 0xfffffff0
|
|
|
|
)
|
|
|
|
|
|
|
|
type moduledata struct {
|
|
|
|
pcHeader *pcHeader
|
|
|
|
funcnametab []byte
|
|
|
|
cutab []uint32
|
|
|
|
filetab []byte
|
|
|
|
pctab []byte
|
|
|
|
pclntable []byte
|
|
|
|
ftab []funcTab
|
|
|
|
findfunctab uintptr
|
|
|
|
minpc, maxpc uintptr // first func address, last func address + last func size
|
|
|
|
|
|
|
|
text, etext uintptr // start/end of text, (etext-text) must be greater than MIN_FUNC
|
|
|
|
noptrdata, enoptrdata uintptr
|
|
|
|
data, edata uintptr
|
|
|
|
bss, ebss uintptr
|
|
|
|
noptrbss, enoptrbss uintptr
|
|
|
|
end, gcdata, gcbss uintptr
|
|
|
|
types, etypes uintptr
|
|
|
|
rodata uintptr
|
|
|
|
gofunc uintptr // go.func.* is actual funcinfo object in image
|
|
|
|
|
|
|
|
textsectmap []textSection // see runtime/symtab.go: textAddr()
|
|
|
|
typelinks []int32 // offsets from types
|
|
|
|
itablinks []*rt.GoItab
|
|
|
|
|
|
|
|
ptab []ptabEntry
|
|
|
|
|
|
|
|
pluginpath string
|
|
|
|
pkghashes []modulehash
|
|
|
|
|
|
|
|
modulename string
|
|
|
|
modulehashes []modulehash
|
|
|
|
|
|
|
|
hasmain uint8 // 1 if module contains the main function, 0 otherwise
|
|
|
|
|
|
|
|
gcdatamask, gcbssmask bitVector
|
|
|
|
|
|
|
|
typemap map[int32]*rt.GoType // offset to *_rtype in previous module
|
|
|
|
|
|
|
|
bad bool // module failed to load and should be ignored
|
|
|
|
|
|
|
|
next *moduledata
|
|
|
|
}
|
|
|
|
|
|
|
|
type _func struct {
|
|
|
|
entryOff uint32 // start pc, as offset from moduledata.text/pcHeader.textStart
|
|
|
|
nameOff int32 // function name, as index into moduledata.funcnametab.
|
|
|
|
|
|
|
|
args int32 // in/out args size
|
|
|
|
deferreturn uint32 // offset of start of a deferreturn call instruction from entry, if any.
|
|
|
|
|
|
|
|
pcsp uint32
|
|
|
|
pcfile uint32
|
|
|
|
pcln uint32
|
|
|
|
npcdata uint32
|
|
|
|
cuOffset uint32 // runtime.cutab offset of this function's CU
|
|
|
|
funcID uint8 // set for certain special runtime functions
|
|
|
|
flag uint8
|
|
|
|
_ [1]byte // pad
|
|
|
|
nfuncdata uint8 //
|
|
|
|
|
|
|
|
// The end of the struct is followed immediately by two variable-length
|
|
|
|
// arrays that reference the pcdata and funcdata locations for this
|
|
|
|
// function.
|
|
|
|
|
|
|
|
// pcdata contains the offset into moduledata.pctab for the start of
|
|
|
|
// that index's table. e.g.,
|
|
|
|
// &moduledata.pctab[_func.pcdata[_PCDATA_UnsafePoint]] is the start of
|
|
|
|
// the unsafe point table.
|
|
|
|
//
|
|
|
|
// An offset of 0 indicates that there is no table.
|
|
|
|
//
|
|
|
|
// pcdata [npcdata]uint32
|
|
|
|
|
|
|
|
// funcdata contains the offset past moduledata.gofunc which contains a
|
|
|
|
// pointer to that index's funcdata. e.g.,
|
|
|
|
// *(moduledata.gofunc + _func.funcdata[_FUNCDATA_ArgsPointerMaps]) is
|
|
|
|
// the argument pointer map.
|
|
|
|
//
|
|
|
|
// An offset of ^uint32(0) indicates that there is no entry.
|
|
|
|
//
|
|
|
|
// funcdata [nfuncdata]uint32
|
|
|
|
}
|