From: Ed Bartosh Date: Fri, 21 Jul 2017 12:33:53 +0300 Subject: [PATCH] fix adjusting startPage startPage is adjusted unconditionally for all executables. This results in incorrect addresses assigned to INTERP and LOAD program headers, which breaks patched executable. Adjusting startPage variable only when startOffset > startPage should fix this. This change is related to the issue NixOS#10 Signed-off-by: Ed Bartosh --- src/patchelf.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/patchelf.cc b/src/patchelf.cc index 0b4965adff83..12d6bf1dde01 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -742,10 +742,8 @@ void ElfFile::rewriteSectionsLibrary() since DYN executables tend to start at virtual address 0, so rewriteSectionsExecutable() won't work because it doesn't have any virtual address space to grow downwards into. */ - if (isExecutable) { - if (startOffset >= startPage) { - debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); - } + if (isExecutable && startOffset > startPage) { + debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); startPage = startOffset; }