patchelf: fix segfault for binaries linked by gold

Due to a bug in calculating adresses of modified program
headers patchelf breaks executables linked by Gold linker
causing them to segfault, e.g.
$ tmp/sysroots-components/x86_64/m4-native/usr/bin/m4 --help
Segmentation fault

This is reproducible only in some cases and only for executables
of ET_DYN type produced by Gold or by ld linked with pie.

This should be solved by fix-adjusting-startPage.patch that
fixes calculation logic.

[YOCTO #11785]

(From OE-Core rev: 4e4c96db4b1d2356b5d071cee6746a96eca20439)

Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ed Bartosh
2017-07-21 14:48:13 +03:00
committed by Richard Purdie
parent 52f2d81c9a
commit ec5c4e97c8
2 changed files with 39 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
commit 1cc234fea5600190d872329aca60e2365cefc39e
Author: Ed Bartosh <ed.bartosh@linux.intel.com>
Date: Fri Jul 21 12:33:53 2017 +0300
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
diff --git a/src/patchelf.cc b/src/patchelf.cc
index cbd36c0..e9d7ea5 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -720,10 +720,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;
}

View File

@@ -3,6 +3,7 @@ SRC_URI = "http://nixos.org/releases/${BPN}/${BPN}-${PV}/${BPN}-${PV}.tar.bz2 \
file://handle-read-only-files.patch \
file://Increase-maxSize-to-64MB.patch \
file://avoidholes.patch \
file://fix-adjusting-startPage.patch \
"
LICENSE = "GPLv3"