If `find_a_program` cannot find `as/ld` and we are a cross toolchain, the final fallback is `as/ld` of system. In fact, we can have a try with <triple>-as/ld before fallback to native as/ld.
This patch is derivatived from Debian's patch: gcc-search-prefixed-as-ld.diff gcc * gcc.cc(execute): Looks for <triple>-as/ld before fallback to native as/ld. --- gcc/gcc.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/gcc/gcc.cc b/gcc/gcc.cc index 830a4700a87..8a1bdb5e3e2 100644 --- a/gcc/gcc.cc +++ b/gcc/gcc.cc @@ -3293,6 +3293,27 @@ execute (void) string = find_a_program(commands[0].prog); if (string) commands[0].argv[0] = string; + else if (*cross_compile != '0' + && (!strcmp (commands[0].argv[0], "as") + || !strcmp (commands[0].argv[0], "ld"))) + { + string = XNEWVEC (char, strlen (commands[0].argv[0]) + 2 + + strlen (DEFAULT_REAL_TARGET_MACHINE)); + strcpy (string, DEFAULT_REAL_TARGET_MACHINE); + strcat (string, "-"); + strcat (string, commands[0].argv[0]); + const char *string_args[] = {string, "--version", NULL}; + int exit_status = 0; + int err = 0; + const char *errmsg = pex_one (PEX_SEARCH, string, + CONST_CAST (char **, string_args), string, + NULL, NULL, &exit_status, &err); + if (errmsg == NULL && exit_status == 0 && err == 0) + { + commands[0].argv[0] = string; + commands[0].prog = string; + } + } } for (n_commands = 1, i = 0; argbuf.iterate (i, &arg); i++) -- 2.39.2