def AddIns(unit: elf_unit.Unit, ins: a64.Ins): if ins.has_reloc(): sym = unit.FindOrAddSymbol(ins.reloc_symbol, ins.is_local_sym) unit.AddReloc(ins.reloc_kind, unit.sec_text, sym, ins.operands[ins.reloc_pos]) ins.clear_reloc() unit.sec_text.AddData(a64.Assemble(ins).to_bytes(4, byteorder='little'))
def AddIns(unit: elf_unit.Unit, ins: a32.Ins): if ins.reloc_kind != elf_enum.RELOC_TYPE_ARM.NONE: sym = unit.FindOrAddSymbol(ins.reloc_symbol, ins.is_local_sym) unit.AddReloc(ins.reloc_kind, unit.sec_text, sym, ins.operands[ins.reloc_pos]) # clear reloc info before proceeding ins.reloc_kind = elf_enum.RELOC_TYPE_ARM.NONE ins.operands[ins.reloc_pos] = 0 unit.sec_text.AddData(a32.Assemble(ins).to_bytes(4, byteorder='little'))
def HandleOpcode(mnemonic, token: List[str], unit: elf_unit.Unit): ins = symbolic.InsFromSymbolized(mnemonic, token) if ins.reloc_kind != elf_enum.RELOC_TYPE_AARCH64.NONE: sym = unit.FindOrAddSymbol(ins.reloc_symbol, ins.is_local_sym) unit.AddReloc(ins.reloc_kind, unit.sec_text, sym, ins.operands[ins.reloc_pos]) # clear reloc info before proceeding ins.reloc_kind = elf_enum.RELOC_TYPE_AARCH64.NONE ins.operands[ins.reloc_pos] = 0 unit.sec_text.AddData(a64.Assemble(ins).to_bytes(4, byteorder='little'))
def AddIns(unit: elf_unit.Unit, ins: x64.Ins): if ins.has_reloc(): sym = unit.FindOrAddSymbol(ins.reloc_symbol, ins.is_local_sym) kind = ins.reloc_kind addend = ins.operands[ins.reloc_pos] ins.clear_reloc() # we need to clear the reloc info BEFORE assembling ins_data = bytes(x64.Assemble( ins)) # note we do not know the exact length because of prefixes distance_to_ins_end = _RelocFieldOffsetFromEndOfIns(ins.opcode) if kind in {enum_tab.RELOC_TYPE_X86_64.PC32}: addend -= distance_to_ins_end unit.AddReloc(kind, unit.sec_text, sym, addend, len(ins_data) - distance_to_ins_end) else: ins_data = bytes(x64.Assemble(ins)) unit.sec_text.AddData(ins_data)