Commit 2a1094cd88afa69c0e7ecd1e81c712cc8f635153
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 | 393 | int i, rev, relocs = 0; |
| 394 | 394 | target_ulong fpos; |
| 395 | 395 | target_ulong start_code, end_code; |
| 396 | + target_ulong indx_len; | |
| 396 | 397 | |
| 397 | 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 | 444 | if (extra < bss_len + stack_len) |
| 444 | 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 | 453 | * there are a couple of cases here, the separate code/data |
| 448 | 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 | 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 | 472 | PROT_READ|PROT_WRITE|PROT_EXEC, |
| 468 | 473 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| 469 | 474 | |
| ... | ... | @@ -471,7 +476,7 @@ static int load_flat_file(struct linux_binprm * bprm, |
| 471 | 476 | fprintf(stderr, "Unable to allocate RAM for process data\n"); |
| 472 | 477 | return realdatastart; |
| 473 | 478 | } |
| 474 | - datapos = realdatastart + MAX_SHARED_LIBS * sizeof(target_ulong); | |
| 479 | + datapos = realdatastart + indx_len; | |
| 475 | 480 | |
| 476 | 481 | DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n", |
| 477 | 482 | (int)(data_len + bss_len + stack_len), (int)datapos); |
| ... | ... | @@ -498,8 +503,7 @@ static int load_flat_file(struct linux_binprm * bprm, |
| 498 | 503 | |
| 499 | 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 | 507 | PROT_READ | PROT_EXEC | PROT_WRITE, |
| 504 | 508 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| 505 | 509 | if (textpos == -1 ) { |
| ... | ... | @@ -508,9 +512,8 @@ static int load_flat_file(struct linux_binprm * bprm, |
| 508 | 512 | } |
| 509 | 513 | |
| 510 | 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 | 517 | memp = textpos; |
| 515 | 518 | |
| 516 | 519 | #ifdef CONFIG_BINFMT_ZFLAT | ... | ... |