diff options
author | Ed Bartosh <ed.bartosh@linux.intel.com> | 2017-07-21 14:48:13 +0300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-24 09:13:30 +0100 |
commit | ec5c4e97c8c11a9ff93c4c4f653ad6cfd55fa7fa (patch) | |
tree | 21c7e9c7a12692fdf341221f0b88ca03aa100561 | |
parent | 52f2d81c9a07453de09bf03a3d799a6d497c774b (diff) | |
download | poky-ec5c4e97c8c11a9ff93c4c4f653ad6cfd55fa7fa.tar.gz |
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>
-rw-r--r-- | meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch | 38 | ||||
-rw-r--r-- | meta/recipes-devtools/patchelf/patchelf_0.9.bb | 1 |
2 files changed, 39 insertions, 0 deletions
diff --git a/meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch b/meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch new file mode 100644 index 0000000000..f64cbed5cb --- /dev/null +++ b/meta/recipes-devtools/patchelf/patchelf/fix-adjusting-startPage.patch | |||
@@ -0,0 +1,38 @@ | |||
1 | commit 1cc234fea5600190d872329aca60e2365cefc39e | ||
2 | Author: Ed Bartosh <ed.bartosh@linux.intel.com> | ||
3 | Date: Fri Jul 21 12:33:53 2017 +0300 | ||
4 | |||
5 | fix adjusting startPage | ||
6 | |||
7 | startPage is adjusted unconditionally for all executables. | ||
8 | This results in incorrect addresses assigned to INTERP and LOAD | ||
9 | program headers, which breaks patched executable. | ||
10 | |||
11 | Adjusting startPage variable only when startOffset > startPage | ||
12 | should fix this. | ||
13 | |||
14 | This change is related to the issue NixOS#10 | ||
15 | |||
16 | Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com> | ||
17 | |||
18 | Github PR: https://github.com/NixOS/patchelf/pull/127 | ||
19 | |||
20 | Upstream-Status: Submitted | ||
21 | |||
22 | diff --git a/src/patchelf.cc b/src/patchelf.cc | ||
23 | index cbd36c0..e9d7ea5 100644 | ||
24 | --- a/src/patchelf.cc | ||
25 | +++ b/src/patchelf.cc | ||
26 | @@ -720,10 +720,8 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary() | ||
27 | since DYN executables tend to start at virtual address 0, so | ||
28 | rewriteSectionsExecutable() won't work because it doesn't have | ||
29 | any virtual address space to grow downwards into. */ | ||
30 | - if (isExecutable) { | ||
31 | - if (startOffset >= startPage) { | ||
32 | - debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); | ||
33 | - } | ||
34 | + if (isExecutable && startOffset > startPage) { | ||
35 | + debug("shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug\n", startOffset - startPage); | ||
36 | startPage = startOffset; | ||
37 | } | ||
38 | |||
diff --git a/meta/recipes-devtools/patchelf/patchelf_0.9.bb b/meta/recipes-devtools/patchelf/patchelf_0.9.bb index 01f0e62135..d70303963c 100644 --- a/meta/recipes-devtools/patchelf/patchelf_0.9.bb +++ b/meta/recipes-devtools/patchelf/patchelf_0.9.bb | |||
@@ -3,6 +3,7 @@ SRC_URI = "http://nixos.org/releases/${BPN}/${BPN}-${PV}/${BPN}-${PV}.tar.bz2 \ | |||
3 | file://handle-read-only-files.patch \ | 3 | file://handle-read-only-files.patch \ |
4 | file://Increase-maxSize-to-64MB.patch \ | 4 | file://Increase-maxSize-to-64MB.patch \ |
5 | file://avoidholes.patch \ | 5 | file://avoidholes.patch \ |
6 | file://fix-adjusting-startPage.patch \ | ||
6 | " | 7 | " |
7 | 8 | ||
8 | LICENSE = "GPLv3" | 9 | LICENSE = "GPLv3" |