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