Commit 2a1094cd88afa69c0e7ecd1e81c712cc8f635153

Authored by pbrook
1 parent 080a0ba4

bFLT loader alignment fix.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2669 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 8 deletions
linux-user/flatload.c
@@ -393,6 +393,7 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -393,6 +393,7 @@ static int load_flat_file(struct linux_binprm * bprm,
393 int i, rev, relocs = 0; 393 int i, rev, relocs = 0;
394 target_ulong fpos; 394 target_ulong fpos;
395 target_ulong start_code, end_code; 395 target_ulong start_code, end_code;
  396 + target_ulong indx_len;
396 397
397 hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */ 398 hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */
398 399
@@ -443,6 +444,11 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -443,6 +444,11 @@ static int load_flat_file(struct linux_binprm * bprm,
443 if (extra < bss_len + stack_len) 444 if (extra < bss_len + stack_len)
444 extra = bss_len + stack_len; 445 extra = bss_len + stack_len;
445 446
  447 + /* Add space for library base pointers. Make sure this does not
  448 + misalign the doesn't misalign the data segment. */
  449 + indx_len = MAX_SHARED_LIBS * sizeof(target_ulong);
  450 + indx_len = (indx_len + 15) & ~(target_ulong)15;
  451 +
446 /* 452 /*
447 * there are a couple of cases here, the separate code/data 453 * there are a couple of cases here, the separate code/data
448 * case, and then the fully copied to RAM case which lumps 454 * case, and then the fully copied to RAM case which lumps
@@ -462,8 +468,7 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -462,8 +468,7 @@ static int load_flat_file(struct linux_binprm * bprm,
462 return -1; 468 return -1;
463 } 469 }
464 470
465 - realdatastart = target_mmap(0, data_len + extra +  
466 - MAX_SHARED_LIBS * sizeof(target_ulong), 471 + realdatastart = target_mmap(0, data_len + extra + indx_len,
467 PROT_READ|PROT_WRITE|PROT_EXEC, 472 PROT_READ|PROT_WRITE|PROT_EXEC,
468 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 473 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
469 474
@@ -471,7 +476,7 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -471,7 +476,7 @@ static int load_flat_file(struct linux_binprm * bprm,
471 fprintf(stderr, "Unable to allocate RAM for process data\n"); 476 fprintf(stderr, "Unable to allocate RAM for process data\n");
472 return realdatastart; 477 return realdatastart;
473 } 478 }
474 - datapos = realdatastart + MAX_SHARED_LIBS * sizeof(target_ulong); 479 + datapos = realdatastart + indx_len;
475 480
476 DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n", 481 DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n",
477 (int)(data_len + bss_len + stack_len), (int)datapos); 482 (int)(data_len + bss_len + stack_len), (int)datapos);
@@ -498,8 +503,7 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -498,8 +503,7 @@ static int load_flat_file(struct linux_binprm * bprm,
498 503
499 } else { 504 } else {
500 505
501 - textpos = target_mmap(0, text_len + data_len + extra +  
502 - MAX_SHARED_LIBS * sizeof(target_ulong), 506 + textpos = target_mmap(0, text_len + data_len + extra + indx_len,
503 PROT_READ | PROT_EXEC | PROT_WRITE, 507 PROT_READ | PROT_EXEC | PROT_WRITE,
504 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 508 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
505 if (textpos == -1 ) { 509 if (textpos == -1 ) {
@@ -508,9 +512,8 @@ static int load_flat_file(struct linux_binprm * bprm, @@ -508,9 +512,8 @@ static int load_flat_file(struct linux_binprm * bprm,
508 } 512 }
509 513
510 realdatastart = textpos + ntohl(hdr->data_start); 514 realdatastart = textpos + ntohl(hdr->data_start);
511 - datapos = realdatastart + MAX_SHARED_LIBS * sizeof(target_ulong);  
512 - reloc = (textpos + ntohl(hdr->reloc_start) +  
513 - MAX_SHARED_LIBS * sizeof(target_ulong)); 515 + datapos = realdatastart + indx_len;
  516 + reloc = (textpos + ntohl(hdr->reloc_start) + indx_len);
514 memp = textpos; 517 memp = textpos;
515 518
516 #ifdef CONFIG_BINFMT_ZFLAT 519 #ifdef CONFIG_BINFMT_ZFLAT