![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>
39 lines
1.5 KiB
Diff
39 lines
1.5 KiB
Diff
From cb8326de54ad7a56658b0dc8efb7da5e71684a7c Mon Sep 17 00:00:00 2001
|
|
From: Pablo Galindo <pablogsal@gmail.com>
|
|
Date: Tue, 22 Sep 2020 01:33:47 +0100
|
|
Subject: [PATCH] Use sh_offset instead of sh_addr when checking already
|
|
replaced libs
|
|
|
|
When checking for already replaced libs, the check against the size must
|
|
be done using the section header offset, not the section file address.
|
|
This was not crashing in many situations because normally sh_address and
|
|
sh_offset have the same value but these two may differ and using the
|
|
sh_address value instead can cause library corruption in these
|
|
situations.
|
|
|
|
Fetch from: https://github.com/NixOS/patchelf/commit/83aa89addf8757e2d63aa73222f2fa9bc6d7321a
|
|
|
|
Backported to v0.9
|
|
|
|
Signed-off-by: Conrad Ratschan <conrad.ratschan@rockwellcollins.com>
|
|
---
|
|
src/patchelf.cc | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/src/patchelf.cc b/src/patchelf.cc
|
|
index 4676157..c025ae2 100644
|
|
--- a/src/patchelf.cc
|
|
+++ b/src/patchelf.cc
|
|
@@ -666,7 +666,7 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsLibrary()
|
|
/* Some sections may already be replaced so account for that */
|
|
unsigned int i = 1;
|
|
Elf_Addr pht_size = sizeof(Elf_Ehdr) + (phdrs.size() + 1)*sizeof(Elf_Phdr);
|
|
- while( shdrs[i].sh_addr <= pht_size && i < rdi(hdr->e_shnum) ) {
|
|
+ while( shdrs[i].sh_offset <= pht_size && i < rdi(hdr->e_shnum) ) {
|
|
if (not haveReplacedSection(getSectionName(shdrs[i])))
|
|
replaceSection(getSectionName(shdrs[i]), shdrs[i].sh_size);
|
|
i++;
|
|
--
|
|
2.17.1
|
|
|