diff options
author | Mike Frysinger <vapier@gentoo.org> | 2011-12-07 13:18:29 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-07-03 14:27:45 -0400 |
commit | 106c4cb4b1dd814fc29c56269dc964d03dadde15 (patch) | |
tree | 4bbb6ea08ad20ba0a4013e88353cd02f8bf87984 /libsandbox/trace.c | |
parent | libsandbox: migrate to get/set regs interface for everyone (diff) | |
download | sandbox-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.c | 21 |
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 |