def create_file_class(elfclass): elfclass = common_merger.create_file_class(elfclass) class Rel(elfclass.relSectionClass.relClass): def __init__(self, data = None): super(Rel, self).__init__(data) def _get_args(self, append, relocatable = None): args = {} args['T'] = self.type args['BS'] = self.symbol.section.offset args['S'] = self.symbol.get_real_value(relocatable) args['P'] = self.get_real_offset(relocatable) args['A'] = append return args def get_real_append(self, relocatable = None): args = self._get_args(self.get_append()) args['forward'] = True addr = arm_rel_op(**args) return addr def set_real_append(self, value, relocatable = None): args = self._get_args(value) args['forward'] = False addr = arm_rel_op(**args) self.set_append(addr) class RelSection(elfclass.relSectionClass): relClass = Rel PLT_ENTRY_SIZE = 0xC PLT_ENTRY_OFFSET_SIZE = 0x14 def __init__(self, data = None): super(RelSection, self).__init__(data) def translate_arch(self, old, new): if new.type == elffile.R_ARM.byname['R_ARM_CALL'].code: # Compile a BL assert (new.symbol.get_real_value() % 4) == 0 assert (new.get_real_offset() % 4) == 0 offset = (new.symbol.get_real_value() - new.get_real_offset() - 8) / 4 asm = bitstring.pack('intle:24, bin:4, bin:3, bin:1', offset, '0b1110', '0b101', '0b1') new.symbol = self.sym_section.symbols[0] new.set_append(asm.tobytes()) new.type = elffile.R_ARM.byname['R_ARM_NONE'].code elif new.type == elffile.R_ARM.byname['R_ARM_REL32'].code: addr = new.get_real_append(True) new.symbol = self.sym_section.symbols[0] new.type = elffile.R_ARM.byname['R_ARM_NONE'].code new.set_real_append(addr) elif new.type == elffile.R_ARM.byname['R_ARM_ABS32'].code: addr = new.get_real_append(True) new.type = elffile.R_ARM.byname['R_ARM_RELATIVE'].code new.symbol = self.sym_section.symbols[0] new.set_real_append(addr) else: raise NotImplementedError("Can't handle relocation type %s" % (elffile.R_ARM.bycode[new.type].name)) return new class File(elfclass): relSectionClass = RelSection def __init__(self, name, efi): super(File, self).__init__(name, efi) return File
def create_file_class(elfclass): elfclass = common_merger.create_file_class(elfclass) class Rel(elfclass.relSectionClass.relClass): def __init__(self, data = None): super(Rel, self).__init__(data) def _get_args(self, append, relocatable = None): args = {} args['T'] = self.type args['BS'] = self.symbol.section.offset args['S'] = self.symbol.get_real_value(relocatable) args['P'] = self.get_real_offset(relocatable) args['A'] = append return args def get_real_append(self, relocatable = None): args = self._get_args(self.get_append()) args['forward'] = True addr = arm_rel_op(**args) return addr def set_real_append(self, value, relocatable = None): args = self._get_args(value) args['forward'] = False addr = arm_rel_op(**args) self.set_append(addr) class RelSection(elfclass.relSectionClass): relClass = Rel PLT_ENTRY_SIZE = 0xC PLT_ENTRY_OFFSET_SIZE = 0x14 def __init__(self, data = None): super(RelSection, self).__init__(data) def translate_arch(self, old, new): if new.type == elffile.R_ARM.byname['R_ARM_CALL'].code: # Compile a BL rcore.assembler.set_pc(new.get_real_offset()) op = "bl %d" % (new.symbol.get_real_value()) masm = rcore.assembler.massemble(op) new.symbol = self.sym_section.symbols[0] new.set_append(bytearray.fromhex(masm.buf_hex)) new.type = elffile.R_ARM.byname['R_ARM_NONE'].code elif new.type == elffile.R_ARM.byname['R_ARM_REL32'].code: addr = new.get_real_append(True) new.symbol = self.sym_section.symbols[0] new.type = elffile.R_ARM.byname['R_ARM_NONE'].code new.set_real_append(addr) elif new.type == elffile.R_ARM.byname['R_ARM_ABS32'].code: addr = new.get_real_append(True) new.type = elffile.R_ARM.byname['R_ARM_RELATIVE'].code new.symbol = self.sym_section.symbols[0] new.set_real_append(addr) else: raise NotImplementedError("Can't handle relocation type %s" % (elffile.R_ARM.bycode[new.type].name)) return new class File(elfclass): relSectionClass = RelSection def __init__(self, name, efi): super(File, self).__init__(name, efi) return File