Commit 644c433cb3759599aa1440b412964f8e49cc0b71
1 parent
d691f669
ld.so load fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@47 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
19 additions
and
8 deletions
README
| ... | ... | @@ -23,8 +23,12 @@ libraries installed on your PC. For example: |
| 23 | 23 | ./qemu -L / /bin/ls |
| 24 | 24 | |
| 25 | 25 | * On non x86 CPUs, you need first to download at least an x86 glibc |
| 26 | -(qemu-i386-glibc21.tar.gz on the qemu web page). Then you can launch | |
| 27 | -the precompiled 'ls' x86 executable: | |
| 26 | +(qemu-i386-glibc21.tar.gz on the qemu web page). Ensure that | |
| 27 | +LD_LIBRARY_PATH is not set: | |
| 28 | + | |
| 29 | + unset LD_LIBRARY_PATH | |
| 30 | + | |
| 31 | +Then you can launch the precompiled 'ls' x86 executable: | |
| 28 | 32 | |
| 29 | 33 | ./qemu /usr/local/qemu-i386/bin/ls |
| 30 | 34 | ... | ... |
linux-user/elfload.c
| ... | ... | @@ -360,9 +360,6 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, |
| 360 | 360 | put_user (tswapl(val), dlinfo++) |
| 361 | 361 | |
| 362 | 362 | if (exec) { /* Put this here for an ELF program interpreter */ |
| 363 | - struct elf_phdr * eppnt; | |
| 364 | - eppnt = (struct elf_phdr *)((unsigned long)exec->e_phoff); | |
| 365 | - | |
| 366 | 363 | NEW_AUX_ENT (AT_PHDR, (unsigned int)(load_addr + exec->e_phoff)); |
| 367 | 364 | NEW_AUX_ENT (AT_PHENT, (unsigned int)(sizeof (struct elf_phdr))); |
| 368 | 365 | NEW_AUX_ENT (AT_PHNUM, (unsigned int)(exec->e_phnum)); |
| ... | ... | @@ -418,6 +415,9 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, |
| 418 | 415 | */ |
| 419 | 416 | load_addr = INTERP_LOADADDR; |
| 420 | 417 | |
| 418 | +#ifdef BSWAP_NEEDED | |
| 419 | + bswap_ehdr(interp_elf_ex); | |
| 420 | +#endif | |
| 421 | 421 | /* First of all, some simple consistency checks */ |
| 422 | 422 | if ((interp_elf_ex->e_type != ET_EXEC && |
| 423 | 423 | interp_elf_ex->e_type != ET_DYN) || |
| ... | ... | @@ -425,6 +425,7 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, |
| 425 | 425 | return ~0UL; |
| 426 | 426 | } |
| 427 | 427 | |
| 428 | + | |
| 428 | 429 | /* Now read in all of the header information */ |
| 429 | 430 | |
| 430 | 431 | if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > X86_PAGE_SIZE) |
| ... | ... | @@ -452,7 +453,6 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, |
| 452 | 453 | (char *) elf_phdata, |
| 453 | 454 | sizeof(struct elf_phdr) * interp_elf_ex->e_phnum); |
| 454 | 455 | } |
| 455 | - | |
| 456 | 456 | if (retval < 0) { |
| 457 | 457 | perror("load_elf_interp"); |
| 458 | 458 | exit(-1); | ... | ... |
qemu-doc.texi
| ... | ... | @@ -92,8 +92,15 @@ qemu -L / /bin/ls |
| 92 | 92 | |
| 93 | 93 | |
| 94 | 94 | @item On non x86 CPUs, you need first to download at least an x86 glibc |
| 95 | -(@file{qemu-i386-glibc21.tar.gz} on the QEMU web page). Then you can | |
| 96 | -launch the precompiled @file{ls} x86 executable: | |
| 95 | +(@file{qemu-i386-glibc21.tar.gz} on the QEMU web page). Ensure that | |
| 96 | +@code{LD_LIBRARY_PATH} is not set: | |
| 97 | + | |
| 98 | +@example | |
| 99 | +unset LD_LIBRARY_PATH | |
| 100 | +@end example | |
| 101 | + | |
| 102 | +Then you can launch the precompiled @file{ls} x86 executable: | |
| 103 | + | |
| 97 | 104 | @example |
| 98 | 105 | qemu /usr/local/qemu-i386/bin/ls |
| 99 | 106 | @end example | ... | ... |