Commit 74cd30b811cc2fe4b376bc1c0fa2cf48810d5103

Authored by bellard
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 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
29 26  
30 27 #include "qemu.h"
31 28  
... ... @@ -35,12 +32,22 @@
35 32  
36 33 FILE *logfile = NULL;
37 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 37 #ifdef __i386__
41 38 /* Force usage of an ELF interpreter even if it is an ELF shared
42 39 object ! */
43 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 51 #endif
45 52  
46 53 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
... ... @@ -358,7 +365,7 @@ void usage(void)
358 365 DEBUG_LOGFILE,
359 366 interp_prefix,
360 367 x86_stack_size);
361   - exit(1);
  368 + _exit(1);
362 369 }
363 370  
364 371 /* XXX: currently only used for async signals (see signal.c) */
... ... @@ -379,12 +386,6 @@ int main(int argc, char **argv)
379 386 if (argc <= 1)
380 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 389 loglevel = 0;
389 390 optind = 1;
390 391 for(;;) {
... ... @@ -423,7 +424,7 @@ int main(int argc, char **argv)
423 424 logfile = fopen(DEBUG_LOGFILE, "w");
424 425 if (!logfile) {
425 426 perror(DEBUG_LOGFILE);
426   - exit(1);
  427 + _exit(1);
427 428 }
428 429 setvbuf(logfile, NULL, _IOLBF, 0);
429 430 }
... ... @@ -434,9 +435,12 @@ int main(int argc, char **argv)
434 435 /* Zero out image_info */
435 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 442 printf("Error loading %s\n", filename);
439   - exit(1);
  443 + _exit(1);
440 444 }
441 445  
442 446 if (loglevel) {
... ...