#define _GNU_SOURCE
#include <stddef.h>
#include <sys/ptrace.h>
+#include <sys/types.h>
#include <sys/user.h>
#include <sys/wait.h>
-#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
# define EF_REG2 8
# endif
#define reg_syscall_nr (EF_REG2 / 4)
+#elif defined(__arm__)
+#define reg_syscall_nr _offsetof(struct user, regs.uregs[7])
#else
#error tracing is not supported on this architecture
#endif
} while (0)
#define ERROR(fmt, ...) do { \
- syslog(0, "utrace: "fmt, ## __VA_ARGS__); \
+ syslog(LOG_ERR, "utrace: "fmt, ## __VA_ARGS__); \
fprintf(stderr, "utrace: "fmt, ## __VA_ARGS__); \
} while (0)
if (child == 0) {
char **_argv = calloc(argc + 1, sizeof(char *));
char **_envp;
- char preload[] = "LD_PRELOAD=/lib/libpreload-trace.so";
+ char *preload = "LD_PRELOAD=/lib/libpreload-trace.so";
int envc = 1;
int ret;
;
_envp = calloc(envc, sizeof(char *));
- memcpy(&_envp[1], _envp, envc * sizeof(char *));
- *envp = preload;
+ memcpy(&_envp[1], envp, envc * sizeof(char *));
+ *_envp = preload;
- ret = execve(_argv[0], _argv, envp);
+ ret = execve(_argv[0], _argv, _envp);
ERROR("failed to exec %s: %s\n", _argv[0], strerror(errno));
+
+ free(_argv);
+ free(_envp);
return ret;
}