-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This adds a target specification for Linux kernel modules on x86_64, as well as base code that can be shared with other architectures.
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -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, | ||||||||||||||||||||||||||||||||||||||||||||||||||
This comment has been minimized.
Sorry, something went wrong. |
||||||||||||||||||||||||||||||||||||||||||||||||||
vec!["-Wl,--as-needed".to_string(), "-Wl,-z,noexecstack".to_string()], | ||||||||||||||||||||||||||||||||||||||||||||||||||
This comment has been minimized.
Sorry, something went wrong.
joshtriplett
Member
|
||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
TargetOptions { | ||||||||||||||||||||||||||||||||||||||||||||||||||
disable_redzone: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||
panic_strategy: PanicStrategy::Abort, | ||||||||||||||||||||||||||||||||||||||||||||||||||
stack_probes: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||
eliminate_frame_pointer: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||
linker_is_gnu: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||
position_independent_executables: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||
This comment has been minimized.
Sorry, something went wrong.
joshtriplett
Member
|
let mut position_independent_executable = false; | |
if t.options.position_independent_executables { | |
let empty_vec = Vec::new(); | |
let args = sess.opts.cg.link_args.as_ref().unwrap_or(&empty_vec); | |
let more_args = &sess.opts.cg.link_arg; | |
let mut args = args.iter().chain(more_args.iter()).chain(used_link_args.iter()); | |
if is_pic(sess) && !sess.crt_static() && !args.any(|x| *x == "-static") { | |
position_independent_executable = true; | |
} | |
} | |
if position_independent_executable { | |
cmd.position_independent_executable(); | |
} else { | |
// recent versions of gcc can be configured to generate position | |
// independent executables by default. We have to pass -no-pie to | |
// explicitly turn that off. Not applicable to ld. | |
if sess.target.target.options.linker_is_gnu | |
&& flavor != LinkerFlavor::Ld { | |
cmd.no_position_independent_executable(); | |
} | |
} |
The brute-force way would be to have two different targets, but that seems excessive. The other option would be to expose a new compiler option to override the PIE setting from the target.
This comment has been minimized.
This comment has been minimized.
Sorry, something went wrong.
joshtriplett
Sep 1, 2019
Member
It's not critical, just something to work on in parallel to make such an option available.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" | ||
This comment has been minimized.
Sorry, something went wrong.
joshtriplett
Member
|
||
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, | ||
}) | ||
} |
This will eventually need flexibility, to allow linking with lld, when the kernel supports that.