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,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) {