summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/patchelf.cc10
-rw-r--r--src/patchelf.h2
2 files changed, 7 insertions, 5 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc
index 0c8e260..2bb84eb 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -436,7 +436,7 @@ static uint64_t roundUp(uint64_t n, uint64_t m)
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset)
+void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset, size_t extraBytes)
{
assert(startOffset >= sizeof(Elf_Ehdr));
@@ -512,7 +512,7 @@ void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t start
wri(phdr.p_offset, phdrs.at(splitIndex).p_offset - splitShift - shift);
wri(phdr.p_paddr, phdrs.at(splitIndex).p_paddr - splitShift - shift);
wri(phdr.p_vaddr, phdrs.at(splitIndex).p_vaddr - splitShift - shift);
- wri(phdr.p_filesz, wri(phdr.p_memsz, splitShift + shift));
+ wri(phdr.p_filesz, wri(phdr.p_memsz, splitShift + extraBytes));
wri(phdr.p_flags, PF_R | PF_W);
wri(phdr.p_align, getPageSize());
}
@@ -912,12 +912,14 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsExecutable()
neededSpace += sizeof(Elf_Phdr);
debug("needed space is %d\n", neededSpace);
- unsigned int neededPages = roundUp(neededSpace - startOffset, getPageSize()) / getPageSize();
+ /* Calculate how many bytes are needed out of the additional pages. */
+ size_t extraSpace = neededSpace - startOffset;
+ unsigned int neededPages = roundUp(extraSpace, getPageSize()) / getPageSize();
debug("needed pages is %d\n", neededPages);
if (neededPages * getPageSize() > firstPage)
error("virtual address space underrun!");
- shiftFile(neededPages, startOffset);
+ shiftFile(neededPages, startOffset, extraSpace);
firstPage -= neededPages * getPageSize();
startOffset += neededPages * getPageSize();
diff --git a/src/patchelf.h b/src/patchelf.h
index c336c51..f4eec6f 100644
--- a/src/patchelf.h
+++ b/src/patchelf.h
@@ -77,7 +77,7 @@ private:
void sortShdrs();
- void shiftFile(unsigned int extraPages, size_t sizeOffset);
+ void shiftFile(unsigned int extraPages, size_t sizeOffset, size_t extraBytes);
std::string getSectionName(const Elf_Shdr & shdr) const;