diff options
Diffstat (limited to 'test/Scripts/elf-dump')
-rwxr-xr-x | test/Scripts/elf-dump | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/test/Scripts/elf-dump b/test/Scripts/elf-dump deleted file mode 100755 index 61342d8..0000000 --- a/test/Scripts/elf-dump +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/env python - -import struct -import sys -import StringIO - -import common_dump - -class Reader: - def __init__(self, path): - if path == "-": - # Snarf all the data so we can seek. - self.file = StringIO.StringIO(sys.stdin.read()) - else: - self.file = open(path, "rb") - self.isLSB = None - self.is64Bit = None - self.isN64 = False - - def seek(self, pos): - self.file.seek(pos) - - def read(self, N): - data = self.file.read(N) - if len(data) != N: - raise ValueError, "Out of data!" - return data - - def read8(self): - return (ord(self.read(1)), 8) - - def read16(self): - return (struct.unpack('><'[self.isLSB] + 'H', self.read(2))[0], 16) - - def read32(self): - return (struct.unpack('><'[self.isLSB] + 'I', self.read(4))[0], 32) - - def read64(self): - return (struct.unpack('><'[self.isLSB] + 'Q', self.read(8))[0], 64) - - def readWord(self): - if self.is64Bit: - return self.read64() - else: - return self.read32() - -class StringTable: - def __init__(self, strings): - self.string_table = strings - - def __getitem__(self, index): - end = self.string_table.index('\x00', index) - return self.string_table[index:end] - -class ProgramHeader: - def __init__(self, f): - self.p_type = f.read32() - if f.is64Bit: - self.p_flags = f.read32() - self.p_offset = f.readWord() - self.p_vaddr = f.readWord() - self.p_paddr = f.readWord() - self.p_filesz = f.readWord() - self.p_memsz = f.readWord() - if not f.is64Bit: - self.p_flags = f.read32() - self.p_align = f.readWord() - - def dump(self): - print " (('p_type', %s)" % common_dump.HexDump(self.p_type) - print " ('p_flags', %s)" % common_dump.HexDump(self.p_flags) - print " ('p_offset', %s)" % common_dump.HexDump(self.p_offset) - print " ('p_vaddr', %s)" % common_dump.HexDump(self.p_vaddr) - print " ('p_paddr', %s)" % common_dump.HexDump(self.p_paddr) - print " ('p_filesz', %s)" % common_dump.HexDump(self.p_filesz) - print " ('p_memsz', %s)" % common_dump.HexDump(self.p_memsz) - print " ('p_align', %s)" % common_dump.HexDump(self.p_align) - print " )," - -class Section: - def __init__(self, f): - self.sh_name = f.read32() - self.sh_type = f.read32() - self.sh_flags = f.readWord() - self.sh_addr = f.readWord() - self.sh_offset = f.readWord() - self.sh_size = f.readWord() - self.sh_link = f.read32() - self.sh_info = f.read32() - self.sh_addralign = f.readWord() - self.sh_entsize = f.readWord() - - def dump(self, shstrtab, f, strtab, dumpdata): - print " (('sh_name', %s)" % common_dump.HexDump(self.sh_name), "# %r" % shstrtab[self.sh_name[0]] - print " ('sh_type', %s)" % common_dump.HexDump(self.sh_type) - print " ('sh_flags', %s)" % common_dump.HexDump(self.sh_flags) - print " ('sh_addr', %s)" % common_dump.HexDump(self.sh_addr) - print " ('sh_offset', %s)" % common_dump.HexDump(self.sh_offset) - print " ('sh_size', %s)" % common_dump.HexDump(self.sh_size) - print " ('sh_link', %s)" % common_dump.HexDump(self.sh_link) - print " ('sh_info', %s)" % common_dump.HexDump(self.sh_info) - print " ('sh_addralign', %s)" % common_dump.HexDump(self.sh_addralign) - print " ('sh_entsize', %s)" % common_dump.HexDump(self.sh_entsize) - if self.sh_type[0] == 2: # SHT_SYMTAB - print " ('_symbols', [" - dumpSymtab(f, self, strtab) - print " ])" - elif self.sh_type[0] == 4 or self.sh_type[0] == 9: # SHT_RELA / SHT_REL - print " ('_relocations', [" - dumpRel(f, self, self.sh_type[0] == 4) - print " ])" - elif dumpdata: - f.seek(self.sh_offset[0]) - if self.sh_type != 8: # != SHT_NOBITS - data = f.read(self.sh_size[0]) - print " ('_section_data', '%s')" % common_dump.dataToHex(data) - else: - print " ('_section_data', '')" - print " )," - -def dumpSymtab(f, section, strtab): - entries = section.sh_size[0] // section.sh_entsize[0] - - for index in range(entries): - f.seek(section.sh_offset[0] + index * section.sh_entsize[0]) - print " # Symbol %s" % index - name = f.read32() - print " (('st_name', %s)" % common_dump.HexDump(name), "# %r" % strtab[name[0]] - if not f.is64Bit: - print " ('st_value', %s)" % common_dump.HexDump(f.read32()) - print " ('st_size', %s)" % common_dump.HexDump(f.read32()) - st_info = f.read8()[0] - st_bind = (st_info >> 4, 4) - st_type = (st_info & 0xf, 4) - print " ('st_bind', %s)" % common_dump.HexDump(st_bind) - print " ('st_type', %s)" % common_dump.HexDump(st_type) - print " ('st_other', %s)" % common_dump.HexDump(f.read8()) - print " ('st_shndx', %s)" % common_dump.HexDump(f.read16()) - if f.is64Bit: - print " ('st_value', %s)" % common_dump.HexDump(f.read64()) - print " ('st_size', %s)" % common_dump.HexDump(f.read64()) - print " )," - -def dumpRel(f, section, dumprela = False): - entries = section.sh_size[0] // section.sh_entsize[0] - - for index in range(entries): - f.seek(section.sh_offset[0] + index * section.sh_entsize[0]) - print " # Relocation %s" % index - print " (('r_offset', %s)" % common_dump.HexDump(f.readWord()) - - if f.isN64: - r_sym = f.read32() - r_ssym = f.read8() - r_type3 = f.read8() - r_type2 = f.read8() - r_type = f.read8() - print " ('r_sym', %s)" % common_dump.HexDump(r_sym) - print " ('r_ssym', %s)" % common_dump.HexDump(r_ssym) - print " ('r_type3', %s)" % common_dump.HexDump(r_type3) - print " ('r_type2', %s)" % common_dump.HexDump(r_type2) - print " ('r_type', %s)" % common_dump.HexDump(r_type) - else: - r_info = f.readWord()[0] - if f.is64Bit: - r_sym = (r_info >> 32, 32) - r_type = (r_info & 0xffffffff, 32) - else: - r_sym = (r_info >> 8, 24) - r_type = (r_info & 0xff, 8) - print " ('r_sym', %s)" % common_dump.HexDump(r_sym) - print " ('r_type', %s)" % common_dump.HexDump(r_type) - if dumprela: - print " ('r_addend', %s)" % common_dump.HexDump(f.readWord()) - print " )," - -def dumpELF(path, opts): - f = Reader(path) - - magic = f.read(4) - assert magic == '\x7FELF' - - fileclass = f.read8() - if fileclass[0] == 1: # ELFCLASS32 - f.is64Bit = False - elif fileclass[0] == 2: # ELFCLASS64 - f.is64Bit = True - else: - raise ValueError, "Unknown file class %s" % common_dump.HexDump(fileclass) - print "('e_indent[EI_CLASS]', %s)" % common_dump.HexDump(fileclass) - - byteordering = f.read8() - if byteordering[0] == 1: # ELFDATA2LSB - f.isLSB = True - elif byteordering[0] == 2: # ELFDATA2MSB - f.isLSB = False - else: - raise ValueError, "Unknown byte ordering %s" % common_dump.HexDump(byteordering) - print "('e_indent[EI_DATA]', %s)" % common_dump.HexDump(byteordering) - - print "('e_indent[EI_VERSION]', %s)" % common_dump.HexDump(f.read8()) - print "('e_indent[EI_OSABI]', %s)" % common_dump.HexDump(f.read8()) - print "('e_indent[EI_ABIVERSION]', %s)" % common_dump.HexDump(f.read8()) - - f.seek(16) # Seek to end of e_ident. - - print "('e_type', %s)" % common_dump.HexDump(f.read16()) - - # Does any other architecture use N64? - e_machine = f.read16() - if e_machine[0] == 0x0008 and f.is64Bit: # EM_MIPS && 64 bit - f.isN64 = True - - print "('e_machine', %s)" % common_dump.HexDump(e_machine) - print "('e_version', %s)" % common_dump.HexDump(f.read32()) - print "('e_entry', %s)" % common_dump.HexDump(f.readWord()) - e_phoff = f.readWord() - print "('e_phoff', %s)" % common_dump.HexDump(e_phoff) - e_shoff = f.readWord() - print "('e_shoff', %s)" % common_dump.HexDump(e_shoff) - print "('e_flags', %s)" % common_dump.HexDump(f.read32()) - print "('e_ehsize', %s)" % common_dump.HexDump(f.read16()) - e_phentsize = f.read16() - print "('e_phentsize', %s)" % common_dump.HexDump(e_phentsize) - e_phnum = f.read16() - print "('e_phnum', %s)" % common_dump.HexDump(e_phnum) - e_shentsize = f.read16() - print "('e_shentsize', %s)" % common_dump.HexDump(e_shentsize) - e_shnum = f.read16() - print "('e_shnum', %s)" % common_dump.HexDump(e_shnum) - e_shstrndx = f.read16() - print "('e_shstrndx', %s)" % common_dump.HexDump(e_shstrndx) - - - # Read all section headers - sections = [] - for index in range(e_shnum[0]): - f.seek(e_shoff[0] + index * e_shentsize[0]) - s = Section(f) - sections.append(s) - - # Read .shstrtab so we can resolve section names - f.seek(sections[e_shstrndx[0]].sh_offset[0]) - shstrtab = StringTable(f.read(sections[e_shstrndx[0]].sh_size[0])) - - # Get the symbol string table - strtab = None - for section in sections: - if shstrtab[section.sh_name[0]] == ".strtab": - f.seek(section.sh_offset[0]) - strtab = StringTable(f.read(section.sh_size[0])) - break - - print "('_sections', [" - for index in range(e_shnum[0]): - print " # Section %s" % index - sections[index].dump(shstrtab, f, strtab, opts.dumpSectionData) - print "])" - - # Read all program headers - headers = [] - for index in range(e_phnum[0]): - f.seek(e_phoff[0] + index * e_phentsize[0]) - h = ProgramHeader(f) - headers.append(h) - - print "('_ProgramHeaders', [" - for index in range(e_phnum[0]): - print " # Program Header %s" % index - headers[index].dump() - print "])" - -if __name__ == "__main__": - from optparse import OptionParser, OptionGroup - parser = OptionParser("usage: %prog [options] {files}") - parser.add_option("", "--dump-section-data", dest="dumpSectionData", - help="Dump the contents of sections", - action="store_true", default=False) - (opts, args) = parser.parse_args() - - if not args: - args.append('-') - - for arg in args: - dumpELF(arg, opts) |