Skip to contentSkip to conversation

patchelf: fix segfault for binaries linked by gold

PATCH New Ed Bartosh 1 participant 1 message Jul 21, 2017

lore
Share & tools
lore

Ed Bartosh

author
#0 lore raw

PATCH v2 1/1 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]

---
 .../patchelf/fix-adjusting-startPage.patch         | 38 ++++++++++++++++++++++
 meta/recipes-devtools/patchelf/patchelf_0.9.bb     |  1 +
 2 files changed, 39 insertions(+)
 create mode 100644 meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch
meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch new file +38 -0
new file mode 100644
index 0000000..f64cbed
@@ -0,0 +1,38 @@
+commit 1cc234fea5600190d872329aca60e2365cefc39e
+Author: Ed Bartosh <[email protected]>
+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 <[email protected]>
+
+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;
+     }
+ 
meta/recipes-devtools/patchelf/patchelf_0.9.bb +1 -0
index 01f0e62..d703039 100644
@@ -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"
Signature · 1 line
2.1.4