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/0419db6b95e246fe9dc90b5795beb77c393eb2ce/clang/lib/Driver/ToolChains/Fuchsia.cpp#L32
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            "start-stop-visibility=hidden",
22            "-z",
23            "rodynamic",
24            "-z",
25            "separate-loadable-segments",
26            "-z",
27            "rel",
28            "--pack-dyn-relocs=relr",
29        ],
30    );
31
32    TargetOptions {
33        os: "fuchsia".into(),
34        linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
35        linker: Some("rust-lld".into()),
36        dynamic_linking: true,
37        families: cvs!["unix"],
38        pre_link_args,
39        pre_link_objects: crt_objects::new(&[
40            (LinkOutputKind::DynamicNoPicExe, &["Scrt1.o"]),
41            (LinkOutputKind::DynamicPicExe, &["Scrt1.o"]),
42            (LinkOutputKind::StaticNoPicExe, &["Scrt1.o"]),
43            (LinkOutputKind::StaticPicExe, &["Scrt1.o"]),
44        ]),
45        position_independent_executables: true,
46        has_thread_local: true,
47        frame_pointer: FramePointer::NonLeaf,
48        ..Default::default()
49    }
50}