예제 #1
0
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'))
예제 #2
0
파일: assembler.py 프로젝트: LOpSSH/Cwerg
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'))
예제 #3
0
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'))
예제 #4
0
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)