|
@@ -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
|
|
|
}
|
|
|
}
|
|
|
|