![Conrad Ratschan](/assets/img/avatar_default.png)
When building iputils for powerpc with BR2_PIC_PIE enabled, the arping/rdisc/tftpd binaries will segfault at runtime. This can be traced back to a few bugs in patchelf corrupting the ELFs when resizing the RPATH to replace "$ORIGIN/" with "/usr/sbin". This patch pulls in upstream fixes to prevent the binaries from being needlessly inflated, prevent the startPage from always being adjusted, fix a few minor bugs, and fix incorrect endianness handling. Signed-off-by: Conrad Ratschan <conrad.ratschan@rockwellcollins.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
46 lines
1.6 KiB
Diff
46 lines
1.6 KiB
Diff
From 4a82c97e8a0677706d1d532812daaa73249768a8 Mon Sep 17 00:00:00 2001
|
|
From: Ed Bartosh <ed.bartosh@linux.intel.com>
|
|
Date: Fri, 21 Jul 2017 12:33:53 +0300
|
|
Subject: [PATCH] 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>
|
|
|
|
Fetch from: https://github.com/NixOS/patchelf/commit/1cc234fea5600190d872329aca60e2365cefc39e
|
|
|
|
Backported to v0.9
|
|
|
|
Signed-off-by: Conrad Ratschan <conrad.ratschan@rockwellcollins.com>
|
|
---
|
|
src/patchelf.cc | 6 ++----
|
|
1 file changed, 2 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/patchelf.cc b/src/patchelf.cc
|
|
index 1224a89..4676157 100644
|
|
--- a/src/patchelf.cc
|
|
+++ b/src/patchelf.cc
|
|
@@ -697,10 +697,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;
|
|
}
|
|
|
|
--
|
|
2.17.1
|
|
|