Commit 768a4a36a444ef5aef1f103adf42553eadfe4614

Authored by ths
1 parent 0d3267a7

Fix userland ELF loader for zero sized BSS.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2244 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 6 additions and 3 deletions
linux-user/elfload.c
... ... @@ -553,10 +553,13 @@ static void set_brk(unsigned long start, unsigned long end)
553 553 /* We need to explicitly zero any fractional pages after the data
554 554 section (i.e. bss). This would contain the junk from the file that
555 555 should not be in memory. */
556   -static void padzero(unsigned long elf_bss)
  556 +static void padzero(unsigned long elf_bss, unsigned long last_bss)
557 557 {
558 558 unsigned long nbyte;
559 559  
  560 + if (elf_bss >= last_bss)
  561 + return;
  562 +
560 563 /* XXX: this is really a hack : if the real host page size is
561 564 smaller than the target page size, some pages after the end
562 565 of the file may not be mapped. A better fix would be to
... ... @@ -798,7 +801,7 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
798 801 * that there are zeromapped pages up to and including the last
799 802 * bss page.
800 803 */
801   - padzero(elf_bss);
  804 + padzero(elf_bss, last_bss);
802 805 elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
803 806  
804 807 /* Map the last of the bss segment */
... ... @@ -1227,7 +1230,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1227 1230 sections */
1228 1231 set_brk(elf_bss, elf_brk);
1229 1232  
1230   - padzero(elf_bss);
  1233 + padzero(elf_bss, elf_brk);
1231 1234  
1232 1235 #if 0
1233 1236 printf("(start_brk) %x\n" , info->start_brk);
... ...