Richard Sandiford <richard.sandif...@arm.com> 于2024年5月29日周三 05:28写道:
>
> YunQiang Su <s...@gcc.gnu.org> writes:
> > If `find_a_program` cannot find `as/ld/objcopy` 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/objcopy before fallback to native as/ld/objcopy.
> >
> > This patch is derivatived from Debian's patch:
> >   gcc-search-prefixed-as-ld.diff
>
> I'm probably making you repeat a previous discussion, sorry, but could
> you describe the use case in more detail?  The current approach to
> handling cross toolchains has been used for many years.  Presumably
> this patch is supporting a different way of organising things,
> but I wasn't sure from the description what it was.
>
> AIUI, we currently assume that cross as, ld and objcopy will be
> installed under those names in $prefix/$target_alias/bin (aka $tooldir/bin).
> E.g.:
>
>    bin/aarch64-elf-as = aarch64-elf/bin/as
>
> GCC should then find as in aarch64-elf/bin.
>
> Is that not true in your case?
>

Yes. This patch is only about the final fallback. I mean aarch64-elf/bin/as
still has higher priority than bin/aarch64-elf-as.

In the current code, we find gas with:
    /prefix/aarch64-elf/bin/as > $PATH/as

And this patch a new one between them:
    /prefix/aarch64-elf/bin/as > $PATH/aarch64-elf-as > $PATH/as

> To be clear, I'm not saying the patch is wrong.  I'm just trying to
> understand why the patch is needed.
>

Yes. If gcc is configured correctly, it is not so useful.
In some case for some lazy user, it may be useful,
for example, the binutils installed into different prefix with libc etc.

For example, binutils is installed into /usr/aarch64-elf/bin, while
libc is installed into /usr/local/aarch64-elf/.

> Thanks,
> Richard
>
> >
> > gcc
> >       * gcc.cc(execute): Looks for <triple>-as/ld/objcopy before fallback
> >       to native as/ld/objcopy.
> > ---
> >  gcc/gcc.cc | 20 ++++++++++++++++++++
> >  1 file changed, 20 insertions(+)
> >
> > diff --git a/gcc/gcc.cc b/gcc/gcc.cc
> > index 830a4700a87..3dc6348d761 100644
> > --- a/gcc/gcc.cc
> > +++ b/gcc/gcc.cc
> > @@ -3293,6 +3293,26 @@ 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], commands[0].prog)
> > +             && (!strcmp (commands[0].prog, "as")
> > +                 || !strcmp (commands[0].prog, "ld")
> > +                 || !strcmp (commands[0].prog, "objcopy")))
> > +     {
> > +       string = concat (DEFAULT_REAL_TARGET_MACHINE, "-",
> > +                             commands[0].prog, NULL);
> > +       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++)

Reply via email to