| From 4a82c97e8a0677706d1d532812daaa73249768a8 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] 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> |
| |
| Fetch from: https://github.com/NixOS/patchelf/commit/1cc234fea5600190d872329aca60e2365cefc39e |
| |
| Backported to v0.9 |
| |
| Signed-off-by: Conrad Ratschan <conrad.ratschan@rockwellcollins.com> |
| --- |
| src/patchelf.cc | 6 ++---- |
| 1 file changed, 2 insertions(+), 4 deletions(-) |
| |
| diff --git a/src/patchelf.cc b/src/patchelf.cc |
| index 1224a89..4676157 100644 |
| --- a/src/patchelf.cc |
| +++ b/src/patchelf.cc |
| @@ -697,10 +697,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; |
| } |
| |
| -- |
| 2.17.1 |
| |