cmd/gomobile: use LLVM binutils if GNU binutils are missing

Starting from NDK 23, GNU binutils are fully migrated to LLVM binutils.
Use LLVM if GNU binutils are missing.

Fixes golang/go#49808

Change-Id: Iccb40780390a66081fc811d717c7357194b92acf
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/369195
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Hajime Hoshi <hajimehoshi@gmail.com>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index 69bb710..a7f5485 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -3,6 +3,7 @@
 import (
 	"errors"
 	"fmt"
+	"io/fs"
 	"io/ioutil"
 	"os"
 	"os/exec"
@@ -427,14 +428,23 @@
 }
 
 func (tc *ndkToolchain) Path(ndkRoot, toolName string) string {
-	var pref string
+	cmdFromPref := func(pref string) string {
+		return filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin", pref+"-"+toolName)
+	}
+
+	var cmd string
 	switch toolName {
 	case "clang", "clang++":
-		pref = tc.ClangPrefix()
+		cmd = cmdFromPref(tc.ClangPrefix())
 	default:
-		pref = tc.toolPrefix
+		cmd = cmdFromPref(tc.toolPrefix)
+		// Starting from NDK 23, GNU binutils are fully migrated to LLVM binutils.
+		// See https://android.googlesource.com/platform/ndk/+/master/docs/Roadmap.md#ndk-r23
+		if _, err := os.Stat(cmd); errors.Is(err, fs.ErrNotExist) {
+			cmd = cmdFromPref("llvm")
+		}
 	}
-	return filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin", pref+"-"+toolName)
+	return cmd
 }
 
 type ndkConfig map[string]ndkToolchain // map: GOOS->androidConfig.