blob: 8943d813c4e73023affd56c48a19209acf33c4e5 [file] [log] [blame]
#!/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 clang). 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" )
shift
[[ "${GOOS}" == "android" ]] || pie_flags+=( "-buildmode=pie" )
;;
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" )
shift 2
[[ "${GOOS}" == "android" ]] || pie_flags+=( "-installsuffix=shared" )
;;
link)
# Handle direct linker invocations ("go tool link <args>").
pie_flags=( "$1" "$2" "-extld" "${CC}" "-buildmode=pie" )
shift 2
[[ "${GOOS}" == "android" ]] || pie_flags+=( "-installsuffix=shared" )
;;
esac
;;
esac
fi
exec go "${pie_flags[@]}" "$@"