forked from pkujhd/goloader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinlinetree.go
45 lines (40 loc) · 1.52 KB
/
inlinetree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package goloader
import (
"unsafe"
"github.com/pkujhd/goloader/obj"
"github.com/pkujhd/goloader/objabi/dataindex"
)
func (linker *Linker) addInlineTree(_func *_func, symbol *obj.ObjSymbol) (err error) {
funcname := symbol.Name
Func := symbol.Func
sym := linker.symMap[funcname]
if Func != nil && len(Func.InlTree) != 0 {
for _func.npcdata <= dataindex.PCDATA_InlTreeIndex {
sym.Func.PCData = append(sym.Func.PCData, uint32(0))
_func.npcdata++
}
sym.Func.PCData[dataindex.PCDATA_InlTreeIndex] = uint32(len(linker.pclntable))
linker.pclntable = append(linker.pclntable, symbol.Func.PCInline...)
for _, inl := range symbol.Func.InlTree {
if _, ok := linker.namemap[inl.Func]; !ok {
linker.namemap[inl.Func] = len(linker.pclntable)
linker.pclntable = append(linker.pclntable, []byte(inl.Func)...)
linker.pclntable = append(linker.pclntable, ZeroByte)
}
}
bytes := make([]byte, len(Func.InlTree)*obj.InlinedCallSize)
for k, inl := range Func.InlTree {
inlinedcall := obj.InitInlinedCall(inl, getfuncID(_func), linker.namemap, linker.filetab)
copy2Slice(bytes[k*obj.InlinedCallSize:], uintptr(unsafe.Pointer(&inlinedcall)), obj.InlinedCallSize)
}
offset := len(linker.noptrdata)
linker.noptrdata = append(linker.noptrdata, bytes...)
bytearrayAlign(&linker.noptrdata, PtrSize)
for _func.nfuncdata <= dataindex.FUNCDATA_InlTree {
sym.Func.FuncData = append(sym.Func.FuncData, uintptr(0))
_func.nfuncdata++
}
sym.Func.FuncData[dataindex.FUNCDATA_InlTree] = (uintptr)(offset)
}
return err
}