rustc_target/spec/targets/
x86_64_fortanix_unknown_sgx.rs1use 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 "-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}