aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-04-07 21:31:06 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-04-07 21:31:06 +0000
commitf801f97e049b3cd832f50b9743184d0e87155193 (patch)
tree57e76c94cfa2680af6215ce2c962f69ddc4b4e9e
parentf48c3dd51a0013850abe119353f6717978a4aac4 (diff)
personality fix - i386 interpreter fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@73 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--linux-user/main.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/linux-user/main.c b/linux-user/main.c
index 5acfdde41f..d7c68a9cd1 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -23,6 +23,9 @@
#include <string.h>
#include <errno.h>
#include <unistd.h>
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)
+#include <sys/personality.h>
+#endif
#include "qemu.h"
@@ -34,6 +37,12 @@ FILE *logfile = NULL;
int loglevel;
const char *interp_prefix = CONFIG_QEMU_PREFIX "/qemu-i386";
+#ifdef __i386__
+/* Force usage of an ELF interpreter even if it is an ELF shared
+ object ! */
+const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
+#endif
+
/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
we allocate a bigger stack. Need a better solution, for example
by remapping the process stack directly at the right place */
@@ -370,6 +379,13 @@ int main(int argc, char **argv)
if (argc <= 1)
usage();
+
+ /* Set personality to X86_LINUX. May fail on unpatched kernels:
+ if so, they need to have munged paths themselves (eg. chroot,
+ hacked ld.so, whatever). */
+ if (personality(0x11) >= 0)
+ interp_prefix = "";
+
loglevel = 0;
optind = 1;
for(;;) {