rustc_target/spec/targets/
x86_64_fortanix_unknown_sgx.rs

1use std::borrow::Cow;
2
3use crate::spec::{
4    Abi, Arch, Cc, Env, LinkerFlavor, Lld, Os, Target, TargetMetadata, TargetOptions, cvs,
5};
6
7pub(crate) fn target() -> Target {
8    let pre_link_args = TargetOptions::link_args(
9        LinkerFlavor::Gnu(Cc::No, Lld::No),
10        &[
11            "-e",
12            "elf_entry",
13            "-Bstatic",
14            "--gc-sections",
15            "-z",
16            "text",
17            "-z",
18            "norelro",
19            "--no-undefined",
20            "--error-unresolved-symbols",
21            "--no-undefined-version",
22            "-Bsymbolic",
23            "--export-dynamic",
24            // The following symbols are needed by libunwind, which is linked after
25            // libstd. Make sure they're included in the link.
26            "-u",
27            "__rust_abort",
28            "-u",
29            "__rust_c_alloc",
30            "-u",
31            "__rust_c_dealloc",
32            "-u",
33            "__rust_print_err",
34            "-u",
35            "__rust_rwlock_rdlock",
36            "-u",
37            "__rust_rwlock_unlock",
38            "-u",
39            "__rust_rwlock_wrlock",
40        ],
41    );
42
43    const EXPORT_SYMBOLS: &[&str] = &[
44        "sgx_entry",
45        "HEAP_BASE",
46        "HEAP_SIZE",
47        "RELA",
48        "RELACOUNT",
49        "ENCLAVE_SIZE",
50        "CFGDATA_BASE",
51        "DEBUG",
52        "EH_FRM_HDR_OFFSET",
53        "EH_FRM_HDR_LEN",
54        "EH_FRM_OFFSET",
55        "EH_FRM_LEN",
56        "TEXT_BASE",
57        "TEXT_SIZE",
58    ];
59    let opts = TargetOptions {
60        os: Os::Unknown,
61        env: Env::Sgx,
62        vendor: "fortanix".into(),
63        abi: Abi::Fortanix,
64        linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
65        linker: Some("rust-lld".into()),
66        max_atomic_width: Some(64),
67        cpu: "x86-64".into(),
68        plt_by_default: false,
69        features: "+rdrnd,+rdseed,+lvi-cfi,+lvi-load-hardening".into(),
70        llvm_args: cvs!["--x86-experimental-lvi-inline-asm-hardening"],
71        position_independent_executables: true,
72        pre_link_args,
73        override_export_symbols: Some(EXPORT_SYMBOLS.iter().cloned().map(Cow::from).collect()),
74        relax_elf_relocations: true,
75        ..Default::default()
76    };
77    Target {
78        llvm_target: "x86_64-elf".into(),
79        metadata: TargetMetadata {
80            description: Some("Fortanix ABI for 64-bit Intel SGX".into()),
81            tier: Some(2),
82            host_tools: Some(false),
83            std: Some(true),
84        },
85        pointer_width: 64,
86        data_layout:
87            "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
88        arch: Arch::X86_64,
89        options: opts,
90    }
91}