diff options
author | Alexander Graf <agraf@suse.de> | 2012-02-02 18:02:33 +0100 |
---|---|---|
committer | hyokeun <hyokeun.jeon@samsung.com> | 2016-09-06 15:55:32 +0900 |
commit | b52bb5365686c78fb8c0945eddcacc0da0efdb4a (patch) | |
tree | 91cf9806e641955374a73d112077944da4d1031d | |
parent | 6d51e4f117ee530d466855546169a0212cdf8ea4 (diff) | |
download | qemu-b52bb5365686c78fb8c0945eddcacc0da0efdb4a.tar.gz qemu-b52bb5365686c78fb8c0945eddcacc0da0efdb4a.tar.bz2 qemu-b52bb5365686c78fb8c0945eddcacc0da0efdb4a.zip |
linux-user: binfmt: support host binaries
When we have a working host binary equivalent for the guest binary we're
trying to run, let's just use that instead as it will be a lot faster.
Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r-- | linux-user/binfmt.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/linux-user/binfmt.c b/linux-user/binfmt.c index cd1f513b3..458f136fb 100644 --- a/linux-user/binfmt.c +++ b/linux-user/binfmt.c @@ -5,6 +5,9 @@ #include <string.h> #include <stdlib.h> +#ifdef __x86_64__ +#define ARCH_NAME "x86_64" +#endif int main(int argc, char **argv, char **envp) { @@ -28,6 +31,29 @@ int main(int argc, char **argv, char **envp) binfmt[0] = '\0'; /* Now argv[0] is the real qemu binary name */ +#ifdef ARCH_NAME + { + char *hostbin; + char *guestarch; + int r; + + guestarch = strrchr(argv[0], '-') ; + if (!guestarch) { + goto skip; + } + guestarch++; + r = asprintf(&hostbin, "/emul/" ARCH_NAME "-for-%s/%s", guestarch, argv[1]); + if ((r > 0) && !access(hostbin, X_OK)) { + /* + * We found a host binary replacement for the non-host binary. Let's + * use that instead! + */ + return execve(hostbin, &argv[2], envp); + } + } +skip: +#endif + new_argv = (char **)malloc((argc + 2) * sizeof(*new_argv)); if (argc > 3) { memcpy(&new_argv[4], &argv[3], (argc - 3) * sizeof(*new_argv)); |