Skip to content

Commit 5572f38

Browse files
committed
Auto merge of #125417 - lqd:lld-retry, r=<try>
self-contained linker: retry linking without `-fuse-ld=lld` on CCs that don't support it For the self-contained linker, this PR applies [the strategy](#125330 (comment)) of retrying the linking step when the driver doesn't support `-fuse-ld=lld`, but with the option removed. This is the same strategy we already use of retrying when e.g. `-no-pie` is not supported. Fixes #125330 r? `@petrochenkov` I have no idea how we could add a test here, much like we don't have one for `-no-pie` or `-static-pie` -- let me know if you have ideas -- but I tested on a CentOS7 image: ```console [root@d25b38376ede tmp]# ../build/host/stage1/bin/rustc helloworld.rs WARN rustc_codegen_ssa::back::link The linker driver does not support `-fuse-ld=lld`. Retrying without it. [root@d25b38376ede tmp]# readelf -p .comment helloworld String dump of section '.comment': [ 0] GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44) [ 2d] rustc version 1.80.0-dev ``` (I wasn't able to test with `cross` as the issue describes: I wasn't able to reproduce that behavior locally. So I'll ask for help from the OP with a try build)
2 parents 5d328a1 + 5da41f5 commit 5572f38

File tree

1 file changed

+21
-0
lines changed
  • compiler/rustc_codegen_ssa/src/back

1 file changed

+21
-0
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+21
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,27 @@ fn link_natively(
799799
continue;
800800
}
801801

802+
// Check if linking failed with an error message that indicates the driver didn't recognize
803+
// the `-fuse-ld=lld` option. If so, re-perform the link step without it. This avoids having
804+
// to spawn multiple instances on the happy path to do version checking, and ensures things
805+
// keep working on the tier 1 baseline of GLIBC 2.17+. That is generally understood as GCCs
806+
// circa RHEL/CentOS 7, 4.5 or so, whereas lld support was added in GCC 9.
807+
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, Lld::Yes))
808+
&& unknown_arg_regex.is_match(&out)
809+
&& out.contains("-fuse-ld=lld")
810+
&& cmd.get_args().iter().any(|e| e.to_string_lossy() == "-fuse-ld=lld")
811+
{
812+
info!("linker output: {:?}", out);
813+
warn!("The linker driver does not support `-fuse-ld=lld`. Retrying without it.");
814+
for arg in cmd.take_args() {
815+
if arg.to_string_lossy() != "-fuse-ld=lld" {
816+
cmd.arg(arg);
817+
}
818+
}
819+
info!("{:?}", &cmd);
820+
continue;
821+
}
822+
802823
// Detect '-static-pie' used with an older version of gcc or clang not supporting it.
803824
// Fallback from '-static-pie' to '-static' in that case.
804825
if matches!(flavor, LinkerFlavor::Gnu(Cc::Yes, _))

0 commit comments

Comments
 (0)