#!/bin/bash set -e -o pipefail # This script wraps the go cross compilers. # # It ensures that Go binaries are linked with an external linker # by default (cross gcc). Appropriate flags are added to build a # position independent executable (PIE) for ASLR. # "export GOPIE=0" to temporarily disable this behavior. function pie_enabled() { [[ "${GOPIE}" != "0" ]] } function has_ldflags() { # Check if any linker flags are present in argv. for arg in "$@" do case "${arg}" in -ldflags | -ldflags=*) return 0 ;; -linkmode | -linkmode=*) return 0 ;; -buildmode | -buildmode=*) return 0 ;; -installsuffix | -installsuffix=*) return 0 ;; -extld | -extld=*) return 0 ;; -extldflags | -extldflags=*) return 0 ;; esac done return 1 } pie_flags=() if pie_enabled && ! has_ldflags "$@" then case "$1" in build | install | run | test) # Add "-buildmode=pie" to "go build|install|run|test" commands. pie_flags=( "$1" "-buildmode=pie" ) shift ;; tool) case "$2" in asm) # Handle direct assembler invocations ("go tool asm <args>"). pie_flags=( "$1" "$2" "-shared" ) shift 2 ;; compile) # Handle direct compiler invocations ("go tool compile <args>"). pie_flags=( "$1" "$2" "-shared" "-installsuffix=shared" ) shift 2 ;; link) # Handle direct linker invocations ("go tool link <args>"). pie_flags=( "$1" "$2" "-installsuffix=shared" "-buildmode=pie" "-extld" "${CC}" ) shift 2 ;; esac ;; esac fi exec go "${pie_flags[@]}" "$@"