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