blob: 2a5485c02f70f01833d65db2e59552d1fb11b16e [file] [log] [blame]
ebendersec1e0882011-09-07 15:36:11 +03001import sys
ebenders198538a2011-09-07 11:12:47 +03002from elftools.elf.structs import ELFStructs
ebendersaa9f6712011-09-08 11:27:53 +03003from elftools.elf.elffile import ELFFile
elibenad4d5892011-09-08 16:57:21 +03004from elftools.elf.sections import *
ebenders198538a2011-09-07 11:12:47 +03005
ebendersec1e0882011-09-07 15:36:11 +03006# read a little-endian, 64-bit file
ebenderse790d0d2011-09-07 15:21:07 +03007es = ELFStructs(True, 64)
8
ebenderse790d0d2011-09-07 15:21:07 +03009stream = open('binfiles/z.elf', 'rb')
ebendersec1e0882011-09-07 15:36:11 +030010
ebendersaa9f6712011-09-08 11:27:53 +030011efile = ELFFile(stream)
ebendersec1e0882011-09-07 15:36:11 +030012
eliben75b5fde2011-09-08 16:24:49 +030013print '===> %s sections!' % efile.num_sections()
14print '===> %s segments!' % efile.num_segments()
15
elibena6416fd2011-09-08 14:49:30 +030016for sec in efile.iter_sections():
elibenad4d5892011-09-08 16:57:21 +030017 print type(sec), sec.name
18 if isinstance(sec, SymbolTableSection):
19 print ' linked string table:', sec.stringtable.name
elibena6416fd2011-09-08 14:49:30 +030020
21for seg in efile.iter_segments():
22 print seg['p_type'], seg['p_offset']
23
elibenad4d5892011-09-08 16:57:21 +030024
elibena6416fd2011-09-08 14:49:30 +030025#~ print 'num', efile.num_sections()
26#~ sec = efile.get_section(39)
ebendersa06062f2011-09-08 12:37:48 +030027#~ print sec.header
elibena6416fd2011-09-08 14:49:30 +030028#~ print sec.name
29#~ print sec['sh_type']
30#~ print map(ord, sec.data())
ebendersa06062f2011-09-08 12:37:48 +030031
32#~ print sec.stream
33#~ print map(ord, efile._stringtable)
34
ebendersaa9f6712011-09-08 11:27:53 +030035#~ print efile.header
36#~ print dir(efile)
37#~ print efile['e_type']
38
ebendersa06062f2011-09-08 12:37:48 +030039#~ shtable_offset = efile['e_shoff']
40#~ strtable_section_offset = shtable_offset + efile['e_shstrndx'] * efile['e_shentsize']
ebendersec1e0882011-09-07 15:36:11 +030041
ebendersa06062f2011-09-08 12:37:48 +030042#~ # get to the section header for the sh string table
43#~ print strtable_section_offset
44#~ stream.seek(strtable_section_offset)
45#~ sheader = es.Elf_Shdr.parse_stream(stream)
46#~ print sheader
ebendersec1e0882011-09-07 15:36:11 +030047
ebendersa06062f2011-09-08 12:37:48 +030048#~ # yay, looks correct!!
49#~ stream.seek(sheader.sh_offset)
50#~ buf = stream.read(sheader.sh_size)
51#~ for c in buf:
52 #~ sys.stdout.write('%02X' % ord(c))
ebendersec1e0882011-09-07 15:36:11 +030053
54
ebenderse790d0d2011-09-07 15:21:07 +030055
56
57#~ print es.Elf_Ehdr