int xlate_named_init_fd(int fd, const char *section_name, xlate_table_con * ret_tab_ptr) { Elf *elf; xlate_table_con ltab = 0; int retstatus = XLATE_TB_STATUS_NO_ERROR; if(elf_version(EV_CURRENT) == EV_NONE) { return XLATE_TB_STATUS_ELF_VERSION_BAD; } #ifdef HAVE_ELF_C_READ_MMAP elf = elf_begin(fd,ELF_C_READ_MMAP,NULL); #else elf = elf_begin(fd,ELF_C_READ,NULL); #endif if(elf == NULL) { return XLATE_TB_STATUS_ELF_BEGIN_BAD; } retstatus = xlate_named_init_elf(elf,section_name,<ab); if(retstatus != XLATE_TB_STATUS_NO_ERROR) { (void)elf_end(elf); } else { ltab->xc_did_elf_begin = 1; *ret_tab_ptr = ltab; } return retstatus; }
int xlate_init_elf(Elf * elf, int open_debug_table, xlate_table_con * ret_tab_ptr) { int res; Elf32_Word wanttype; Elf_Scn *scn = 0; int is64bit = 0; char *ident; size_t identsize; Elf64_Shdr *shdr64 = 0; Elf32_Shdr *shdr32 = 0; Elf32_Ehdr *ehdr32 = 0; Elf64_Ehdr *ehdr64 = 0; int stringindex = 0; char * sec_name; if(elf_kind(elf) != ELF_K_ELF) { return XLATE_TB_STATUS_NOT_ELF; } ident = elf_getident(elf,&identsize); if(open_debug_table == XLATE_OPEN_STD_TABLE) { /* we take the first SHT_MIPS_XLATE*/ wanttype = SHT_MIPS_XLATE; } else if(open_debug_table == XLATE_OPEN_DEBUG_TABLE) { /* we take the first SHT_MIPS_XLATE_DEBUG */ wanttype = SHT_MIPS_XLATE_DEBUG; } else { return XLATE_TB_STATUS_NO_XLATE; } res = XLATE_TB_STATUS_NO_XLATE; if(ident == 0 || identsize < EI_NIDENT) { return XLATE_TB_STATUS_ELF_IDENT_BAD; } if(ident[EI_CLASS] == ELFCLASS64) { is64bit = 1; } if(is64bit) { ehdr64 = elf64_getehdr(elf); if(ehdr64 == 0 ) { return XLATE_TB_STATUS_ELF_EHDR_BAD; } stringindex = ehdr64->e_shstrndx; } else { ehdr32 = elf32_getehdr(elf); if(ehdr32 == 0 ) { return XLATE_TB_STATUS_ELF_EHDR_BAD; } stringindex = ehdr32->e_shstrndx; } for(scn = elf_nextscn(elf,scn); scn != 0 ; scn = elf_nextscn(elf,scn)) { if(is64bit) { shdr64 = elf64_getshdr(scn); if(shdr64 == 0) { return XLATE_TB_STATUS_ELF_SHDR_BAD; } sec_name = elf_strptr(elf,stringindex,shdr64->sh_name); if(sec_name == 0) { return XLATE_TB_STATUS_ELF_STRPTR_BAD; } if(shdr64->sh_type != wanttype) { continue; } res = xlate_named_init_elf(elf, sec_name,ret_tab_ptr); return res; } else { shdr32 = elf32_getshdr(scn); if(shdr32 == 0) { return XLATE_TB_STATUS_ELF_SHDR_BAD; } sec_name = elf_strptr(elf,stringindex,shdr32->sh_name); if(sec_name == 0) { return XLATE_TB_STATUS_ELF_STRPTR_BAD; } if(shdr32->sh_type != wanttype) { continue; } res = xlate_named_init_elf(elf, sec_name,ret_tab_ptr); return res; } } return res; }