Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On Thu, Jan 14, 2021 at 12:21:05PM -0800, Fangrui Song wrote: > On 2021-01-14, Martin Liška wrote: > > On 1/14/21 11:07 AM, Richard Biener wrote: > > > I see no particular reason to allow arbitrary garbage to be used as > > > linker. It just asks for users to shoot themselves in the foot and > > > for strange bugreports to pop up. > > > > Well, for a strange bug report, we'll see eventually usage of the > > --ld-path= option. > > > > I see it handy when developing a ld feature to be able to point to a built > > ld > > (without need to build GCC with it). Yes, one can use --save-temps --verbose > > and invoke the built linker, but it's not handy. > > > > Martin > > > > I did this when I worked on some GNU ld features. > clang --ld-path=/path/to/binutils/out/debug/ld/ld-new > or debugging some Linux kernel issues related to ld. > > Having --ld-path= in GCC will be handy. If the linker is called ld and there isn't random unrelated stuff in the same directory, one can always just use -B path/to/ld/ Jakub
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On 2021-01-14, Martin Liška wrote: On 1/14/21 11:07 AM, Richard Biener wrote: I see no particular reason to allow arbitrary garbage to be used as linker. It just asks for users to shoot themselves in the foot and for strange bugreports to pop up. Well, for a strange bug report, we'll see eventually usage of the --ld-path= option. I see it handy when developing a ld feature to be able to point to a built ld (without need to build GCC with it). Yes, one can use --save-temps --verbose and invoke the built linker, but it's not handy. Martin I did this when I worked on some GNU ld features. clang --ld-path=/path/to/binutils/out/debug/ld/ld-new or debugging some Linux kernel issues related to ld. Having --ld-path= in GCC will be handy.
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On 1/14/21 11:07 AM, Richard Biener wrote: I see no particular reason to allow arbitrary garbage to be used as linker. It just asks for users to shoot themselves in the foot and for strange bugreports to pop up. Well, for a strange bug report, we'll see eventually usage of the --ld-path= option. I see it handy when developing a ld feature to be able to point to a built ld (without need to build GCC with it). Yes, one can use --save-temps --verbose and invoke the built linker, but it's not handy. Martin
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On Thu, 14 Jan 2021, Martin Liška wrote: > PING^3 I see no particular reason to allow arbitrary garbage to be used as linker. It just asks for users to shoot themselves in the foot and for strange bugreports to pop up. Richard. > On 1/6/21 3:22 PM, Martin Liška wrote: > > PING^2 > > > > On 12/4/20 2:45 PM, Martin Liška wrote: > >> PING > >> > >> May I please ping the patch, it's waiting here for a review > >> for quite some time. > >> > >> Thanks, > >> Martin > >> > >> On 7/23/20 12:17 PM, Martin Liška wrote: > >>> On 7/21/20 6:07 AM, Fangrui Song wrote: > If the value does not contain any path component separator (e.g. a > slash), the linker will be searched for using COMPILER_PATH followed by > PATH. Otherwise, it is either an absolute path or a path relative to the > current working directory. > > --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the > future, we want to make dfferent linker option decisions we can let > -fuse-ld= represent the linker flavor and --ld-path= the linker path. > >>> > >>> Hello. > >>> > >>> I have just few nits: > >>> > >>> === ERROR type #3: trailing operator (1 error(s)) === > >>> gcc/collect2.c:1155:14: ld_file_name = > >>> > > PR driver/93645 > * common.opt (--ld-path=): Add --ld-path= > * opts.c (common_handle_option): Handle OPT__ld_path_. > * gcc.c (driver_handle_option): Likewise. > * collect2.c (main): Likewise. > * doc/invoke.texi: Document --ld-path=. > > --- > Changes in v2: > * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). > The option does not affect code generation and is not a language > feature, > -f* is not suitable. Additionally, clang has other similar --*-path= > options, e.g. --cuda-path=. > --- > gcc/collect2.c | 63 +++-- > gcc/common.opt | 4 +++ > gcc/doc/invoke.texi | 9 +++ > gcc/gcc.c | 2 +- > gcc/opts.c | 1 + > 5 files changed, 64 insertions(+), 15 deletions(-) > > diff --git a/gcc/collect2.c b/gcc/collect2.c > index f8a5ce45994..caa1b96ab52 100644 > --- a/gcc/collect2.c > +++ b/gcc/collect2.c > @@ -844,6 +844,7 @@ main (int argc, char **argv) > const char **ld1; > bool use_plugin = false; > bool use_collect_ld = false; > + const char *ld_path = NULL; > /* The kinds of symbols we will have to consider when scanning the > outcome of a first pass link. This is ALL to start with, then > might > @@ -961,12 +962,21 @@ main (int argc, char **argv) > if (selected_linker == USE_DEFAULT_LD) > selected_linker = USE_PLUGIN_LD; > } > - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) > - selected_linker = USE_BFD_LD; > - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) > - selected_linker = USE_GOLD_LD; > - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) > - selected_linker = USE_LLD_LD; > + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 > + && selected_linker != USE_LD_MAX) > + { > + if (strcmp (argv[i] + 9, "bfd") == 0) > + selected_linker = USE_BFD_LD; > + else if (strcmp (argv[i] + 9, "gold") == 0) > + selected_linker = USE_GOLD_LD; > + else if (strcmp (argv[i] + 9, "lld") == 0) > + selected_linker = USE_LLD_LD; > + } > + else if (strncmp (argv[i], "--ld-path=", 10) == 0) > + { > + ld_path = argv[i] + 10; > + selected_linker = USE_LD_MAX; > + } > else if (strncmp (argv[i], "-o", 2) == 0) > { > /* Parse the output filename if it's given so that we can make > @@ -1117,14 +1127,34 @@ main (int argc, char **argv) > ld_file_name = find_a_file (, collect_ld_suffix, X_OK); > use_collect_ld = ld_file_name != 0; > } > - /* Search the compiler directories for `ld'. We have protection > against > - recursive calls in find_a_file. */ > - if (ld_file_name == 0) > - ld_file_name = find_a_file (, ld_suffixes[selected_linker], > X_OK); > - /* Search the ordinary system bin directories > - for `ld' (if native linking) or `TARGET-ld' (if cross). */ > - if (ld_file_name == 0) > - ld_file_name = find_a_file (, > full_ld_suffixes[selected_linker], X_OK); > + if (selected_linker == USE_LD_MAX) > + { > + /* If --ld-path= does not contain a path component separator, > search for > + the command using cpath, then using path. Otherwise find the > linker > + relative to the current working directory. */ >
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
PING^3 On 1/6/21 3:22 PM, Martin Liška wrote: PING^2 On 12/4/20 2:45 PM, Martin Liška wrote: PING May I please ping the patch, it's waiting here for a review for quite some time. Thanks, Martin On 7/23/20 12:17 PM, Martin Liška wrote: On 7/21/20 6:07 AM, Fangrui Song wrote: If the value does not contain any path component separator (e.g. a slash), the linker will be searched for using COMPILER_PATH followed by PATH. Otherwise, it is either an absolute path or a path relative to the current working directory. --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the future, we want to make dfferent linker option decisions we can let -fuse-ld= represent the linker flavor and --ld-path= the linker path. Hello. I have just few nits: === ERROR type #3: trailing operator (1 error(s)) === gcc/collect2.c:1155:14: ld_file_name = PR driver/93645 * common.opt (--ld-path=): Add --ld-path= * opts.c (common_handle_option): Handle OPT__ld_path_. * gcc.c (driver_handle_option): Likewise. * collect2.c (main): Likewise. * doc/invoke.texi: Document --ld-path=. --- Changes in v2: * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). The option does not affect code generation and is not a language feature, -f* is not suitable. Additionally, clang has other similar --*-path= options, e.g. --cuda-path=. --- gcc/collect2.c | 63 +++-- gcc/common.opt | 4 +++ gcc/doc/invoke.texi | 9 +++ gcc/gcc.c | 2 +- gcc/opts.c | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..caa1b96ab52 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -844,6 +844,7 @@ main (int argc, char **argv) const char **ld1; bool use_plugin = false; bool use_collect_ld = false; + const char *ld_path = NULL; /* The kinds of symbols we will have to consider when scanning the outcome of a first pass link. This is ALL to start with, then might @@ -961,12 +962,21 @@ main (int argc, char **argv) if (selected_linker == USE_DEFAULT_LD) selected_linker = USE_PLUGIN_LD; } - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) - selected_linker = USE_BFD_LD; - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) - selected_linker = USE_GOLD_LD; - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) - selected_linker = USE_LLD_LD; + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 + && selected_linker != USE_LD_MAX) + { + if (strcmp (argv[i] + 9, "bfd") == 0) + selected_linker = USE_BFD_LD; + else if (strcmp (argv[i] + 9, "gold") == 0) + selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i] + 9, "lld") == 0) + selected_linker = USE_LLD_LD; + } + else if (strncmp (argv[i], "--ld-path=", 10) == 0) + { + ld_path = argv[i] + 10; + selected_linker = USE_LD_MAX; + } else if (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1117,14 +1127,34 @@ main (int argc, char **argv) ld_file_name = find_a_file (, collect_ld_suffix, X_OK); use_collect_ld = ld_file_name != 0; } - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], X_OK); + if (selected_linker == USE_LD_MAX) + { + /* If --ld-path= does not contain a path component separator, search for + the command using cpath, then using path. Otherwise find the linker + relative to the current working directory. */ + if (lbasename (ld_path) == ld_path) + { + ld_file_name = find_a_file (, ld_path, X_OK); + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_path, X_OK); + } + else if (file_exists (ld_path)) + { ^^^ these braces are not needed. + ld_file_name = ld_path; + } + } + else + { + /* Search the compiler directories for `ld'. We have protection against + recursive calls in find_a_file. */ + if (ld_file_name == 0) I would prefer '== NULL'. + ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); + /* Search the ordinary system bin directories + for `ld' (if native linking) or `TARGET-ld' (if cross). */ + if (ld_file_name == 0) + ld_file_name = + find_a_file (, full_ld_suffixes[selected_linker], X_OK); + } #ifdef REAL_NM_FILE_NAME nm_file_name = find_a_file (, REAL_NM_FILE_NAME, X_OK); @@ -1461,6 +1491,11 @@ main (int argc, char **argv)
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
PING^2 On 12/4/20 2:45 PM, Martin Liška wrote: PING May I please ping the patch, it's waiting here for a review for quite some time. Thanks, Martin On 7/23/20 12:17 PM, Martin Liška wrote: On 7/21/20 6:07 AM, Fangrui Song wrote: If the value does not contain any path component separator (e.g. a slash), the linker will be searched for using COMPILER_PATH followed by PATH. Otherwise, it is either an absolute path or a path relative to the current working directory. --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the future, we want to make dfferent linker option decisions we can let -fuse-ld= represent the linker flavor and --ld-path= the linker path. Hello. I have just few nits: === ERROR type #3: trailing operator (1 error(s)) === gcc/collect2.c:1155:14: ld_file_name = PR driver/93645 * common.opt (--ld-path=): Add --ld-path= * opts.c (common_handle_option): Handle OPT__ld_path_. * gcc.c (driver_handle_option): Likewise. * collect2.c (main): Likewise. * doc/invoke.texi: Document --ld-path=. --- Changes in v2: * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). The option does not affect code generation and is not a language feature, -f* is not suitable. Additionally, clang has other similar --*-path= options, e.g. --cuda-path=. --- gcc/collect2.c | 63 +++-- gcc/common.opt | 4 +++ gcc/doc/invoke.texi | 9 +++ gcc/gcc.c | 2 +- gcc/opts.c | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..caa1b96ab52 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -844,6 +844,7 @@ main (int argc, char **argv) const char **ld1; bool use_plugin = false; bool use_collect_ld = false; + const char *ld_path = NULL; /* The kinds of symbols we will have to consider when scanning the outcome of a first pass link. This is ALL to start with, then might @@ -961,12 +962,21 @@ main (int argc, char **argv) if (selected_linker == USE_DEFAULT_LD) selected_linker = USE_PLUGIN_LD; } - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) - selected_linker = USE_BFD_LD; - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) - selected_linker = USE_GOLD_LD; - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) - selected_linker = USE_LLD_LD; + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 + && selected_linker != USE_LD_MAX) + { + if (strcmp (argv[i] + 9, "bfd") == 0) + selected_linker = USE_BFD_LD; + else if (strcmp (argv[i] + 9, "gold") == 0) + selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i] + 9, "lld") == 0) + selected_linker = USE_LLD_LD; + } + else if (strncmp (argv[i], "--ld-path=", 10) == 0) + { + ld_path = argv[i] + 10; + selected_linker = USE_LD_MAX; + } else if (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1117,14 +1127,34 @@ main (int argc, char **argv) ld_file_name = find_a_file (, collect_ld_suffix, X_OK); use_collect_ld = ld_file_name != 0; } - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], X_OK); + if (selected_linker == USE_LD_MAX) + { + /* If --ld-path= does not contain a path component separator, search for + the command using cpath, then using path. Otherwise find the linker + relative to the current working directory. */ + if (lbasename (ld_path) == ld_path) + { + ld_file_name = find_a_file (, ld_path, X_OK); + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_path, X_OK); + } + else if (file_exists (ld_path)) + { ^^^ these braces are not needed. + ld_file_name = ld_path; + } + } + else + { + /* Search the compiler directories for `ld'. We have protection against + recursive calls in find_a_file. */ + if (ld_file_name == 0) I would prefer '== NULL'. + ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); + /* Search the ordinary system bin directories + for `ld' (if native linking) or `TARGET-ld' (if cross). */ + if (ld_file_name == 0) + ld_file_name = + find_a_file (, full_ld_suffixes[selected_linker], X_OK); + } #ifdef REAL_NM_FILE_NAME nm_file_name = find_a_file (, REAL_NM_FILE_NAME, X_OK); @@ -1461,6 +1491,11 @@ main (int argc, char **argv) ld2--; #endif } +
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On Fri, Dec 4, 2020 at 5:45 AM Martin Liška wrote: > > PING > > May I please ping the patch, it's waiting here for a review > for quite some time. > > Thanks, > Martin Ping. I think Martin LGTMed this patch and was waiting for a maintainer to merge it > On 7/23/20 12:17 PM, Martin Liška wrote: > > On 7/21/20 6:07 AM, Fangrui Song wrote: > >> If the value does not contain any path component separator (e.g. a > >> slash), the linker will be searched for using COMPILER_PATH followed by > >> PATH. Otherwise, it is either an absolute path or a path relative to the > >> current working directory. > >> > >> --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the > >> future, we want to make dfferent linker option decisions we can let > >> -fuse-ld= represent the linker flavor and --ld-path= the linker path. > > > > Hello. > > > > I have just few nits: > > > > === ERROR type #3: trailing operator (1 error(s)) === > > gcc/collect2.c:1155:14:ld_file_name = > > > >> > >> PR driver/93645 > >> * common.opt (--ld-path=): Add --ld-path= > >> * opts.c (common_handle_option): Handle OPT__ld_path_. > >> * gcc.c (driver_handle_option): Likewise. > >> * collect2.c (main): Likewise. > >> * doc/invoke.texi: Document --ld-path=. > >> > >> --- > >> Changes in v2: > >> * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). > >>The option does not affect code generation and is not a language > >> feature, > >>-f* is not suitable. Additionally, clang has other similar --*-path= > >>options, e.g. --cuda-path=. > >> --- > >> gcc/collect2.c | 63 +++-- > >> gcc/common.opt | 4 +++ > >> gcc/doc/invoke.texi | 9 +++ > >> gcc/gcc.c | 2 +- > >> gcc/opts.c | 1 + > >> 5 files changed, 64 insertions(+), 15 deletions(-) > >> > >> diff --git a/gcc/collect2.c b/gcc/collect2.c > >> index f8a5ce45994..caa1b96ab52 100644 > >> --- a/gcc/collect2.c > >> +++ b/gcc/collect2.c > >> @@ -844,6 +844,7 @@ main (int argc, char **argv) > >> const char **ld1; > >> bool use_plugin = false; > >> bool use_collect_ld = false; > >> + const char *ld_path = NULL; > >> /* The kinds of symbols we will have to consider when scanning the > >>outcome of a first pass link. This is ALL to start with, then might > >> @@ -961,12 +962,21 @@ main (int argc, char **argv) > >> if (selected_linker == USE_DEFAULT_LD) > >> selected_linker = USE_PLUGIN_LD; > >> } > >> -else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) > >> - selected_linker = USE_BFD_LD; > >> -else if (strcmp (argv[i], "-fuse-ld=gold") == 0) > >> - selected_linker = USE_GOLD_LD; > >> -else if (strcmp (argv[i], "-fuse-ld=lld") == 0) > >> - selected_linker = USE_LLD_LD; > >> +else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 > >> + && selected_linker != USE_LD_MAX) > >> + { > >> +if (strcmp (argv[i] + 9, "bfd") == 0) > >> + selected_linker = USE_BFD_LD; > >> +else if (strcmp (argv[i] + 9, "gold") == 0) > >> + selected_linker = USE_GOLD_LD; > >> +else if (strcmp (argv[i] + 9, "lld") == 0) > >> + selected_linker = USE_LLD_LD; > >> + } > >> +else if (strncmp (argv[i], "--ld-path=", 10) == 0) > >> + { > >> +ld_path = argv[i] + 10; > >> +selected_linker = USE_LD_MAX; > >> + } > >> else if (strncmp (argv[i], "-o", 2) == 0) > >> { > >> /* Parse the output filename if it's given so that we can make > >> @@ -1117,14 +1127,34 @@ main (int argc, char **argv) > >> ld_file_name = find_a_file (, collect_ld_suffix, X_OK); > >> use_collect_ld = ld_file_name != 0; > >> } > >> - /* Search the compiler directories for `ld'. We have protection against > >> - recursive calls in find_a_file. */ > >> - if (ld_file_name == 0) > >> -ld_file_name = find_a_file (, ld_suffixes[selected_linker], > >> X_OK); > >> - /* Search the ordinary system bin directories > >> - for `ld' (if native linking) or `TARGET-ld' (if cross). */ > >> - if (ld_file_name == 0) > >> -ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], > >> X_OK); > >> + if (selected_linker == USE_LD_MAX) > >> +{ > >> + /* If --ld-path= does not contain a path component separator, > >> search for > >> + the command using cpath, then using path. Otherwise find the linker > >> + relative to the current working directory. */ > >> + if (lbasename (ld_path) == ld_path) > >> +{ > >> + ld_file_name = find_a_file (, ld_path, X_OK); > >> + if (ld_file_name == 0) > >> +ld_file_name = find_a_file (, ld_path, X_OK); > >> +} > >> + else if (file_exists (ld_path)) > >> +{ > > > > ^^^ these braces are not needed. > > > >> + ld_file_name = ld_path; > >> +} > >> +} > >> + else > >> +{ > >> + /* Search the
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
PING May I please ping the patch, it's waiting here for a review for quite some time. Thanks, Martin On 7/23/20 12:17 PM, Martin Liška wrote: On 7/21/20 6:07 AM, Fangrui Song wrote: If the value does not contain any path component separator (e.g. a slash), the linker will be searched for using COMPILER_PATH followed by PATH. Otherwise, it is either an absolute path or a path relative to the current working directory. --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the future, we want to make dfferent linker option decisions we can let -fuse-ld= represent the linker flavor and --ld-path= the linker path. Hello. I have just few nits: === ERROR type #3: trailing operator (1 error(s)) === gcc/collect2.c:1155:14: ld_file_name = PR driver/93645 * common.opt (--ld-path=): Add --ld-path= * opts.c (common_handle_option): Handle OPT__ld_path_. * gcc.c (driver_handle_option): Likewise. * collect2.c (main): Likewise. * doc/invoke.texi: Document --ld-path=. --- Changes in v2: * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). The option does not affect code generation and is not a language feature, -f* is not suitable. Additionally, clang has other similar --*-path= options, e.g. --cuda-path=. --- gcc/collect2.c | 63 +++-- gcc/common.opt | 4 +++ gcc/doc/invoke.texi | 9 +++ gcc/gcc.c | 2 +- gcc/opts.c | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..caa1b96ab52 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -844,6 +844,7 @@ main (int argc, char **argv) const char **ld1; bool use_plugin = false; bool use_collect_ld = false; + const char *ld_path = NULL; /* The kinds of symbols we will have to consider when scanning the outcome of a first pass link. This is ALL to start with, then might @@ -961,12 +962,21 @@ main (int argc, char **argv) if (selected_linker == USE_DEFAULT_LD) selected_linker = USE_PLUGIN_LD; } - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) - selected_linker = USE_BFD_LD; - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) - selected_linker = USE_GOLD_LD; - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) - selected_linker = USE_LLD_LD; + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 + && selected_linker != USE_LD_MAX) + { + if (strcmp (argv[i] + 9, "bfd") == 0) + selected_linker = USE_BFD_LD; + else if (strcmp (argv[i] + 9, "gold") == 0) + selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i] + 9, "lld") == 0) + selected_linker = USE_LLD_LD; + } + else if (strncmp (argv[i], "--ld-path=", 10) == 0) + { + ld_path = argv[i] + 10; + selected_linker = USE_LD_MAX; + } else if (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1117,14 +1127,34 @@ main (int argc, char **argv) ld_file_name = find_a_file (, collect_ld_suffix, X_OK); use_collect_ld = ld_file_name != 0; } - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) - ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], X_OK); + if (selected_linker == USE_LD_MAX) + { + /* If --ld-path= does not contain a path component separator, search for + the command using cpath, then using path. Otherwise find the linker + relative to the current working directory. */ + if (lbasename (ld_path) == ld_path) + { + ld_file_name = find_a_file (, ld_path, X_OK); + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_path, X_OK); + } + else if (file_exists (ld_path)) + { ^^^ these braces are not needed. + ld_file_name = ld_path; + } + } + else + { + /* Search the compiler directories for `ld'. We have protection against + recursive calls in find_a_file. */ + if (ld_file_name == 0) I would prefer '== NULL'. + ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); + /* Search the ordinary system bin directories + for `ld' (if native linking) or `TARGET-ld' (if cross). */ + if (ld_file_name == 0) + ld_file_name = + find_a_file (, full_ld_suffixes[selected_linker], X_OK); + } #ifdef REAL_NM_FILE_NAME nm_file_name = find_a_file (, REAL_NM_FILE_NAME, X_OK); @@ -1461,6 +1491,11 @@ main (int argc, char **argv) ld2--; #endif } + else if (strncmp (arg, "--ld-path=", 10) == 0) +
Re: [PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
On 7/21/20 6:07 AM, Fangrui Song wrote: If the value does not contain any path component separator (e.g. a slash), the linker will be searched for using COMPILER_PATH followed by PATH. Otherwise, it is either an absolute path or a path relative to the current working directory. --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the future, we want to make dfferent linker option decisions we can let -fuse-ld= represent the linker flavor and --ld-path= the linker path. Hello. I have just few nits: === ERROR type #3: trailing operator (1 error(s)) === gcc/collect2.c:1155:14: ld_file_name = PR driver/93645 * common.opt (--ld-path=): Add --ld-path= * opts.c (common_handle_option): Handle OPT__ld_path_. * gcc.c (driver_handle_option): Likewise. * collect2.c (main): Likewise. * doc/invoke.texi: Document --ld-path=. --- Changes in v2: * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). The option does not affect code generation and is not a language feature, -f* is not suitable. Additionally, clang has other similar --*-path= options, e.g. --cuda-path=. --- gcc/collect2.c | 63 +++-- gcc/common.opt | 4 +++ gcc/doc/invoke.texi | 9 +++ gcc/gcc.c | 2 +- gcc/opts.c | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..caa1b96ab52 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -844,6 +844,7 @@ main (int argc, char **argv) const char **ld1; bool use_plugin = false; bool use_collect_ld = false; + const char *ld_path = NULL; /* The kinds of symbols we will have to consider when scanning the outcome of a first pass link. This is ALL to start with, then might @@ -961,12 +962,21 @@ main (int argc, char **argv) if (selected_linker == USE_DEFAULT_LD) selected_linker = USE_PLUGIN_LD; } - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) - selected_linker = USE_BFD_LD; - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) - selected_linker = USE_GOLD_LD; - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) - selected_linker = USE_LLD_LD; + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 +&& selected_linker != USE_LD_MAX) + { + if (strcmp (argv[i] + 9, "bfd") == 0) + selected_linker = USE_BFD_LD; + else if (strcmp (argv[i] + 9, "gold") == 0) + selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i] + 9, "lld") == 0) + selected_linker = USE_LLD_LD; + } + else if (strncmp (argv[i], "--ld-path=", 10) == 0) + { + ld_path = argv[i] + 10; + selected_linker = USE_LD_MAX; + } else if (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1117,14 +1127,34 @@ main (int argc, char **argv) ld_file_name = find_a_file (, collect_ld_suffix, X_OK); use_collect_ld = ld_file_name != 0; } - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) -ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) -ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], X_OK); + if (selected_linker == USE_LD_MAX) +{ + /* If --ld-path= does not contain a path component separator, search for +the command using cpath, then using path. Otherwise find the linker +relative to the current working directory. */ + if (lbasename (ld_path) == ld_path) + { + ld_file_name = find_a_file (, ld_path, X_OK); + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_path, X_OK); + } + else if (file_exists (ld_path)) + { ^^^ these braces are not needed. + ld_file_name = ld_path; + } +} + else +{ + /* Search the compiler directories for `ld'. We have protection against +recursive calls in find_a_file. */ + if (ld_file_name == 0) I would prefer '== NULL'. + ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); + /* Search the ordinary system bin directories +for `ld' (if native linking) or `TARGET-ld' (if cross). */ + if (ld_file_name == 0) + ld_file_name = + find_a_file (, full_ld_suffixes[selected_linker], X_OK); +} #ifdef REAL_NM_FILE_NAME nm_file_name = find_a_file (, REAL_NM_FILE_NAME, X_OK); @@ -1461,6 +1491,11 @@ main (int argc, char **argv) ld2--; #endif } + else if (strncmp (arg,
[PATCH v2] Add --ld-path= to specify an arbitrary executable as the linker
If the value does not contain any path component separator (e.g. a slash), the linker will be searched for using COMPILER_PATH followed by PATH. Otherwise, it is either an absolute path or a path relative to the current working directory. --ld-path= complements and overrides -fuse-ld={bfd,gold,lld}. If in the future, we want to make dfferent linker option decisions we can let -fuse-ld= represent the linker flavor and --ld-path= the linker path. PR driver/93645 * common.opt (--ld-path=): Add --ld-path= * opts.c (common_handle_option): Handle OPT__ld_path_. * gcc.c (driver_handle_option): Likewise. * collect2.c (main): Likewise. * doc/invoke.texi: Document --ld-path=. --- Changes in v2: * Renamed -fld-path= to --ld-path= (clang 12.0.0 new option). The option does not affect code generation and is not a language feature, -f* is not suitable. Additionally, clang has other similar --*-path= options, e.g. --cuda-path=. --- gcc/collect2.c | 63 +++-- gcc/common.opt | 4 +++ gcc/doc/invoke.texi | 9 +++ gcc/gcc.c | 2 +- gcc/opts.c | 1 + 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..caa1b96ab52 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -844,6 +844,7 @@ main (int argc, char **argv) const char **ld1; bool use_plugin = false; bool use_collect_ld = false; + const char *ld_path = NULL; /* The kinds of symbols we will have to consider when scanning the outcome of a first pass link. This is ALL to start with, then might @@ -961,12 +962,21 @@ main (int argc, char **argv) if (selected_linker == USE_DEFAULT_LD) selected_linker = USE_PLUGIN_LD; } - else if (strcmp (argv[i], "-fuse-ld=bfd") == 0) - selected_linker = USE_BFD_LD; - else if (strcmp (argv[i], "-fuse-ld=gold") == 0) - selected_linker = USE_GOLD_LD; - else if (strcmp (argv[i], "-fuse-ld=lld") == 0) - selected_linker = USE_LLD_LD; + else if (strncmp (argv[i], "-fuse-ld=", 9) == 0 +&& selected_linker != USE_LD_MAX) + { + if (strcmp (argv[i] + 9, "bfd") == 0) + selected_linker = USE_BFD_LD; + else if (strcmp (argv[i] + 9, "gold") == 0) + selected_linker = USE_GOLD_LD; + else if (strcmp (argv[i] + 9, "lld") == 0) + selected_linker = USE_LLD_LD; + } + else if (strncmp (argv[i], "--ld-path=", 10) == 0) + { + ld_path = argv[i] + 10; + selected_linker = USE_LD_MAX; + } else if (strncmp (argv[i], "-o", 2) == 0) { /* Parse the output filename if it's given so that we can make @@ -1117,14 +1127,34 @@ main (int argc, char **argv) ld_file_name = find_a_file (, collect_ld_suffix, X_OK); use_collect_ld = ld_file_name != 0; } - /* Search the compiler directories for `ld'. We have protection against - recursive calls in find_a_file. */ - if (ld_file_name == 0) -ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); - /* Search the ordinary system bin directories - for `ld' (if native linking) or `TARGET-ld' (if cross). */ - if (ld_file_name == 0) -ld_file_name = find_a_file (, full_ld_suffixes[selected_linker], X_OK); + if (selected_linker == USE_LD_MAX) +{ + /* If --ld-path= does not contain a path component separator, search for +the command using cpath, then using path. Otherwise find the linker +relative to the current working directory. */ + if (lbasename (ld_path) == ld_path) + { + ld_file_name = find_a_file (, ld_path, X_OK); + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_path, X_OK); + } + else if (file_exists (ld_path)) + { + ld_file_name = ld_path; + } +} + else +{ + /* Search the compiler directories for `ld'. We have protection against +recursive calls in find_a_file. */ + if (ld_file_name == 0) + ld_file_name = find_a_file (, ld_suffixes[selected_linker], X_OK); + /* Search the ordinary system bin directories +for `ld' (if native linking) or `TARGET-ld' (if cross). */ + if (ld_file_name == 0) + ld_file_name = + find_a_file (, full_ld_suffixes[selected_linker], X_OK); +} #ifdef REAL_NM_FILE_NAME nm_file_name = find_a_file (, REAL_NM_FILE_NAME, X_OK); @@ -1461,6 +1491,11 @@ main (int argc, char **argv) ld2--; #endif } + else if (strncmp (arg, "--ld-path=", 10) == 0) + { + ld1--; + ld2--; + } else if (strncmp (arg, "--sysroot=", 10) == 0) target_system_root = arg + 10; else if (strcmp (arg, "--version")