mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
linux-user: Extract MIPS abiflags from ELF file
Read MIPS.abiflags section from ELF file into Mips_elf_abiflags_v0 struct. Reviewed-by: Aleksandar Markovic <amarkovic@wavecomp.com> Signed-off-by: Stefan Markovic <smarkovic@wavecomp.com>
This commit is contained in:
parent
74cfc704e5
commit
5dd0db52e6
1 changed files with 33 additions and 0 deletions
|
@ -1517,11 +1517,25 @@ static void bswap_sym(struct elf_sym *sym)
|
|||
bswaptls(&sym->st_size);
|
||||
bswap16s(&sym->st_shndx);
|
||||
}
|
||||
|
||||
#ifdef TARGET_MIPS
|
||||
static void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags)
|
||||
{
|
||||
bswap16s(&abiflags->version);
|
||||
bswap32s(&abiflags->ases);
|
||||
bswap32s(&abiflags->isa_ext);
|
||||
bswap32s(&abiflags->flags1);
|
||||
bswap32s(&abiflags->flags2);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
static inline void bswap_ehdr(struct elfhdr *ehdr) { }
|
||||
static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
|
||||
static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { }
|
||||
static inline void bswap_sym(struct elf_sym *sym) { }
|
||||
#ifdef TARGET_MIPS
|
||||
static inline void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags) { }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_ELF_CORE_DUMP
|
||||
|
@ -2364,6 +2378,25 @@ static void load_elf_image(const char *image_name, int image_fd,
|
|||
goto exit_errmsg;
|
||||
}
|
||||
*pinterp_name = interp_name;
|
||||
#ifdef TARGET_MIPS
|
||||
} else if (eppnt->p_type == PT_MIPS_ABIFLAGS) {
|
||||
Mips_elf_abiflags_v0 abiflags;
|
||||
if (eppnt->p_filesz < sizeof(Mips_elf_abiflags_v0)) {
|
||||
errmsg = "Invalid PT_MIPS_ABIFLAGS entry";
|
||||
goto exit_errmsg;
|
||||
}
|
||||
if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
|
||||
memcpy(&abiflags, bprm_buf + eppnt->p_offset,
|
||||
sizeof(Mips_elf_abiflags_v0));
|
||||
} else {
|
||||
retval = pread(image_fd, &abiflags, sizeof(Mips_elf_abiflags_v0),
|
||||
eppnt->p_offset);
|
||||
if (retval != sizeof(Mips_elf_abiflags_v0)) {
|
||||
goto exit_perror;
|
||||
}
|
||||
}
|
||||
bswap_mips_abiflags(&abiflags);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue