Skip to content

Commit 2769172

Browse files
committed
when set _func.deferreturn check isDirectCall
1 parent 06fedb9 commit 2769172

3 files changed

Lines changed: 13 additions & 3 deletions

File tree

link/deferreturn.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/pkujhd/goloader/constants"
1111
"github.com/pkujhd/goloader/objabi/dataindex"
12+
"github.com/pkujhd/goloader/objabi/reloctype"
1213
)
1314

1415
func (linker *Linker) addDeferReturn(_func *_func, module *moduledata) (err error) {
@@ -17,7 +18,7 @@ func (linker *Linker) addDeferReturn(_func *_func, module *moduledata) (err erro
1718
if Func != nil && len(Func.FuncData) > dataindex.FUNCDATA_OpenCodedDeferInfo {
1819
sym := linker.SymMap[funcName]
1920
for _, r := range sym.Reloc {
20-
if r.SymName == constants.RuntimeDeferReturn {
21+
if r.SymName == constants.RuntimeDeferReturn && reloctype.IsDirectCall(r.Type) {
2122
//../cmd/link/internal/ld/pcln.go:pclntab
2223
switch linker.Arch.Name {
2324
case sys.Arch386.Name, sys.ArchAMD64.Name:

link/relocate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ func (linker *Linker) relocate(codeModule *CodeModule, symbolMap, symPtr map[str
328328
reloctype.R_ARM64_PCREL_LDST8, reloctype.R_ARM64_PCREL_LDST16,
329329
reloctype.R_ARM64_PCREL_LDST32, reloctype.R_ARM64_PCREL_LDST64:
330330
if symkind.IsText(symbol.Kind) {
331-
err = fmt.Errorf("impossible!Sym:%s locate not in code segment!\n", loc.SymName)
331+
return fmt.Errorf("impossible!Sym:%s locate not in code segment!\n", loc.SymName)
332332
}
333333
err = linker.relocateADRP(relocByte[loc.Offset:], loc, segment, symAddr)
334334
case reloctype.R_ADDR, reloctype.R_WEAKADDR:
@@ -346,7 +346,7 @@ func (linker *Linker) relocate(codeModule *CodeModule, symbolMap, symPtr map[str
346346
if sym, ok := linker.SymMap[loc.SymName]; ok {
347347
offset = sym.Offset + loc.Add
348348
} else {
349-
err = fmt.Errorf("symName:%s relocateType:%s, offset:%d is overflow!\n", loc.SymName, reloctype.RelocTypeString(loc.Type), offset)
349+
return fmt.Errorf("symName:%s relocateType:%s, offset:%d is overflow!\n", loc.SymName, reloctype.RelocTypeString(loc.Type), offset)
350350
}
351351
}
352352
if symkind.IsROData(linker.SymMap[loc.SymName].Kind) || symkind.IsNoPtrData(linker.SymMap[loc.SymName].Kind) {

objabi/reloctype/reloctype.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package reloctype
2+
3+
func IsDirectCall(r int) bool {
4+
switch r {
5+
case R_CALL, R_CALLARM, R_CALLARM64:
6+
return true
7+
}
8+
return false
9+
}

0 commit comments

Comments
 (0)