+extern char **environ;
+
+static UNUSED int w_execl(const char *path, const char *arg, ...)
+{
+ // don't allow exec (for now)
+ strace("execl(%s, %s, ...) = ?\n", path, arg);
+ exit(1);
+}
+
+static UNUSED int w_execlp(const char *file, const char *arg, ...)
+{
+ strace("execlp(%s, %s, ...) = ?\n", file, arg);
+ exit(1);
+}
+
+static UNUSED int w_execle(const char *path, const char *arg, ...)
+{
+ strace("execle(%s, %s, ...) = ?\n", path, arg);
+ exit(1);
+}
+
+static UNUSED int w_execv(const char *path, char *const argv[])
+{
+ strace("execv(%s, %p) = ?\n", path, argv);
+ return emu_do_execve(path, argv, environ);
+}
+
+static UNUSED int w_execvp(const char *file, char *const argv[])
+{
+ strace("execvp(%s, %p) = ?\n", file, argv);
+ return emu_do_execve(file, argv, environ);
+}
+
+long w_execve_raw(const char *filename, char * const argv[],
+ char * const envp[])
+{
+ strace("execve(%s, %p, %p) = ?\n", filename, argv, envp);
+ return emu_do_execve(filename, argv, envp);
+}
+
+static UNUSED int w_execve(const char *filename, char * const argv[],
+ char * const envp[])
+{
+ long ret = w_execve_raw(filename, argv, envp);
+ return g_syscall_error(ret);
+}
+
+static int w_chdir(const char *path)
+{
+ long ret;
+
+ if (path != NULL && strstr(path, "/usr/gp2x") != NULL)
+ ret = 0;
+ else
+ ret = g_chdir_raw(path);
+
+ strace("chdir(%s) = %ld\n", path, ret);
+ return g_syscall_error(ret);
+}
+
+static ssize_t w_readlink(const char *path, char *buf, size_t bufsiz)
+{
+ long ret;
+
+#ifndef DL
+ if (path != NULL && strncmp(path, "/proc/", 6) == 0
+ && strcmp(strrchr(path, '/'), "/exe") == 0)
+ {
+ ret = snprintf(buf, bufsiz, "%s", bin_path);
+ if (ret > bufsiz)
+ ret = bufsiz;
+ }
+ else
+#endif
+ ret = g_readlink_raw(path, buf, bufsiz);
+
+ strace("readlink(%s, %s, %zd) = %ld\n", path, buf, bufsiz, ret);
+ return g_syscall_error(ret);
+}
+