diff options
author | Felipe Sateler <fsateler@debian.org> | 2021-12-11 09:59:36 -0300 |
---|---|---|
committer | Felipe Sateler <fsateler@debian.org> | 2021-12-11 09:59:36 -0300 |
commit | 3188b7e9d1399fd4b41a69ec7429ca8d1fd5fa00 (patch) | |
tree | 07dacf0b6d2e7922a323451211ec488865f6ec4f | |
parent | 119fa76ac0fa20beb9ba09835edb639adcdd9e74 (diff) |
Drop all patches, applied upstream
3 files changed, 0 insertions, 216 deletions
diff --git a/debian/patches/Adjust-DT_MIPS_RLD_MAP_REL-dynamic-section-entry-if-prese.patch b/debian/patches/Adjust-DT_MIPS_RLD_MAP_REL-dynamic-section-entry-if-prese.patch deleted file mode 100644 index b05fac1..0000000 --- a/debian/patches/Adjust-DT_MIPS_RLD_MAP_REL-dynamic-section-entry-if-prese.patch +++ /dev/null @@ -1,154 +0,0 @@ -From: "Ivan A. Melnikov" <iv@altlinux.org> -Date: Thu, 22 Aug 2019 15:30:11 +0400 -Subject: Adjust DT_MIPS_RLD_MAP_REL dynamic section entry if present - -`patchelf --set-rpath` corrupted executables on mips32el: the dynamic -liker crushed with Segmentation fault when loading any executable with -RPATH added that way. - -The problem was around the MIPS-specific mechanism of setting up the -debug map pointer. When DT_MIPS_RLD_MAP_REL entry in the dynamic section -is present, it holds the relative address of __RLD_MAP -- an offset -relative to this dynamic section entry. Dynamic linker puts the -pointer to the `r_debug` structure there. - -When patchelf updates the executable RPATH, it moves the .dynamic -section both in the binary and in memory, while __RLD_MAP is not moved -in memory, since it belongs to special .rld_map section that has type -PROGBITS. So, the offset stored in DT_MIPS_RLD_MAP_REL entry is not -valid anymore and should be updated. - -This commit adds the necessary update. - -In the corner case when DT_MIPS_RLD_MAP_REL is present, but -.rld_map section is not, the dynamic loader writes the debug -pointer to some arbitrary bytes in memory. To avoid crushes -on otherwise "working" binaries, we set offset to zero -so that the dynamic loader would just overwrite the dynamic -section. - -Here we also import DT_MIPS_RLD_MAP_REL definition in elf.h form -glibc commit a2057c984e4314c3740f04cf54e36c824e4c8f32. - -Refs: #82 -Signed-off-by: Ivan A. Melnikov <iv@altlinux.org> ---- - src/elf.h | 6 +++++- - src/patchelf.cc | 21 +++++++++++++++++++-- - tests/Makefile.am | 1 + - tests/set-rpath-rel-map.sh | 37 +++++++++++++++++++++++++++++++++++++ - 4 files changed, 62 insertions(+), 3 deletions(-) - create mode 100755 tests/set-rpath-rel-map.sh - -diff --git a/src/elf.h b/src/elf.h -index 576990d..ae1524a 100644 ---- a/src/elf.h -+++ b/src/elf.h -@@ -1642,7 +1642,11 @@ typedef struct - PLT is writable. For a non-writable PLT, this is omitted or has a zero - value. */ - #define DT_MIPS_RWPLT 0x70000034 --#define DT_MIPS_NUM 0x35 -+/* An alternative description of the classic MIPS RLD_MAP that is usable -+ in a PIE as it stores a relative offset from the address of the tag -+ rather than an absolute address. */ -+#define DT_MIPS_RLD_MAP_REL 0x70000035 -+#define DT_MIPS_NUM 0x36 - - /* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ - -diff --git a/src/patchelf.cc b/src/patchelf.cc -index fd1e7b7..d713728 100644 ---- a/src/patchelf.cc -+++ b/src/patchelf.cc -@@ -1089,9 +1089,9 @@ void ElfFile<ElfFileParamNames>::rewriteHeaders(Elf_Addr phdrAddress) - (e.g., those produced by klibc's klcc). */ - auto shdrDynamic = findSection2(".dynamic"); - if (shdrDynamic) { -- auto dyn = (Elf_Dyn *)(contents + rdi(shdrDynamic->sh_offset)); -+ auto dyn_table = (Elf_Dyn *) (contents + rdi(shdrDynamic->sh_offset)); - unsigned int d_tag; -- for ( ; (d_tag = rdi(dyn->d_tag)) != DT_NULL; dyn++) -+ for (auto dyn = dyn_table; (d_tag = rdi(dyn->d_tag)) != DT_NULL; dyn++) - if (d_tag == DT_STRTAB) - dyn->d_un.d_ptr = findSection(".dynstr").sh_addr; - else if (d_tag == DT_STRSZ) -@@ -1130,6 +1130,23 @@ void ElfFile<ElfFileParamNames>::rewriteHeaders(Elf_Addr phdrAddress) - dyn->d_un.d_ptr = findSection(".gnu.version_r").sh_addr; - else if (d_tag == DT_VERSYM) - dyn->d_un.d_ptr = findSection(".gnu.version").sh_addr; -+ else if (d_tag == DT_MIPS_RLD_MAP_REL) { -+ /* the MIPS_RLD_MAP_REL tag stores the offset to the debug -+ pointer, relative to the address of the tag */ -+ auto shdr = findSection2(".rld_map"); -+ if (shdr) { -+ auto rld_map_addr = findSection(".rld_map").sh_addr; -+ auto dyn_offset = ((char*)dyn) - ((char*)dyn_table); -+ dyn->d_un.d_ptr = rld_map_addr + dyn_offset - shdrDynamic->sh_addr; -+ } else { -+ /* ELF file with DT_MIPS_RLD_MAP_REL but without .rld_map -+ is broken, and it's not our job to fix it; yet, we have -+ to find some location for dynamic loader to write the -+ debug pointer to; well, let's write it right here */ -+ fprintf(stderr, "warning: DT_MIPS_RLD_MAP_REL entry is present, but .rld_map section is not\n"); -+ dyn->d_un.d_ptr = 0; -+ } -+ } - } - - -diff --git a/tests/Makefile.am b/tests/Makefile.am -index f8176e0..3e6b356 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -22,6 +22,7 @@ src_TESTS = \ - plain-fail.sh plain-run.sh shrink-rpath.sh set-interpreter-short.sh \ - set-interpreter-long.sh set-rpath.sh add-rpath.sh no-rpath.sh big-dynstr.sh \ - set-rpath-library.sh soname.sh shrink-rpath-with-allowed-prefixes.sh \ -+ set-rpath-rel-map.sh \ - force-rpath.sh \ - plain-needed.sh \ - output-flag.sh \ -diff --git a/tests/set-rpath-rel-map.sh b/tests/set-rpath-rel-map.sh -new file mode 100755 -index 0000000..efc0943 ---- /dev/null -+++ b/tests/set-rpath-rel-map.sh -@@ -0,0 +1,37 @@ -+#! /bin/sh -e -+ -+if ! objdump -p main | grep -q MIPS_RLD_MAP_REL; then -+ echo "No MIPS_RLD_MAP_REL dynamic section entry, skipping" -+ exit 0 -+fi -+ -+SCRATCH=scratch/$(basename $0 .sh) -+ -+rm -rf ${SCRATCH} -+mkdir -p ${SCRATCH} -+mkdir -p ${SCRATCH}/libsA -+mkdir -p ${SCRATCH}/libsB -+ -+cp main ${SCRATCH}/ -+cp libfoo.so ${SCRATCH}/libsA/ -+cp libbar.so ${SCRATCH}/libsB/ -+ -+# break the main executable by removing .rld_map section -+objcopy --remove-section .rld_map ${SCRATCH}/main -+ -+oldRPath=$(../src/patchelf --print-rpath ${SCRATCH}/main) -+if test -z "$oldRPath"; then oldRPath="/oops"; fi -+../src/patchelf --force-rpath --set-rpath $oldRPath:$(pwd)/${SCRATCH}/libsA:$(pwd)/${SCRATCH}/libsB ${SCRATCH}/main -+ -+if test "$(uname)" = FreeBSD; then -+ export LD_LIBRARY_PATH=$(pwd)/${SCRATCH}/libsB -+fi -+ -+exitCode=0 -+ -+(cd ${SCRATCH} && ./main) || exitCode=$? -+ -+if test "$exitCode" != 46; then -+ echo "bad exit code!" -+ exit 1 -+fi diff --git a/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch b/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch deleted file mode 100644 index dfd35fb..0000000 --- a/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch +++ /dev/null @@ -1,60 +0,0 @@ -From: "Ivan A. Melnikov" <iv@altlinux.org> -Date: Thu, 22 Aug 2019 18:04:57 +0400 -Subject: Adjust PT_MIPS_ABIFLAGS segment if present - -When loading the executable on MIPS, the dynamic loader looks for MIPS -ABI flags using PT_MIPS_ABIFLAGS header. The flags themselves are stored -in the .MIPS.abiflags section, so the header must be updated when the -section is moved. - -Here we also import PT_MIPS_ABIFLAGS definition from glibc commit -0bd956720c457ff054325b48f26ac7c91cb060e8. - -Closes: #82 -Signed-off-by: Ivan A. Melnikov <iv@altlinux.org> ---- - src/elf.h | 7 ++++--- - src/patchelf.cc | 12 ++++++++++++ - 2 files changed, 16 insertions(+), 3 deletions(-) - -diff --git a/src/elf.h b/src/elf.h -index ae1524a..b3e567c 100644 ---- a/src/elf.h -+++ b/src/elf.h -@@ -1574,9 +1574,10 @@ typedef struct - - /* Legal values for p_type field of Elf32_Phdr. */ - --#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ --#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ --#define PT_MIPS_OPTIONS 0x70000002 -+#define PT_MIPS_REGINFO 0x70000000 /* Register usage information. */ -+#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ -+#define PT_MIPS_OPTIONS 0x70000002 -+#define PT_MIPS_ABIFLAGS 0x70000003 /* FP mode requirement. */ - - /* Special program header types. */ - -diff --git a/src/patchelf.cc b/src/patchelf.cc -index d713728..ac8b2cd 100644 ---- a/src/patchelf.cc -+++ b/src/patchelf.cc -@@ -757,6 +757,18 @@ void ElfFile<ElfFileParamNames>::writeReplacedSections(Elf_Off & curOff, - } - } - -+ /* If there is .MIPS.abiflags section, then the PT_MIPS_ABIFLAGS -+ segment must be sync'ed with it. */ -+ if (sectionName == ".MIPS.abiflags") { -+ for (auto & phdr : phdrs) { -+ if (rdi(phdr.p_type) == PT_MIPS_ABIFLAGS) { -+ phdr.p_offset = shdr.sh_offset; -+ phdr.p_vaddr = phdr.p_paddr = shdr.sh_addr; -+ phdr.p_filesz = phdr.p_memsz = shdr.sh_size; -+ } -+ } -+ } -+ - curOff += roundUp(i.second.size(), sectionAlignment); - } - diff --git a/debian/patches/series b/debian/patches/series deleted file mode 100644 index c9bfdcd..0000000 --- a/debian/patches/series +++ /dev/null @@ -1,2 +0,0 @@ -Adjust-DT_MIPS_RLD_MAP_REL-dynamic-section-entry-if-prese.patch -Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch |