env GOPRIVATE=test/main env SEED1=OQg9kACEECQ env SEED2=NruiDmVz6/s # Check the binary with a given base64 encoded seed garble -seed=${SEED1} build exec ./main$exe cmp stderr main.stderr binsubstr main$exe 'teststring' 'imported var value' ! binsubstr main$exe 'ImportedVar' [short] stop # the extra checks are relatively expensive exec ./main$exe funcName cp stderr funcName-seed-static-1 # Also check that the binary is reproducible. # No packages should be rebuilt either, thanks to the build cache. cp main$exe main_old$exe rm main$exe garble -seed=${SEED1}= build -v ! stderr . bincmp main$exe main_old$exe exec ./main$exe funcName cmp stderr funcName-seed-static-1 # Also check that a different seed leads to a different binary. # We can't know if caching happens here, because of previous test runs. cp main$exe main_old$exe rm main$exe garble -seed=${SEED2} build ! bincmp main$exe main_old$exe exec ./main$exe funcName cp stderr funcName-seed-static-2 ! bincmp funcName-seed-static-2 funcName-seed-static-1 # Use a random seed, which should always trigger a full build. garble -seed=random build -v stderr -count=1 '^runtime$' stderr -count=1 '^test/main$' exec ./main$exe cmp stderr main.stderr binsubstr main$exe 'teststring' 'imported var value' ! binsubstr main$exe 'ImportedVar' exec ./main$exe funcName cp stderr funcName-seed-random-1 ! bincmp funcName-seed-random-1 funcName-seed-static-1 # Also check that the random binary is not reproducible. cp main$exe main_old$exe rm main$exe garble -seed=random build -v stderr . ! bincmp main$exe main_old$exe exec ./main$exe funcName cp stderr funcName-seed-random-2 ! bincmp funcName-seed-random-2 funcName-seed-random-1 # Using different flags which affect the build, such as -literals or -tiny, # should result in different obfuscation of names etc. # There's strictly no reason to have this rule, # but the flags result in different builds and binaries anyway, # so we might as well make them as different as possible. garble -seed=${SEED1} -literals build exec ./main$exe funcName ! bincmp stderr funcName-seed-static-1 garble -seed=${SEED1} -tiny build exec ./main$exe funcName ! bincmp stderr funcName-seed-static-1 -- go.mod -- module test/main go 1.16 -- main.go -- package main import ( "os" "runtime" "test/main/imported" ) var teststringVar = "teststring" func main() { if len(os.Args) > 1 && os.Args[1] == "funcName" { println(originalFuncName()) } else { println(teststringVar) println(imported.ImportedVar) } } func originalFuncName() string { pc, _, _, _ := runtime.Caller(0) fn := runtime.FuncForPC(pc) return fn.Name() } -- imported/imported.go -- package imported var ImportedVar = "imported var value" -- main.stderr -- teststring imported var value