1*4882a593SmuzhiyunFrom 4a82c97e8a0677706d1d532812daaa73249768a8 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Ed Bartosh <ed.bartosh@linux.intel.com> 3*4882a593SmuzhiyunDate: Fri, 21 Jul 2017 12:33:53 +0300 4*4882a593SmuzhiyunSubject: [PATCH] fix adjusting startPage 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunstartPage is adjusted unconditionally for all executables. 7*4882a593SmuzhiyunThis results in incorrect addresses assigned to INTERP and LOAD 8*4882a593Smuzhiyunprogram headers, which breaks patched executable. 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunAdjusting startPage variable only when startOffset > startPage 11*4882a593Smuzhiyunshould fix this. 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunThis change is related to the issue NixOS#10 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunSigned-off-by: Ed Bartosh <ed.bartosh@linux.intel.com> 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunFetch from: https://github.com/NixOS/patchelf/commit/1cc234fea5600190d872329aca60e2365cefc39e 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunBackported to v0.9 20*4882a593Smuzhiyun 21*4882a593SmuzhiyunSigned-off-by: Conrad Ratschan <conrad.ratschan@rockwellcollins.com> 22*4882a593Smuzhiyun--- 23*4882a593Smuzhiyun src/patchelf.cc | 6 ++---- 24*4882a593Smuzhiyun 1 file changed, 2 insertions(+), 4 deletions(-) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyundiff --git a/src/patchelf.cc b/src/patchelf.cc 27*4882a593Smuzhiyunindex 1224a89..4676157 100644 28*4882a593Smuzhiyun--- a/src/patchelf.cc 29*4882a593Smuzhiyun+++ b/src/patchelf.cc 30*4882a593Smuzhiyun@@ -697,10 +697,8 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary() 31*4882a593Smuzhiyun since DYN executables tend to start at virtual address 0, so 32*4882a593Smuzhiyun rewriteSectionsExecutable() won't work because it doesn't have 33*4882a593Smuzhiyun any virtual address space to grow downwards into. */ 34*4882a593Smuzhiyun- if (isExecutable) { 35*4882a593Smuzhiyun- if (startOffset >= startPage) { 36*4882a593Smuzhiyun- debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); 37*4882a593Smuzhiyun- } 38*4882a593Smuzhiyun+ if (isExecutable && startOffset > startPage) { 39*4882a593Smuzhiyun+ debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); 40*4882a593Smuzhiyun startPage = startOffset; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun-- 44*4882a593Smuzhiyun2.17.1 45*4882a593Smuzhiyun 46