//-------------------------------------------------------------------------- static void read_dyninfo(ulong offset, ulong size) { qlseek(li, offset); const int entsize = elf64 ? sizeof(Elf64_Dyn) : sizeof(Elf32_Dyn); for(int i = 1; i < size; i += entsize ) { Elf64_Dyn dyn; if ( elf64 ) { if(lread8bytes(li, &dyn.d_tag, mf) || lread8bytes(li, &dyn.d_un, mf)) errstruct(); } else { ulong tag, val; if(lread4bytes(li, &tag, mf) || lread4bytes(li, &val, mf)) errstruct(); dyn.d_tag = tag; dyn.d_un = val; } switch ( WC4(dyn.d_tag) ) { case DT_STRTAB: dynstr_off = map_ea(dyn.d_un); break; case DT_SYMTAB: dynsym_off = map_ea(dyn.d_un); break; case DT_REL: dynrel_off = map_ea(dyn.d_un); break; case DT_RELA: dynrela_off = map_ea(dyn.d_un); break; case DT_STRSZ: dynstr_size = ulong(dyn.d_un); break; case DT_RELSZ: dynrel_size = ulong(dyn.d_un); break; case DT_RELASZ: dynrela_size = ulong(dyn.d_un); break; } } ulong off = dynstr_off; if ( dynrel_off ) off = qmin(dynrel_off, off); if ( dynrela_off ) off = qmin(dynrela_off, off); dynsym_size = off - dynsym_off; }
//-------------------------------------------------------------------------- // read 64 or 32 bit number depending on the ELF type static bool read_uword(uint64 *p, bool sign=false) { if ( elf64 ) { #if defined(__EA64__) || !defined(BUILD_LOADER) return lread8bytes(li, p, mf) == 0; #else loader_failure("Please use IDA Pro 64-bit to load 64-bit files"); #ifdef __BORLANDC__ return false; #endif #endif } else { uint32 x; if ( lread4bytes(li, &x, mf) != 0 ) return false; *p = sign ? int32(x) : x; return true; } }
//-------------------------------------------------------------------------- static void load_sht64(void) { register int i; register Elf64_Shdr *sh; qlseek(li, ulong(e_shoff)); for(i = 0, sh = shdr64; i < e_shnum; i++, sh++) { if(lread4bytes(li, &sh->sh_name, mf) || lread4bytes(li, &sh->sh_type, mf) || lread8bytes(li, &sh->sh_flags, mf) || lread8bytes(li, &sh->sh_addr, mf) || lread8bytes(li, &sh->sh_offset, mf) || lread8bytes(li, &sh->sh_size, mf) || lread4bytes(li, &sh->sh_link, mf) || lread4bytes(li, &sh->sh_info, mf) || lread8bytes(li, &sh->sh_addralign, mf) || lread8bytes(li, &sh->sh_entsize, mf)) errstruct(); } }