Skip to content

Commit 583fd5a

Browse files
bors[bot]Jason
and
Jason
authored
Merge #447
447: Split segment size fix r=Mic92 a=otherjason Co-authored-by: Jason <[email protected]>
2 parents c6f4069 + 3a6d771 commit 583fd5a

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

src/patchelf.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ static uint64_t roundUp(uint64_t n, uint64_t m)
436436

437437

438438
template<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();

src/patchelf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class ElfFile
7777

7878
void sortShdrs();
7979

80-
void shiftFile(unsigned int extraPages, size_t sizeOffset);
80+
void shiftFile(unsigned int extraPages, size_t sizeOffset, size_t extraBytes);
8181

8282
std::string getSectionName(const Elf_Shdr & shdr) const;
8383

0 commit comments

Comments
 (0)