|
|
# Note that it doesn't really matter if the assembly below is badly written.
|
|
|
# We just care enough to see that it obfuscates and keeps the same behavior.
|
|
|
# TODO: support arm64, at least
|
|
|
[!amd64] skip 'the assembly is only written for amd64'
|
|
|
|
|
|
exec garble build
|
|
|
exec ./main
|
|
|
cmp stderr main.stderr
|
|
|
! binsubstr main$exe 'test/main' 'addJmp' 'AddImpl' 'garble_'
|
|
|
|
|
|
# We used to panic on broken packages with assembly.
|
|
|
! exec garble build ./broken/...
|
|
|
stderr -count=1 'broken[/\\]asm[/\\].*MissingType'
|
|
|
stderr -count=1 'broken[/\\]syntax[/\\].*unexpected newline'
|
|
|
|
|
|
[short] stop # no need to verify this with -short
|
|
|
|
|
|
# Ensure that reversing doesn't error with assembly files.
|
|
|
# It should fail, as there is nothing to reverse, but without any parse error.
|
|
|
stdin empty-reverse.txt
|
|
|
! exec garble reverse .
|
|
|
! stderr .
|
|
|
|
|
|
exec garble -tiny build
|
|
|
exec ./main
|
|
|
cmp stderr main.stderr
|
|
|
! binsubstr main$exe 'addJmp' 'AddImpl'
|
|
|
|
|
|
go build
|
|
|
exec ./main
|
|
|
cmp stderr main.stderr
|
|
|
binsubstr main$exe 'addJmp' 'AddImpl'
|
|
|
-- go.mod --
|
|
|
module test/with.many.dots/main
|
|
|
|
|
|
go 1.23
|
|
|
-- main.go --
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
"test/with.many.dots/main/imported"
|
|
|
)
|
|
|
|
|
|
func addJmpPkgPath(x, y int32) int32
|
|
|
func addJmpPkgName(x, y int32) int32
|
|
|
|
|
|
// goData is used from both assembly and header files.
|
|
|
var goData = [4]uint64{1, 2, 3, 4}
|
|
|
|
|
|
func modifyGoData()
|
|
|
func modifyGoData2()
|
|
|
|
|
|
func main() {
|
|
|
println(addJmpPkgPath(1, 2))
|
|
|
println(addJmpPkgName(1, 2))
|
|
|
|
|
|
println(goData[0], goData[1])
|
|
|
modifyGoData()
|
|
|
println(goData[0], goData[1])
|
|
|
modifyGoData2()
|
|
|
println(goData[0], goData[1])
|
|
|
|
|
|
println(imported.AddImpl(3, 4))
|
|
|
}
|
|
|
-- garble_main_amd64.s --
|
|
|
#include "garble_define_amd64.h"
|
|
|
|
|
|
#include "extra/garble_define2_amd64.h" // Inline: many·special∕asm·runes.
|
|
|
|
|
|
// A comment may include many·special∕asm·runes and it's okay.
|
|
|
//No space: many·special∕asm·runes.
|
|
|
// Indented: many·special∕asm·runes.
|
|
|
DATA bar+0(SB)/8, $0 // Inline: many·special∕asm·runes.
|
|
|
|
|
|
// Reference an imported package by its package path.
|
|
|
TEXT ·addJmpPkgPath(SB),$0-16
|
|
|
JMP test∕with·many·dots∕main∕imported·AddImpl(SB)
|
|
|
|
|
|
// Reference the current package by its package name.
|
|
|
TEXT ·addJmpPkgName(SB),$0-16
|
|
|
JMP main·addJmpPkgPath(SB)
|
|
|
|
|
|
TEXT ·modifyGoData(SB),$0-16
|
|
|
addGoDataTo($12)
|
|
|
ADDL $34, ·goData+8(SB)
|
|
|
RET
|
|
|
|
|
|
TEXT ·modifyGoData2(SB),$0-16
|
|
|
addGoDataTo2($12)
|
|
|
ADDL $34,·goData+8(SB) // note the lack of a space
|
|
|
RET
|
|
|
|
|
|
-- garble_define_amd64.h --
|
|
|
#define addGoDataTo(arg) \
|
|
|
ADDL arg, ·goData+0(SB)
|
|
|
|
|
|
-- extra/garble_define2_amd64.h --
|
|
|
#define addGoDataTo2(arg) \
|
|
|
ADDL arg, ·goData+0(SB)
|
|
|
|
|
|
-- imported/imported.go --
|
|
|
package imported
|
|
|
|
|
|
func AddImpl(x, y int32) int32
|
|
|
|
|
|
// Reference the current package by its package path.
|
|
|
func addJmpPkgPath(x, y int32) int32
|
|
|
|
|
|
// Reference the current package by its package path.
|
|
|
func addJmpPkgName(x, y int32) int32
|
|
|
|
|
|
-- imported/imported_amd64.s --
|
|
|
TEXT ·AddImpl(SB),$0-16
|
|
|
MOVL x+0(FP), BX
|
|
|
MOVL y+4(FP), BP
|
|
|
ADDL BP, BX
|
|
|
MOVL BX, ret+8(FP)
|
|
|
RET
|
|
|
|
|
|
TEXT ·addJmpPkgPath(SB),$0-16
|
|
|
JMP test∕with·many·dots∕main∕imported·AddImpl(SB)
|
|
|
|
|
|
TEXT ·addJmpPkgName(SB),$0-16
|
|
|
JMP imported·AddImpl(SB)
|
|
|
-- broken/syntax/broken.go --
|
|
|
package broken
|
|
|
|
|
|
func AddImpl
|
|
|
|
|
|
-- broken/asm/imported_amd64.s --
|
|
|
TEXT ·AddImpl(SB),$0-16
|
|
|
MOVL x+0(FP), BX
|
|
|
MOVL y+4(FP), BP
|
|
|
ADDL BP, BX
|
|
|
MOVL BX, ret+8(FP)
|
|
|
RET
|
|
|
-- broken/asm/broken.go --
|
|
|
package broken
|
|
|
|
|
|
func AddImpl(x, y int32) MissingType
|
|
|
|
|
|
-- broken/imported_amd64.s --
|
|
|
TEXT ·AddImpl(SB),$0-16
|
|
|
MOVL x+0(FP), BX
|
|
|
MOVL y+4(FP), BP
|
|
|
ADDL BP, BX
|
|
|
MOVL BX, ret+8(FP)
|
|
|
RET
|
|
|
-- main.stderr --
|
|
|
3
|
|
|
3
|
|
|
1 2
|
|
|
13 36
|
|
|
25 70
|
|
|
7
|
|
|
-- empty-reverse.txt --
|