def __init__(self, fd, inmem=False): # Grab a 32bit header to use to check for other # machine types... e = vs_elf.Elf32() fd.seek(0) bytes = fd.read(len(e)) e.vsParse(bytes) #Parse 32bit header if e.e_class == ELFCLASS32: vs_elf.Elf32.__init__(self) self.bits = 32 self.psize = 4 self._cls_reloc = Elf32Reloc self._cls_reloca = Elf32Reloca self._cls_symbol = Elf32Symbol self._cls_section = Elf32Section #Parse 64bit header elif e.e_class == ELFCLASS64: vs_elf.Elf64.__init__(self) self.bits = 64 self.psize = 8 self._cls_reloc = Elf64Reloc self._cls_reloca = Elf64Reloca self._cls_symbol = Elf64Symbol self._cls_section = Elf64Section else: raise Exception('Unrecognized e_class: %d' % e.e_class) self.fd = fd bytes = self.readAtOffset(0, len(self)) self.vsParse(bytes) if self.e_machine == EM_386: self.r_types = r_types_386 elif self.e_machine == EM_X86_64: self.r_types = r_types_amd64 else: self.r_types = {} self.pheaders = [] self.sections = [] self.secnames = {} self.symbols = [] self.relocs = [] self.symbols_by_name = {} self.symbols_by_addr = {} self.dynamics = [] self.dynamic_symbols = [] self._parsePheaders() self._parseSections() self._parseSymbols() self._parseDynamic() self._parseRelocs()
def __init__(self, fd, inmem=False): ''' Parse data from 'fd' and create an Elf object. This process attempts to get as much information from DYNAMICS as possible, then adds in data from SECTIONS. ''' # Grab a 32bit header to use to check for other # machine types... e = vs_elf.Elf32() fd.seek(0) bytes = fd.read(len(e)) e.vsParse(bytes) # if e_data == 1, then 32 bit, if e_data == 2, 64bit bigend = (e.e_data == ELFDATA2MSB) #Parse 32bit header if e.e_class == ELFCLASS32: vs_elf.Elf32.__init__(self, bigend=bigend) self.bits = 32 self.psize = 4 self._cls_reloc = Elf32Reloc self._cls_reloca = Elf32Reloca self._cls_symbol = Elf32Symbol self._cls_section = Elf32Section #Parse 64bit header elif e.e_class == ELFCLASS64: vs_elf.Elf64.__init__(self, bigend=bigend) self.bits = 64 self.psize = 8 self._cls_reloc = Elf64Reloc self._cls_reloca = Elf64Reloca self._cls_symbol = Elf64Symbol self._cls_section = Elf64Section else: raise Exception('Unrecognized e_class: %d' % e.e_class) self.fd = fd self.inmem = inmem self.bigend = bigend bytes = self.readAtOffset(0, len(self)) self.vsParse(bytes) if self.e_machine == EM_386: self.r_types = r_types_386 elif self.e_machine == EM_X86_64: self.r_types = r_types_amd64 else: self.r_types = {} self.pheaders = [] self.sections = [] self.secnames = {} self.symbols = [] self.relocs = [] self.relocvas = [] self.symbols_by_name = {} self.symbols_by_addr = {} self.dynamics = [] # deprecated - 2019-10-21 self.dynamic_symbols = [] self.dynstrtabmeta = (None, None) self.dynstrtab = [] self.dynsymtabct = None # populated by _parseDynStrs() logger.info('self._parsePheaders') self._parsePheaders() logger.info('self._parseDynLinkInfo') self._parseDynLinkInfo() logger.info('self._parseSections') self._parseSections() logger.info('self._parseDynamicsFromSections') self._parseDynamicsFromSections() # load symbols and relocs from DYNAMICS logger.info('self._parseDynStrs') self._parseDynStrs() logger.info('self._parseDynSyms') self._parseDynSyms() logger.info('self._parseDynRelocs') self._parseDynRelocs() # load symbols and relocs from SECTIONS logger.info('self._parseDynSymsFromSections') self._parseDynSymsFromSections() logger.info('self._parseSectionSymbols') self._parseSectionSymbols() logger.info('self._parseSectionRelocs') self._parseSectionRelocs() logger.info('done parsing ELF')