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