Mercurial > lcfOS
diff python/elffile.py @ 118:db8aafe00d27
Added elf file read scripts
author | Windel Bouwman |
---|---|
date | Sat, 12 Jan 2013 09:39:23 +0100 |
parents | |
children | bbf4c9b138d4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/elffile.py Sat Jan 12 09:39:23 2013 +0100 @@ -0,0 +1,68 @@ +import struct + +classes = {1:'ELF32', 2:'ELF64'} + +class ElfFile: + def __init__(self, f): + self.f = f + self.parse() + def parse(self): + self.parseHeader() + self.parseSections() + self.parsePrograms() + @property + def ElfClass(self): + return classes[self.ei_class] + def parseHeader(self): + # Parse identifier + e_ident = self.f.read(16) + ELFMAGIC = bytes([0x7f]) + b'ELF' + assert e_ident[0:4] == ELFMAGIC + self.ei_class = e_ident[4] + print('ELF class: ', self.ElfClass) + assert self.ei_class in classes.keys() + self.ei_data = e_ident[5] + print('ei_data:', self.ei_data) + ei_version = e_ident[6] + assert ei_version == 1 + + # rest of the ELF header: + e_type = self.readHalf() + e_machine = self.readHalf() + e_version = self.readWord() + e_entry = self.readAddr() + e_phoff = self.readOff() + e_shoff = self.readOff() + e_flags = self.readWord() + e_ehsize = self.readHalf() + e_phentsize = self.readHalf() + e_phnum = self.readHalf() + e_shentsize = self.readHalf() + e_shnum = self.readHalf() + e_shstrndx = self.readHalf() + + if self.ei_class == 1: + assert e_ehsize == 52 + elif self.ei_class == 2: + assert e_ehsize == 64 + print('program header size', e_phentsize, e_phnum) + print('section header size', e_shentsize, e_shnum, e_shstrndx) + def readFmt(self, fmt): + size = struct.calcsize(fmt) + return struct.unpack(fmt, self.f.read(size)) + def readHalf(self): + return self.readFmt('<H')[0] + def readWord(self): + return self.readFmt('<I')[0] + def readAddr(self): + if self.ei_class == 1: + fmt = '<I' + elif self.ei_class == 2: + fmt = '<Q' + else: + raise Exception() + return self.readFmt(fmt)[0] + readOff = readAddr + + def printProgramHeaders(self): + pass