about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohannes Löthberg <johannes@kyriasis.com>2017-07-14 22:06:36 +0200
committerJohannes Löthberg <johannes@kyriasis.com>2017-07-14 22:19:20 +0200
commitecf3f6d4def2b2aa4b268ed50a7799ce40423bc0 (patch)
tree86ee2d1b6295180424345ffed9a87d0d4b8fb8df
parent94b9cc90fb72e6be42b14559c586e3490385d045 (diff)
Make partial RELRO default on ppc64 due to segfault
On at least RHEL6 there is a segfault caused by the older ld.so version
when BIND_NOW is used, so use partial RELRO by default on ppc64
architectures for now.

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
-rw-r--r--src/librustc_back/target/powerpc64_unknown_linux_gnu.rs6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/librustc_back/target/powerpc64_unknown_linux_gnu.rs b/src/librustc_back/target/powerpc64_unknown_linux_gnu.rs
index 718a79a685e..7b038ac0073 100644
--- a/src/librustc_back/target/powerpc64_unknown_linux_gnu.rs
+++ b/src/librustc_back/target/powerpc64_unknown_linux_gnu.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 use LinkerFlavor;
-use target::{Target, TargetResult};
+use target::{Target, TargetResult, RelroLevel};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_base::opts();
@@ -17,6 +17,10 @@ pub fn target() -> TargetResult {
     base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
     base.max_atomic_width = Some(64);
 
+    // ld.so in at least RHEL6 on ppc64 has a bug related to BIND_NOW, so only enable partial RELRO
+    // for now. https://github.com/rust-lang/rust/pull/43170#issuecomment-315411474
+    base.relro_level = RelroLevel::Partial;
+
     // see #36994
     base.exe_allocation_crate = None;