mirror of
https://git.yoctoproject.org/poky
synced 2026-05-09 05:29:32 +00:00
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:
committed by
Richard Purdie
parent
52f2d81c9a
commit
ec5c4e97c8
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -3,6 +3,7 @@ SRC_URI = "http://nixos.org/releases/${BPN}/${BPN}-${PV}/${BPN}-${PV}.tar.bz2 \
|
|||||||
file://handle-read-only-files.patch \
|
file://handle-read-only-files.patch \
|
||||||
file://Increase-maxSize-to-64MB.patch \
|
file://Increase-maxSize-to-64MB.patch \
|
||||||
file://avoidholes.patch \
|
file://avoidholes.patch \
|
||||||
|
file://fix-adjusting-startPage.patch \
|
||||||
"
|
"
|
||||||
|
|
||||||
LICENSE = "GPLv3"
|
LICENSE = "GPLv3"
|
||||||
|
|||||||
Reference in New Issue
Block a user