rustc_target/spec/base/
fuchsia.rs

1use crate::spec::{
2    Cc, FramePointer, LinkOutputKind, LinkerFlavor, Lld, TargetOptions, crt_objects, cvs,
3};
4
5pub(crate) fn opts() -> TargetOptions {
6    // This mirrors the linker options provided by clang. We presume lld for
7    // now. When using clang as the linker it will supply these options for us,
8    // so we only list them for ld/lld.
9    //
10    // https://github.com/llvm/llvm-project/blob/db9322b2066c55254e7691efeab863f43bfcc084/clang/lib/Driver/ToolChains/Fuchsia.cpp#L31
11    let pre_link_args = TargetOptions::link_args(
12        LinkerFlavor::Gnu(Cc::No, Lld::No),
13        &[
14            "--build-id",
15            "--hash-style=gnu",
16            "-z",
17            "max-page-size=4096",
18            "-z",
19            "now",
20            "-z",
21            "rodynamic",
22            "-z",
23            "separate-loadable-segments",
24            "--pack-dyn-relocs=relr",
25        ],
26    );
27
28    TargetOptions {
29        os: "fuchsia".into(),
30        linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
31        linker: Some("rust-lld".into()),
32        dynamic_linking: true,
33        families: cvs!["unix"],
34        pre_link_args,
35        pre_link_objects: crt_objects::new(&[
36            (LinkOutputKind::DynamicNoPicExe, &["Scrt1.o"]),
37            (LinkOutputKind::DynamicPicExe, &["Scrt1.o"]),
38            (LinkOutputKind::StaticNoPicExe, &["Scrt1.o"]),
39            (LinkOutputKind::StaticPicExe, &["Scrt1.o"]),
40        ]),
41        position_independent_executables: true,
42        has_thread_local: true,
43        frame_pointer: FramePointer::NonLeaf,
44        ..Default::default()
45    }
46}