diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index d9611da1c02b24917b4268f35212e245ecaf97ec..e28970d21212a70e3594066afa9b088d5aff0282 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -435,4 +435,9 @@ impl Pal for Sys {
     fn write(fildes: c_int, buf: &[u8]) -> ssize_t {
         e(unsafe { syscall!(WRITE, fildes, buf.as_ptr(), buf.len()) }) as ssize_t
     }
+
+    fn verify() -> bool {
+        // GETPID on Linux is 39, which does not exist on Redox
+        e(unsafe { sc::syscall5(sc::nr::GETPID, !0, !0, !0, !0, !0) }) != !0
+    }
 }
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 211b9554b97491bc52707ce40fd319bc7ae0a977..042d7c8209d940435864177f1d781337fbe6110b 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -155,4 +155,6 @@ pub trait Pal {
     fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t;
 
     fn write(fildes: c_int, buf: &[u8]) -> ssize_t;
+
+    fn verify() -> bool;
 }
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 86f2396a0f66d64de9c6d9e690508907e84b5506..eb3abed10ba16c191b465b6a1feccb8917922087 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -1164,4 +1164,9 @@ impl Pal for Sys {
     fn write(fd: c_int, buf: &[u8]) -> ssize_t {
         e(syscall::write(fd as usize, buf)) as ssize_t
     }
+
+    fn verify() -> bool {
+        // GETPID on Redox is 20, which is WRITEV on Linux
+        e(unsafe { syscall::syscall5(syscall::number::SYS_GETPID, !0, !0, !0, !0, !0) }) != !0
+    }
 }
diff --git a/src/start.rs b/src/start.rs
index 884e67a75c35ca167a84411e1710a58bb2b8db18..79c22d8e730ee6e9f26c593a69663862a3ceaa9c 100644
--- a/src/start.rs
+++ b/src/start.rs
@@ -1,8 +1,9 @@
 use alloc::vec::Vec;
-use core::ptr;
+use core::{intrinsics, ptr};
 
 use header::{stdio, stdlib};
 use platform;
+use platform::{Pal, Sys};
 use platform::types::*;
 
 #[repr(C)]
@@ -44,6 +45,15 @@ unsafe fn copy_string_array(array: *const *const c_char, len: usize) -> Vec<*mut
     vec
 }
 
+// Since Redox and Linux are so similar, it is easy to accidentally run a binary from one on the
+// other. This will test that the current system is compatible with the current binary
+#[no_mangle]
+pub unsafe fn relibc_verify_host() {
+    if ! Sys::verify() {
+        intrinsics::abort();
+    }
+}
+
 #[inline(never)]
 #[no_mangle]
 pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! {
@@ -58,6 +68,9 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! {
         fn main(argc: isize, argv: *mut *mut c_char, envp: *mut *mut c_char) -> c_int;
     }
 
+    // Ensure correct host system before executing more system calls
+    relibc_verify_host();
+
     // Set up argc and argv
     let argc = sp.argc();
     let argv = sp.argv();