Skip to content

Commit

Permalink
Enable static-pie for the x86_64-unknown-linux-musl target
Browse files Browse the repository at this point in the history
Fixes: #70693
  • Loading branch information
haraldh committed Jun 15, 2020
1 parent 4fb54ed commit d3ca6fd
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/librustc_target/spec/x86_64_unknown_linux_musl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
15 changes: 15 additions & 0 deletions src/test/run-make/static-pie/Makefile
Original file line number Diff line number Diff line change
@@ -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 changes: 43 additions & 0 deletions src/test/run-make/static-pie/test-aslr.rs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}

0 comments on commit d3ca6fd

Please sign in to comment.