#!/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[@]}" "$@"
|