OSDN Git Service

personality fix - i386 interpreter fix
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 7 Apr 2003 21:31:06 +0000 (21:31 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 7 Apr 2003 21:31:06 +0000 (21:31 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@73 c046a42c-6fe2-441c-8c8c-71466251a162

linux-user/main.c

index 5acfdde..d7c68a9 100644 (file)
@@ -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(;;) {