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,10 +553,13 @@ static void set_brk(unsigned long start, unsigned long end)
553 /* We need to explicitly zero any fractional pages after the data 553 /* We need to explicitly zero any fractional pages after the data
554 section (i.e. bss). This would contain the junk from the file that 554 section (i.e. bss). This would contain the junk from the file that
555 should not be in memory. */ 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 unsigned long nbyte; 558 unsigned long nbyte;
559 559
  560 + if (elf_bss >= last_bss)
  561 + return;
  562 +
560 /* XXX: this is really a hack : if the real host page size is 563 /* XXX: this is really a hack : if the real host page size is
561 smaller than the target page size, some pages after the end 564 smaller than the target page size, some pages after the end
562 of the file may not be mapped. A better fix would be to 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,7 +801,7 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
798 * that there are zeromapped pages up to and including the last 801 * that there are zeromapped pages up to and including the last
799 * bss page. 802 * bss page.
800 */ 803 */
801 - padzero(elf_bss); 804 + padzero(elf_bss, last_bss);
802 elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */ 805 elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
803 806
804 /* Map the last of the bss segment */ 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,7 +1230,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1227 sections */ 1230 sections */
1228 set_brk(elf_bss, elf_brk); 1231 set_brk(elf_bss, elf_brk);
1229 1232
1230 - padzero(elf_bss); 1233 + padzero(elf_bss, elf_brk);
1231 1234
1232 #if 0 1235 #if 0
1233 printf("(start_brk) %x\n" , info->start_brk); 1236 printf("(start_brk) %x\n" , info->start_brk);