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
					
				@ -1517,11 +1517,25 @@ static void bswap_sym(struct elf_sym *sym)
 | 
				
			|||||||
    bswaptls(&sym->st_size);
 | 
					    bswaptls(&sym->st_size);
 | 
				
			||||||
    bswap16s(&sym->st_shndx);
 | 
					    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
 | 
					#else
 | 
				
			||||||
static inline void bswap_ehdr(struct elfhdr *ehdr) { }
 | 
					static inline void bswap_ehdr(struct elfhdr *ehdr) { }
 | 
				
			||||||
static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
 | 
					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_shdr(struct elf_shdr *shdr, int shnum) { }
 | 
				
			||||||
static inline void bswap_sym(struct elf_sym *sym) { }
 | 
					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
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef USE_ELF_CORE_DUMP
 | 
					#ifdef USE_ELF_CORE_DUMP
 | 
				
			||||||
@ -2364,6 +2378,25 @@ static void load_elf_image(const char *image_name, int image_fd,
 | 
				
			|||||||
                goto exit_errmsg;
 | 
					                goto exit_errmsg;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            *pinterp_name = interp_name;
 | 
					            *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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user