diff --git a/Cargo.lock b/Cargo.lock
index 2dbd6be7ed231ce015de7444913b34acc02d218d..07f1b0718bc127307d07a1e92848a89a58473d7e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -361,7 +361,13 @@ dependencies = [
 ]
 
 [[package]]
-name = "redox-exec"
+name = "redox-path"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7"
+
+[[package]]
+name = "redox-rt"
 version = "0.1.0"
 dependencies = [
  "goblin",
@@ -369,12 +375,6 @@ dependencies = [
  "redox_syscall",
 ]
 
-[[package]]
-name = "redox-path"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7"
-
 [[package]]
 name = "redox_event"
 version = "0.4.0"
@@ -415,8 +415,8 @@ dependencies = [
  "rand",
  "rand_jitter",
  "rand_xorshift",
- "redox-exec",
  "redox-path",
+ "redox-rt",
  "redox_event",
  "redox_syscall",
  "sc",
diff --git a/Cargo.toml b/Cargo.toml
index 49e6a5bd5841012b0798d1646b92365d6b8c292f..6eb6c4a9903830f7288847855c4c491018d44b87 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@ members = [
     "src/crt0",
     "src/crti",
     "src/crtn",
-    "src/platform/redox/redox-exec",
+    "redox-rt",
     "ld_so",
 ]
 exclude = ["tests", "dlmalloc-rs"]
@@ -59,7 +59,7 @@ sc = "0.2.3"
 
 [target.'cfg(target_os = "redox")'.dependencies]
 redox_syscall = "0.5.1"
-redox-exec = { path = "src/platform/redox/redox-exec" }
+redox-rt = { path = "redox-rt" }
 redox-path = "0.2"
 redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git", default-features = false, features = ["redox_syscall"] }
 
diff --git a/src/platform/redox/redox-exec/Cargo.toml b/redox-rt/Cargo.toml
similarity index 83%
rename from src/platform/redox/redox-exec/Cargo.toml
rename to redox-rt/Cargo.toml
index 18212a34572db3a40b36e2ea80406ae5d65fc488..56cecb9b3d2c4e3e750a82b9fdf2eb5960a059f2 100644
--- a/src/platform/redox/redox-exec/Cargo.toml
+++ b/redox-rt/Cargo.toml
@@ -1,9 +1,10 @@
 [package]
-name = "redox-exec"
+name = "redox-rt"
 authors = ["4lDO2 <4lDO2@protonmail.com>"]
 version = "0.1.0"
 edition = "2021"
 license = "MIT"
+description = "Libc-independent runtime for Redox"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
diff --git a/src/platform/redox/redox-exec/src/arch/aarch64.rs b/redox-rt/src/arch/aarch64.rs
similarity index 100%
rename from src/platform/redox/redox-exec/src/arch/aarch64.rs
rename to redox-rt/src/arch/aarch64.rs
diff --git a/src/platform/redox/redox-exec/src/arch/mod.rs b/redox-rt/src/arch/mod.rs
similarity index 100%
rename from src/platform/redox/redox-exec/src/arch/mod.rs
rename to redox-rt/src/arch/mod.rs
diff --git a/src/platform/redox/redox-exec/src/arch/x86.rs b/redox-rt/src/arch/x86.rs
similarity index 100%
rename from src/platform/redox/redox-exec/src/arch/x86.rs
rename to redox-rt/src/arch/x86.rs
diff --git a/src/platform/redox/redox-exec/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs
similarity index 98%
rename from src/platform/redox/redox-exec/src/arch/x86_64.rs
rename to redox-rt/src/arch/x86_64.rs
index 17aef4568134fac53d2b35be8368efad7920d928..00bb7253b678f2b2c241ff87c30e8a38c6212f39 100644
--- a/src/platform/redox/redox-exec/src/arch/x86_64.rs
+++ b/redox-rt/src/arch/x86_64.rs
@@ -1,6 +1,6 @@
 use syscall::error::*;
 
-use crate::{fork_inner, FdGuard};
+use crate::proc::{fork_inner, FdGuard};
 
 // Setup a stack starting from the very end of the address space, and then growing downwards.
 pub(crate) const STACK_TOP: usize = 1 << 47;
diff --git a/redox-rt/src/lib.rs b/redox-rt/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..2bf6f31e70c1467ed918ad3fdc62e72a258896af
--- /dev/null
+++ b/redox-rt/src/lib.rs
@@ -0,0 +1,12 @@
+#![no_std]
+#![feature(array_chunks, int_roundings, let_chains, slice_ptr_get)]
+#![forbid(unreachable_patterns)]
+
+extern crate alloc;
+
+pub mod arch;
+pub mod proc;
+
+// TODO: Replace auxvs with a non-stack-based interface, but keep getauxval for compatibility
+#[path = "../../src/platform/auxv_defs.rs"]
+pub mod auxv_defs;
diff --git a/src/platform/redox/redox-exec/src/lib.rs b/redox-rt/src/proc.rs
similarity index 99%
rename from src/platform/redox/redox-exec/src/lib.rs
rename to redox-rt/src/proc.rs
index 17f4a645885a5b91a2938e4cd6dbe820990a5bee..c6a820740cbc3fe50287398529d4e64e52a925d6 100644
--- a/src/platform/redox/redox-exec/src/lib.rs
+++ b/redox-rt/src/proc.rs
@@ -1,10 +1,5 @@
-#![no_std]
-#![feature(array_chunks, int_roundings, let_chains, slice_ptr_get)]
-#![forbid(unreachable_patterns)]
-
-extern crate alloc;
-
 use core::mem::size_of;
+use crate::{arch::*, auxv_defs::*};
 
 use alloc::{boxed::Box, collections::BTreeMap, vec};
 
@@ -27,9 +22,6 @@ use syscall::{
     PAGE_SIZE, PROT_EXEC, PROT_READ, PROT_WRITE,
 };
 
-pub use self::arch::*;
-mod arch;
-
 pub enum FexecResult {
     Normal {
         addrspace_handle: FdGuard,
@@ -713,11 +705,6 @@ pub fn create_set_addr_space_buf(
     buf
 }
 
-#[path = "../../../auxv_defs.rs"]
-pub mod auxv_defs;
-
-use auxv_defs::*;
-
 /// Spawns a new context which will not share the same address space as the current one. File
 /// descriptors from other schemes are reobtained with `dup`, and grants referencing such file
 /// descriptors are reobtained through `fmap`. Other mappings are kept but duplicated using CoW.
@@ -732,7 +719,7 @@ pub fn fork_impl() -> Result<usize> {
     Ok(pid)
 }
 
-fn fork_inner(initial_rsp: *mut usize) -> Result<usize> {
+pub fn fork_inner(initial_rsp: *mut usize) -> Result<usize> {
     let (cur_filetable_fd, new_pid_fd, new_pid);
 
     {
diff --git a/src/platform/mod.rs b/src/platform/mod.rs
index 9a5fbaa01e45ac47e4006b8c37397eed251162eb..f523842108253b0d2987d4d9dc971a444ddf914d 100644
--- a/src/platform/mod.rs
+++ b/src/platform/mod.rs
@@ -33,7 +33,7 @@ pub mod rlb;
 pub mod auxv_defs;
 
 #[cfg(target_os = "redox")]
-pub use redox_exec::auxv_defs;
+pub use redox_rt::auxv_defs;
 
 use self::types::*;
 pub mod types;
diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs
index 336c0937cf7e2eedb60790373ccad1f482132b70..408e117e8ce1950c45fed19c4f6a195185f7ddb4 100644
--- a/src/platform/redox/clone.rs
+++ b/src/platform/redox/clone.rs
@@ -10,11 +10,11 @@ use syscall::{
 use crate::sync::rwlock::Rwlock;
 
 use super::{
-    extra::{create_set_addr_space_buf, FdGuard},
+    extra::FdGuard,
     signal::sighandler_function,
 };
 
-pub use redox_exec::*;
+pub use redox_rt::proc::*;
 
 static CLONE_LOCK: Rwlock = Rwlock::new(crate::pthread::Pshared::Private);
 
diff --git a/src/platform/redox/exec.rs b/src/platform/redox/exec.rs
index 4323242cadf480410e452ac69d925b9ffe8b5361..56f3093a408dec3410d8605c93c18bdb17231f26 100644
--- a/src/platform/redox/exec.rs
+++ b/src/platform/redox/exec.rs
@@ -9,7 +9,7 @@ use crate::{
     },
 };
 
-use redox_exec::{ExtraInfo, FdGuard, FexecResult};
+use redox_rt::proc::{ExtraInfo, FdGuard, FexecResult, InterpOverride};
 use syscall::{data::Stat, error::*, flag::*};
 
 fn fexec_impl(
@@ -20,11 +20,11 @@ fn fexec_impl(
     envs: &[&[u8]],
     total_args_envs_size: usize,
     extrainfo: &ExtraInfo,
-    interp_override: Option<redox_exec::InterpOverride>,
+    interp_override: Option<InterpOverride>,
 ) -> Result<usize> {
     let memory = FdGuard::new(syscall::open("memory:", 0)?);
 
-    let addrspace_selection_fd = match redox_exec::fexec_impl(
+    let addrspace_selection_fd = match redox_rt::proc::fexec_impl(
         exec_file,
         open_via_dup,
         &memory,
@@ -88,7 +88,7 @@ pub enum Executable<'a> {
 pub fn execve(
     exec: Executable<'_>,
     arg_env: ArgEnv,
-    interp_override: Option<redox_exec::InterpOverride>,
+    interp_override: Option<InterpOverride>,
 ) -> Result<usize> {
     // NOTE: We must omit O_CLOEXEC and close manually, otherwise it will be closed before we
     // have even read it!
diff --git a/src/platform/redox/extra.rs b/src/platform/redox/extra.rs
index 5dd09c274cc7e3ed56fa88eddc47d57b2ddca355..3c96933cddb71c456c94c146fedc7c908123dcdb 100644
--- a/src/platform/redox/extra.rs
+++ b/src/platform/redox/extra.rs
@@ -3,7 +3,7 @@ use core::{ptr, slice};
 use crate::platform::{sys::e, types::*};
 use syscall::{error::*, F_SETFD, F_SETFL};
 
-pub use redox_exec::*;
+pub use redox_rt::proc::FdGuard;
 
 #[no_mangle]
 pub unsafe extern "C" fn redox_fpath(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t {
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 079031c28be96930eb1271699c8c2b6533de01bd..dae77e6d433bce81e8ec146d245e3e06ceff9967 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -27,7 +27,7 @@ use crate::{
     pthread::{self, Errno, ResultExt},
 };
 
-pub use redox_exec::FdGuard;
+pub use redox_rt::proc::FdGuard;
 
 use super::{types::*, Pal, Read, ERRNO};