Parse section header.

This commit is contained in:
Jussi Pakkanen 2013-02-03 14:11:04 +02:00
parent 732a1b0000
commit 60905c9663
1 changed files with 37 additions and 3 deletions

View File

@ -16,13 +16,41 @@
import sys, struct
class SectionHeader():
def __init__(self, ifile):
#Elf64_Word
self.sh_name = struct.unpack('I', ifile.read(4))[0];
#Elf64_Word
self.sh_type = struct.unpack('I', ifile.read(4))[0]
#Elf64_Xword
self.sh_flags = struct.unpack('Q', ifile.read(8))[0];
#Elf64_Addr
self.sh_addr = struct.unpack('Q', ifile.read(8))[0];
#Elf64_Off
self.sh_offset = struct.unpack('Q', ifile.read(8))[0]
#Elf64_Xword
self.sh_size = struct.unpack('Q', ifile.read(8))[0];
#Elf64_Word
self.sh_link = struct.unpack('I', ifile.read(4))[0];
#Elf64_Word
self.sh_info = struct.unpack('I', ifile.read(4))[0];
#Elf64_Xword
self.sh_addralign = struct.unpack('Q', ifile.read(4))[0];
#Elf64_Xword
self.sh_entsize = struct.unpack('Q', ifile.read(8))[0];
class Elf():
def __init__(self, bfile):
self.bfile = bfile
self.bf = open(bfile, 'rb')
self.ident = struct.unpack('16s', self.bf.read(16))[0]
if self.ident[1:4] != b'ELF':
raise RuntimeError('File "%s" is not an ELF file.' % bfile)
self.parse_header()
self.parse_sections()
def parse_header(self):
self.e_ident = struct.unpack('16s', self.bf.read(16))[0]
if self.e_ident[1:4] != b'ELF':
raise RuntimeError('File "%s" is not an ELF file.' % self.bfile)
self.e_type = struct.unpack('h', self.bf.read(2))[0]
self.e_machine = struct.unpack('h', self.bf.read(2))[0]
self.e_version = struct.unpack('i', self.bf.read(4))[0]
@ -37,6 +65,12 @@ class Elf():
self.e_shnum = struct.unpack('h', self.bf.read(2))[0]
self.e_shstrndx = struct.unpack('h', self.bf.read(2))[0]
def parse_sections(self):
self.bf.seek(self.e_shoff)
self.sections = []
for i in range(self.e_shnum):
self.sections.append(self.bf)
def remove_rpath(bfile):
elf = Elf(bfile)