@@ -436,7 +436,7 @@ static uint64_t roundUp(uint64_t n, uint64_t m)
436436
437437
438438template <ElfFileParams>
439- void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset)
439+ void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset, size_t extraBytes )
440440{
441441 assert (startOffset >= sizeof (Elf_Ehdr));
442442
@@ -512,7 +512,7 @@ void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t start
512512 wri (phdr.p_offset , phdrs.at (splitIndex).p_offset - splitShift - shift);
513513 wri (phdr.p_paddr , phdrs.at (splitIndex).p_paddr - splitShift - shift);
514514 wri (phdr.p_vaddr , phdrs.at (splitIndex).p_vaddr - splitShift - shift);
515- wri (phdr.p_filesz , wri (phdr.p_memsz , splitShift + shift ));
515+ wri (phdr.p_filesz , wri (phdr.p_memsz , splitShift + extraBytes ));
516516 wri (phdr.p_flags , PF_R | PF_W);
517517 wri (phdr.p_align , getPageSize ());
518518}
@@ -912,12 +912,14 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsExecutable()
912912 neededSpace += sizeof (Elf_Phdr);
913913 debug (" needed space is %d\n " , neededSpace);
914914
915- unsigned int neededPages = roundUp (neededSpace - startOffset, getPageSize ()) / getPageSize ();
915+ /* Calculate how many bytes are needed out of the additional pages. */
916+ size_t extraSpace = neededSpace - startOffset;
917+ unsigned int neededPages = roundUp (extraSpace, getPageSize ()) / getPageSize ();
916918 debug (" needed pages is %d\n " , neededPages);
917919 if (neededPages * getPageSize () > firstPage)
918920 error (" virtual address space underrun!" );
919921
920- shiftFile (neededPages, startOffset);
922+ shiftFile (neededPages, startOffset, extraSpace );
921923
922924 firstPage -= neededPages * getPageSize ();
923925 startOffset += neededPages * getPageSize ();
0 commit comments