rustc_target/spec/targets/
x86_64_fortanix_unknown_sgx.rs

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