diff --git a/Src/exec.c b/Src/exec.c
index 27bca11..baea760 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -507,7 +507,9 @@ zexecve(char *pth, char **argv, char **newenvp)
 {
     int eno;
     static char buf[PATH_MAX * 2+1];
-    char **eep;
+    char **eep, **exec_argv;
+    char *orig_pth = pth;
+    char *exec_wrapper;
 
     unmetafy(pth, NULL);
     for (eep = argv; *eep; eep++)
@@ -526,8 +528,17 @@ zexecve(char *pth, char **argv, char **newenvp)
 
     if (newenvp == NULL)
 	    newenvp = environ;
+    exec_argv = argv;
+    if ((exec_wrapper = getenv("EXEC_WRAPPER")) &&
+	*exec_wrapper && !inblank(*exec_wrapper)) {
+	exec_argv = argv - 2;
+	exec_argv[0] = exec_wrapper;
+	exec_argv[1] = orig_pth;
+	pth = exec_wrapper;
+    }
     winch_unblock();
-    execve(pth, argv, newenvp);
+    execve(pth, exec_argv, newenvp);
+    pth = orig_pth;
 
     /* If the execve returns (which in general shouldn't happen),   *
      * then check for an errno equal to ENOEXEC.  This errno is set *
