summaryrefslogtreecommitdiff
path: root/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch')
-rw-r--r--debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch b/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch
new file mode 100644
index 0000000..dfd35fb
--- /dev/null
+++ b/debian/patches/Adjust-PT_MIPS_ABIFLAGS-segment-if-present.patch
@@ -0,0 +1,60 @@
+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);
+ }
+