# 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.20 -- 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" // 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 --