Home | History | Annotate | Download | only in go
      1 #!/bin/bash
      2 set -e -o pipefail
      3 
      4 # This script wraps the go cross compilers.
      5 #
      6 # It ensures that Go binaries are linked with an external linker
      7 # by default (cross gcc). Appropriate flags are added to build a
      8 # position independent executable (PIE) for ASLR.
      9 # "export GOPIE=0" to temporarily disable this behavior.
     10 
     11 function pie_enabled()
     12 	{
     13 	[[ "${GOPIE}" != "0" ]]
     14 	}
     15 
     16 function has_ldflags()
     17 	{
     18 	# Check if any linker flags are present in argv.
     19 	for arg in "$@"
     20 	do
     21 		case "${arg}" in
     22 			-ldflags | -ldflags=*) return 0 ;;
     23 			-linkmode | -linkmode=*) return 0 ;;
     24 			-buildmode | -buildmode=*) return 0 ;;
     25 			-installsuffix | -installsuffix=*) return 0 ;;
     26 			-extld | -extld=*) return 0 ;;
     27 			-extldflags | -extldflags=*) return 0 ;;
     28 		esac
     29 	done
     30 	return 1
     31 	}
     32 
     33 pie_flags=()
     34 if pie_enabled && ! has_ldflags "$@"
     35 then
     36 	case "$1" in
     37 		build | install | run | test)
     38 			# Add "-buildmode=pie" to "go build|install|run|test" commands.
     39 			pie_flags=(
     40 				"$1"
     41 				"-buildmode=pie"
     42 			)
     43 			shift
     44 			;;
     45 		tool)
     46 			case "$2" in
     47 				asm)
     48 					# Handle direct assembler invocations ("go tool asm <args>").
     49 					pie_flags=(
     50 						"$1"
     51 						"$2"
     52 						"-shared"
     53 					)
     54 					shift 2
     55 					;;
     56 				compile)
     57 					# Handle direct compiler invocations ("go tool compile <args>").
     58 					pie_flags=(
     59 						"$1"
     60 						"$2"
     61 						"-shared"
     62 						"-installsuffix=shared"
     63 					)
     64 					shift 2
     65 					;;
     66 				link)
     67 					# Handle direct linker invocations ("go tool link <args>").
     68 					pie_flags=(
     69 						"$1"
     70 						"$2"
     71 						"-installsuffix=shared"
     72 						"-buildmode=pie"
     73 						"-extld"
     74 						"${CC}"
     75 					)
     76 					shift 2
     77 					;;
     78 			esac
     79 			;;
     80 	esac
     81 fi
     82 
     83 exec go "${pie_flags[@]}" "$@"
     84