Skip to content

Commit 92b32e3

Browse files
authored
Rollup merge of #99500 - tmandry:fuchsia-flags, r=petrochenkov
Fix flags when using clang as linker for Fuchsia Don't add C runtime or set dynamic linker when linking with clang for Fuchsia. Clang already does this for us.
2 parents 6737549 + 55d5dcb commit 92b32e3

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

compiler/rustc_codegen_ssa/src/back/link.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -1583,12 +1583,21 @@ fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
15831583
fn add_pre_link_objects(
15841584
cmd: &mut dyn Linker,
15851585
sess: &Session,
1586+
flavor: LinkerFlavor,
15861587
link_output_kind: LinkOutputKind,
15871588
self_contained: bool,
15881589
) {
1590+
// FIXME: we are currently missing some infra here (per-linker-flavor CRT objects),
1591+
// so Fuchsia has to be special-cased.
15891592
let opts = &sess.target;
1590-
let objects =
1591-
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects };
1593+
let empty = Default::default();
1594+
let objects = if self_contained {
1595+
&opts.pre_link_objects_fallback
1596+
} else if !(sess.target.os == "fuchsia" && flavor == LinkerFlavor::Gcc) {
1597+
&opts.pre_link_objects
1598+
} else {
1599+
&empty
1600+
};
15921601
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
15931602
cmd.add_object(&get_object_file_path(sess, obj, self_contained));
15941603
}
@@ -1914,7 +1923,7 @@ fn linker_with_args<'a>(
19141923
// ------------ Object code and libraries, order-dependent ------------
19151924

19161925
// Pre-link CRT objects.
1917-
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
1926+
add_pre_link_objects(cmd, sess, flavor, link_output_kind, crt_objects_fallback);
19181927

19191928
add_linked_symbol_object(
19201929
cmd,
@@ -2070,7 +2079,10 @@ fn add_order_independent_options(
20702079

20712080
add_link_script(cmd, sess, tmpdir, crate_type);
20722081

2073-
if sess.target.os == "fuchsia" && crate_type == CrateType::Executable {
2082+
if sess.target.os == "fuchsia"
2083+
&& crate_type == CrateType::Executable
2084+
&& flavor != LinkerFlavor::Gcc
2085+
{
20742086
let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
20752087
"asan/"
20762088
} else {

compiler/rustc_target/src/spec/fuchsia_base.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use crate::spec::{crt_objects, cvs, LinkOutputKind, LinkerFlavor, LldFlavor, TargetOptions};
22

33
pub fn opts() -> TargetOptions {
4+
// This mirrors the linker options provided by clang. We presume lld for
5+
// now. When using clang as the linker it will supply these options for us,
6+
// so we only list them for ld/lld.
7+
//
8+
// https://github.com/llvm/llvm-project/blob/db9322b2066c55254e7691efeab863f43bfcc084/clang/lib/Driver/ToolChains/Fuchsia.cpp#L31
49
let pre_link_args = TargetOptions::link_args(
510
LinkerFlavor::Ld,
611
&[

0 commit comments

Comments
 (0)