Commit 74cd30b811cc2fe4b376bc1c0fa2cf48810d5103
1 parent
7fb9a24e
RH9 fix - path patch
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@93 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
18 additions
and
14 deletions
linux-user/main.c
| @@ -23,9 +23,6 @@ | @@ -23,9 +23,6 @@ | ||
| 23 | #include <string.h> | 23 | #include <string.h> |
| 24 | #include <errno.h> | 24 | #include <errno.h> |
| 25 | #include <unistd.h> | 25 | #include <unistd.h> |
| 26 | -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) | ||
| 27 | -#include <sys/personality.h> | ||
| 28 | -#endif | ||
| 29 | 26 | ||
| 30 | #include "qemu.h" | 27 | #include "qemu.h" |
| 31 | 28 | ||
| @@ -35,12 +32,22 @@ | @@ -35,12 +32,22 @@ | ||
| 35 | 32 | ||
| 36 | FILE *logfile = NULL; | 33 | FILE *logfile = NULL; |
| 37 | int loglevel; | 34 | int loglevel; |
| 38 | -const char *interp_prefix = CONFIG_QEMU_PREFIX "/qemu-i386"; | 35 | +static const char *interp_prefix = CONFIG_QEMU_PREFIX; |
| 39 | 36 | ||
| 40 | #ifdef __i386__ | 37 | #ifdef __i386__ |
| 41 | /* Force usage of an ELF interpreter even if it is an ELF shared | 38 | /* Force usage of an ELF interpreter even if it is an ELF shared |
| 42 | object ! */ | 39 | object ! */ |
| 43 | const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; | 40 | const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; |
| 41 | + | ||
| 42 | +/* for recent libc, we add these dummies symbol which are not declared | ||
| 43 | + when generating a linked object (bug in ld ?) */ | ||
| 44 | +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) | ||
| 45 | +long __init_array_start[0]; | ||
| 46 | +long __init_array_end[0]; | ||
| 47 | +long __fini_array_start[0]; | ||
| 48 | +long __fini_array_end[0]; | ||
| 49 | +#endif | ||
| 50 | + | ||
| 44 | #endif | 51 | #endif |
| 45 | 52 | ||
| 46 | /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so | 53 | /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so |
| @@ -358,7 +365,7 @@ void usage(void) | @@ -358,7 +365,7 @@ void usage(void) | ||
| 358 | DEBUG_LOGFILE, | 365 | DEBUG_LOGFILE, |
| 359 | interp_prefix, | 366 | interp_prefix, |
| 360 | x86_stack_size); | 367 | x86_stack_size); |
| 361 | - exit(1); | 368 | + _exit(1); |
| 362 | } | 369 | } |
| 363 | 370 | ||
| 364 | /* XXX: currently only used for async signals (see signal.c) */ | 371 | /* XXX: currently only used for async signals (see signal.c) */ |
| @@ -379,12 +386,6 @@ int main(int argc, char **argv) | @@ -379,12 +386,6 @@ int main(int argc, char **argv) | ||
| 379 | if (argc <= 1) | 386 | if (argc <= 1) |
| 380 | usage(); | 387 | usage(); |
| 381 | 388 | ||
| 382 | - /* Set personality to X86_LINUX. May fail on unpatched kernels: | ||
| 383 | - if so, they need to have munged paths themselves (eg. chroot, | ||
| 384 | - hacked ld.so, whatever). */ | ||
| 385 | - if (personality(0x11) >= 0) | ||
| 386 | - interp_prefix = ""; | ||
| 387 | - | ||
| 388 | loglevel = 0; | 389 | loglevel = 0; |
| 389 | optind = 1; | 390 | optind = 1; |
| 390 | for(;;) { | 391 | for(;;) { |
| @@ -423,7 +424,7 @@ int main(int argc, char **argv) | @@ -423,7 +424,7 @@ int main(int argc, char **argv) | ||
| 423 | logfile = fopen(DEBUG_LOGFILE, "w"); | 424 | logfile = fopen(DEBUG_LOGFILE, "w"); |
| 424 | if (!logfile) { | 425 | if (!logfile) { |
| 425 | perror(DEBUG_LOGFILE); | 426 | perror(DEBUG_LOGFILE); |
| 426 | - exit(1); | 427 | + _exit(1); |
| 427 | } | 428 | } |
| 428 | setvbuf(logfile, NULL, _IOLBF, 0); | 429 | setvbuf(logfile, NULL, _IOLBF, 0); |
| 429 | } | 430 | } |
| @@ -434,9 +435,12 @@ int main(int argc, char **argv) | @@ -434,9 +435,12 @@ int main(int argc, char **argv) | ||
| 434 | /* Zero out image_info */ | 435 | /* Zero out image_info */ |
| 435 | memset(info, 0, sizeof(struct image_info)); | 436 | memset(info, 0, sizeof(struct image_info)); |
| 436 | 437 | ||
| 437 | - if(elf_exec(interp_prefix, filename, argv+optind, environ, regs, info) != 0) { | 438 | + /* Scan interp_prefix dir for replacement files. */ |
| 439 | + init_paths(interp_prefix); | ||
| 440 | + | ||
| 441 | + if (elf_exec(filename, argv+optind, environ, regs, info) != 0) { | ||
| 438 | printf("Error loading %s\n", filename); | 442 | printf("Error loading %s\n", filename); |
| 439 | - exit(1); | 443 | + _exit(1); |
| 440 | } | 444 | } |
| 441 | 445 | ||
| 442 | if (loglevel) { | 446 | if (loglevel) { |