xref: /aosp_15_r20/external/toolchain-utils/go/go_target (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
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