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 "-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}