diff options
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.patch | 60 |
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); + } + |