From 1630d3f846c7721b1e7cd3b005bb2b34816e1d0f Mon Sep 17 00:00:00 2001
From: Ed Bartosh <ed.bartosh@linux.intel.com>
Date: Fri, 21 Jul 2017 12:33:53 +0300
Subject: [PATCH] patchelf: fix segfault for binaries linked by gold

commit 1cc234fea5600190d872329aca60e2365cefc39e

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 <ed.bartosh@linux.intel.com>

Github PR: https://github.com/NixOS/patchelf/pull/127

Upstream-Status: Submitted

---
 src/patchelf.cc | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/patchelf.cc b/src/patchelf.cc
index a63e3a11c61f..2483d25d78f1 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -756,10 +756,8 @@ void ElfFile<ElfFileParamNames>::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;
     }
 
