| 
							
								 | 
							
							# 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'
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							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.
 | 
						
						
						
						
							 | 
							
								 | 
							
							! 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
 | 
						
						
						
						
							 | 
							
								 | 
							
							! garble reverse .
 | 
						
						
						
						
							 | 
							
								 | 
							
							! stderr .
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							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 --
 |