Commit f801f97e049b3cd832f50b9743184d0e87155193
1 parent
f48c3dd5
personality fix - i386 interpreter fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@73 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
16 additions
and
0 deletions
linux-user/main.c
| ... | ... | @@ -23,6 +23,9 @@ |
| 23 | 23 | #include <string.h> |
| 24 | 24 | #include <errno.h> |
| 25 | 25 | #include <unistd.h> |
| 26 | +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) | |
| 27 | +#include <sys/personality.h> | |
| 28 | +#endif | |
| 26 | 29 | |
| 27 | 30 | #include "qemu.h" |
| 28 | 31 | |
| ... | ... | @@ -34,6 +37,12 @@ FILE *logfile = NULL; |
| 34 | 37 | int loglevel; |
| 35 | 38 | const char *interp_prefix = CONFIG_QEMU_PREFIX "/qemu-i386"; |
| 36 | 39 | |
| 40 | +#ifdef __i386__ | |
| 41 | +/* Force usage of an ELF interpreter even if it is an ELF shared | |
| 42 | + object ! */ | |
| 43 | +const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; | |
| 44 | +#endif | |
| 45 | + | |
| 37 | 46 | /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so |
| 38 | 47 | we allocate a bigger stack. Need a better solution, for example |
| 39 | 48 | by remapping the process stack directly at the right place */ |
| ... | ... | @@ -370,6 +379,13 @@ int main(int argc, char **argv) |
| 370 | 379 | |
| 371 | 380 | if (argc <= 1) |
| 372 | 381 | usage(); |
| 382 | + | |
| 383 | + /* Set personality to X86_LINUX. May fail on unpatched kernels: | |
| 384 | + if so, they need to have munged paths themselves (eg. chroot, | |
| 385 | + hacked ld.so, whatever). */ | |
| 386 | + if (personality(0x11) >= 0) | |
| 387 | + interp_prefix = ""; | |
| 388 | + | |
| 373 | 389 | loglevel = 0; |
| 374 | 390 | optind = 1; |
| 375 | 391 | for(;;) { | ... | ... |