mirror of
https://github.com/NixOS/patchelf.git
synced 2025-10-19 11:24:11 +08:00
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>
This commit is contained in:
@@ -1574,9 +1574,10 @@ typedef struct
|
|||||||
|
|
||||||
/* Legal values for p_type field of Elf32_Phdr. */
|
/* Legal values for p_type field of Elf32_Phdr. */
|
||||||
|
|
||||||
#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
|
#define PT_MIPS_REGINFO 0x70000000 /* Register usage information. */
|
||||||
#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
|
#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
|
||||||
#define PT_MIPS_OPTIONS 0x70000002
|
#define PT_MIPS_OPTIONS 0x70000002
|
||||||
|
#define PT_MIPS_ABIFLAGS 0x70000003 /* FP mode requirement. */
|
||||||
|
|
||||||
/* Special program header types. */
|
/* Special program header types. */
|
||||||
|
|
||||||
|
@@ -766,6 +766,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);
|
curOff += roundUp(i.second.size(), sectionAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user