diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-09-05 12:11:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-05 12:11:13 +0200 |
| commit | 043159f9185281585cf03c8ea5c3ead9a3222f3a (patch) | |
| tree | ef4c4b96223a6df77769625a7df0da42b93522a6 | |
| parent | fd46f6ed4158fe50e8eda731be749d99e1f47ff6 (diff) | |
| parent | 5e933b490b17de43b5c9b45b77088732f17b7ffd (diff) | |
| download | rust-043159f9185281585cf03c8ea5c3ead9a3222f3a.tar.gz rust-043159f9185281585cf03c8ea5c3ead9a3222f3a.zip | |
Rollup merge of #64051 - alex:linux-kernel-module-target, r=joshtriplett
Add x86_64-linux-kernel target This adds a target specification for Linux kernel modules on x86_64, as well as base code that can be shared with other architectures. I wasn't totally sure about what the best name for this was. There's one open question on whether we should use the LLVM generic x86_64-elf target, or the same one used for the Linux userspace. r? @joshtriplett
| -rw-r--r-- | src/librustc_target/spec/linux_kernel_base.rs | 26 | ||||
| -rw-r--r-- | src/librustc_target/spec/mod.rs | 3 | ||||
| -rw-r--r-- | src/librustc_target/spec/x86_64_linux_kernel.rs | 31 |
3 files changed, 60 insertions, 0 deletions
diff --git a/src/librustc_target/spec/linux_kernel_base.rs b/src/librustc_target/spec/linux_kernel_base.rs new file mode 100644 index 00000000000..fae44836fa8 --- /dev/null +++ b/src/librustc_target/spec/linux_kernel_base.rs @@ -0,0 +1,26 @@ +use crate::spec::{LinkArgs, LinkerFlavor, PanicStrategy, RelroLevel, TargetOptions}; +use std::default::Default; + +pub fn opts() -> TargetOptions { + let mut pre_link_args = LinkArgs::new(); + pre_link_args.insert( + LinkerFlavor::Gcc, + vec!["-Wl,--as-needed".to_string(), "-Wl,-z,noexecstack".to_string()], + ); + + TargetOptions { + disable_redzone: true, + panic_strategy: PanicStrategy::Abort, + stack_probes: true, + eliminate_frame_pointer: false, + linker_is_gnu: true, + position_independent_executables: true, + needs_plt: true, + relro_level: RelroLevel::Full, + relocation_model: "static".to_string(), + target_family: Some("unix".to_string()), + pre_link_args, + + ..Default::default() + } +} diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index 539e28f7088..503d8a08b6f 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -53,6 +53,7 @@ mod freebsd_base; mod haiku_base; mod hermit_base; mod linux_base; +mod linux_kernel_base; mod linux_musl_base; mod openbsd_base; mod netbsd_base; @@ -386,6 +387,8 @@ supported_targets! { ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi), ("aarch64-linux-android", aarch64_linux_android), + ("x86_64-linux-kernel", x86_64_linux_kernel), + ("aarch64-unknown-freebsd", aarch64_unknown_freebsd), ("armv6-unknown-freebsd", armv6_unknown_freebsd), ("armv7-unknown-freebsd", armv7_unknown_freebsd), diff --git a/src/librustc_target/spec/x86_64_linux_kernel.rs b/src/librustc_target/spec/x86_64_linux_kernel.rs new file mode 100644 index 00000000000..a80b021208e --- /dev/null +++ b/src/librustc_target/spec/x86_64_linux_kernel.rs @@ -0,0 +1,31 @@ +// This defines the amd64 target for the Linux Kernel. See the linux-kernel-base module for +// generic Linux kernel options. + +use crate::spec::{LinkerFlavor, Target, TargetResult}; + +pub fn target() -> TargetResult { + let mut base = super::linux_kernel_base::opts(); + base.cpu = "x86-64".to_string(); + base.max_atomic_width = Some(64); + base.features = + "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float" + .to_string(); + base.code_model = Some("kernel".to_string()); + base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); + + Ok(Target { + // FIXME: Some dispute, the linux-on-clang folks think this should use "Linux" + llvm_target: "x86_64-elf".to_string(), + target_endian: "little".to_string(), + target_pointer_width: "64".to_string(), + target_c_int_width: "32".to_string(), + data_layout: "e-m:e-i64:64-f80:128-n8:16:32:64-S128".to_string(), + target_os: "none".to_string(), + target_env: "gnu".to_string(), + target_vendor: "unknown".to_string(), + arch: "x86_64".to_string(), + linker_flavor: LinkerFlavor::Gcc, + + options: base, + }) +} |
