Enable static-pie for the x86_64-unknown-linux-musl target
Fixes: https://github.com/rust-lang/rust/issues/70693
This commit is contained in:
parent
4fb54ed484
commit
d3ca6fd71e
3 changed files with 59 additions and 0 deletions
|
|
@ -6,6 +6,7 @@ pub fn target() -> TargetResult {
|
|||
base.max_atomic_width = Some(64);
|
||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||
base.stack_probes = true;
|
||||
base.static_position_independent_executables = true;
|
||||
|
||||
Ok(Target {
|
||||
llvm_target: "x86_64-unknown-linux-musl".to_string(),
|
||||
|
|
|
|||
15
src/test/run-make/static-pie/Makefile
Normal file
15
src/test/run-make/static-pie/Makefile
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
-include ../../run-make-fulldeps/tools.mk
|
||||
|
||||
# only-x86_64-unknown-linux-musl
|
||||
|
||||
# How to manually run this
|
||||
# $ ./x.py test --target x86_64-unknown-linux-musl src/test/run-make/static-pie
|
||||
|
||||
all:
|
||||
$(RUSTC) --target $(TARGET) -C target-feature=+crt-static test-aslr.rs
|
||||
# Check that no dynamic interpreter is set
|
||||
! readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) INTERP
|
||||
# Check that we have a dynamic executable
|
||||
readelf -l $(call RUN_BINFILE,test-aslr) | $(CGREP) DYNAMIC
|
||||
# Check for address space layout randomization
|
||||
$(call RUN,test-aslr) --test-aslr
|
||||
43
src/test/run-make/static-pie/test-aslr.rs
Normal file
43
src/test/run-make/static-pie/test-aslr.rs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
const NUM_RUNS: usize = 10;
|
||||
|
||||
fn run_self(exe: &str) -> usize {
|
||||
use std::process::Command;
|
||||
let mut set = std::collections::HashSet::new();
|
||||
|
||||
let mut cmd = Command::new(exe);
|
||||
cmd.arg("--report");
|
||||
(0..NUM_RUNS).for_each(|_| {
|
||||
set.insert(cmd.output().expect("failed to execute process").stdout);
|
||||
});
|
||||
set.len()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut args = std::env::args();
|
||||
let arg0 = args.next().unwrap();
|
||||
match args.next() {
|
||||
Some(s) if s.eq("--report") => {
|
||||
println!("main = {:#?}", &main as *const _);
|
||||
}
|
||||
Some(s) if s.eq("--test-no-aslr") => {
|
||||
let cnt = run_self(&arg0);
|
||||
if cnt != 1 {
|
||||
eprintln!("FAIL: {} most likely ASLR", arg0);
|
||||
std::process::exit(1);
|
||||
}
|
||||
println!("PASS: {} does no ASLR", arg0);
|
||||
}
|
||||
Some(s) if s.eq("--test-aslr") => {
|
||||
let cnt = run_self(&arg0);
|
||||
if cnt != NUM_RUNS {
|
||||
eprintln!("FAIL: {} most likely no ASLR", arg0);
|
||||
std::process::exit(1);
|
||||
}
|
||||
println!("PASS: {} does ASLR", arg0);
|
||||
}
|
||||
Some(_) | None => {
|
||||
println!("Usage: {} --test-no-aslr | --test-aslr", arg0);
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue