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 | ... | ... |