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

Reply via email to