diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index 8b012aaa08af3af1f4dd8841033ba6adafb42751..4e709fb6786d9c45ea11593418722356ff4e8c24 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -688,9 +688,9 @@ fn exec_noreturn(
                 context.tls = Some(tls);
             }
 
-            // Push arguments
+            // Push arguments and variables
             let mut arg_size = 0;
-            for arg in args.iter().rev() {
+            for arg in vars.iter().rev().chain(args.iter().rev()) {
                 sp -= mem::size_of::<usize>();
                 unsafe { *(sp as *mut usize) = ::USER_ARG_OFFSET + arg_size; }
 
@@ -709,7 +709,7 @@ fn exec_noreturn(
                 );
 
                 let mut arg_offset = 0;
-                for arg in args.iter().rev() {
+                for arg in vars.iter().rev().chain(args.iter().rev()) {
                     unsafe {
                         intrinsics::copy(arg.as_ptr(),
                                (::USER_ARG_OFFSET + arg_offset) as *mut u8,