aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2011-12-07 13:18:29 -0500
committerMike Frysinger <vapier@gentoo.org>2012-07-03 14:27:45 -0400
commit106c4cb4b1dd814fc29c56269dc964d03dadde15 (patch)
tree4bbb6ea08ad20ba0a4013e88353cd02f8bf87984 /libsandbox/trace.c
parentlibsandbox: migrate to get/set regs interface for everyone (diff)
downloadsandbox-106c4cb4b1dd814fc29c56269dc964d03dadde15.tar.gz
sandbox-106c4cb4b1dd814fc29c56269dc964d03dadde15.tar.bz2
sandbox-106c4cb4b1dd814fc29c56269dc964d03dadde15.zip
libsandbox: add x32 ABI supportv2.6
We can trace x32 when the host is x86_64 or x32, but x32 cannot trace x86_64 due to limitations in the kernel interface -- all pointers get truncated to 32bits. We'll have to add external ptrace helpers in the future to make this work, but for now, we'll just let x86_64 code run unchecked :(. URL: https://bugs.gentoo.org/394179 Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libsandbox/trace.c')
-rw-r--r--libsandbox/trace.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/libsandbox/trace.c b/libsandbox/trace.c
index f2071e0..ea769fd 100644
--- a/libsandbox/trace.c
+++ b/libsandbox/trace.c
@@ -11,6 +11,7 @@
static long _do_ptrace(enum __ptrace_request request, const char *srequest, void *addr, void *data);
#define do_ptrace(request, addr, data) _do_ptrace(request, #request, addr, data)
+#define _trace_possible(data) true
#ifdef DEBUG
# define SBDEBUG 1
@@ -485,6 +486,16 @@ void trace_main(const char *filename, char *const argv[])
#else
+#undef _trace_possible
+#define _trace_possible(data) false
+
+void trace_main(const char *filename, char *const argv[])
+{
+ /* trace_possible() triggers a warning for us */
+}
+
+#endif
+
static char *flatten_args(char *const argv[])
{
char *ret;
@@ -512,11 +523,13 @@ static char *flatten_args(char *const argv[])
return ret;
}
-void trace_main(const char *filename, char *const argv[])
+bool trace_possible(const char *filename, char *const argv[], const void *data)
{
+ if (_trace_possible(data))
+ return true;
+
char *args = flatten_args(argv);
- sb_eqawarn("Static ELF: %s: %s\n", filename, args);
+ sb_eqawarn("Unable to trace static ELF: %s: %s\n", filename, args);
free(args);
+ return false;
}
-
-#endif