ida_fixup ========= .. py:module:: ida_fixup .. autoapi-nested-parse:: Functions that deal with fixup information. A loader should setup fixup information using set_fixup(). Attributes ---------- .. autoapisummary:: ida_fixup.SWIG_PYTHON_LEGACY_BOOL ida_fixup.FIXUP_OFF8 ida_fixup.FIXUP_OFF16 ida_fixup.FIXUP_SEG16 ida_fixup.FIXUP_PTR16 ida_fixup.FIXUP_OFF32 ida_fixup.FIXUP_PTR32 ida_fixup.FIXUP_HI8 ida_fixup.FIXUP_HI16 ida_fixup.FIXUP_LOW8 ida_fixup.FIXUP_LOW16 ida_fixup.V695_FIXUP_VHIGH ida_fixup.V695_FIXUP_VLOW ida_fixup.FIXUP_OFF64 ida_fixup.FIXUP_OFF8S ida_fixup.FIXUP_OFF16S ida_fixup.FIXUP_OFF32S ida_fixup.FIXUP_CUSTOM ida_fixup.FIXUPF_REL ida_fixup.FIXUPF_EXTDEF ida_fixup.FIXUPF_UNUSED ida_fixup.FIXUPF_CREATED ida_fixup.FIXUPF_LOADER_MASK Classes ------- .. autoapisummary:: ida_fixup.fixup_data_t ida_fixup.fixup_info_t Functions --------- .. autoapisummary:: ida_fixup.is_fixup_custom ida_fixup.get_fixup ida_fixup.exists_fixup ida_fixup.set_fixup ida_fixup.del_fixup ida_fixup.get_first_fixup_ea ida_fixup.get_next_fixup_ea ida_fixup.get_prev_fixup_ea ida_fixup.get_fixup_handler ida_fixup.get_fixup_value ida_fixup.patch_fixup_value ida_fixup.get_fixup_desc ida_fixup.calc_fixup_size ida_fixup.find_custom_fixup ida_fixup.get_fixups ida_fixup.contains_fixups ida_fixup.gen_fix_fixups ida_fixup.handle_fixups_in_macro Module Contents --------------- .. py:data:: SWIG_PYTHON_LEGACY_BOOL .. py:data:: FIXUP_OFF8 8-bit offset .. py:data:: FIXUP_OFF16 16-bit offset .. py:data:: FIXUP_SEG16 16-bit base-logical segment base (selector) .. py:data:: FIXUP_PTR16 32-bit long pointer (16-bit base:16-bit offset) .. py:data:: FIXUP_OFF32 32-bit offset .. py:data:: FIXUP_PTR32 48-bit pointer (16-bit base:32-bit offset) .. py:data:: FIXUP_HI8 high 8 bits of 16bit offset .. py:data:: FIXUP_HI16 high 16 bits of 32bit offset .. py:data:: FIXUP_LOW8 low 8 bits of 16bit offset .. py:data:: FIXUP_LOW16 low 16 bits of 32bit offset .. py:data:: V695_FIXUP_VHIGH obsolete .. py:data:: V695_FIXUP_VLOW obsolete .. py:data:: FIXUP_OFF64 64-bit offset .. py:data:: FIXUP_OFF8S 8-bit signed offset .. py:data:: FIXUP_OFF16S 16-bit signed offset .. py:data:: FIXUP_OFF32S 32-bit signed offset .. py:data:: FIXUP_CUSTOM start of the custom types range .. py:function:: is_fixup_custom(type: fixup_type_t) -> bool Is fixup processed by processor module? .. py:data:: FIXUPF_REL fixup is relative to the linear address `base`. Otherwise fixup is relative to the start of the segment with `sel` selector. .. py:data:: FIXUPF_EXTDEF target is a location (otherwise - segment). Use this bit if the target is a symbol rather than an offset from the beginning of a segment. .. py:data:: FIXUPF_UNUSED fixup is ignored by IDA * disallows the kernel to convert operands * this fixup is not used during output .. py:data:: FIXUPF_CREATED fixup was not present in the input file .. py:data:: FIXUPF_LOADER_MASK additional flags. The bits from this mask are not stored in the database and can be used by the loader at its discretion. .. py:class:: fixup_data_t(*args) Bases: :py:obj:`object` .. py:attribute:: thisown .. py:attribute:: sel :type: sel_t selector of the target segment. BADSEL means an absolute (zero based) target. .. py:attribute:: off :type: ida_idaapi.ea_t target offset .. py:attribute:: displacement :type: adiff_t displacement (offset from the target) .. py:method:: get_type() -> fixup_type_t Fixup type Types of fixups. .. py:method:: set_type(type_: fixup_type_t) -> None .. py:method:: set_type_and_flags(type_: fixup_type_t, flags_: int = 0) -> None .. py:method:: is_custom() -> bool is_fixup_custom() .. py:method:: get_flags() -> int Fixup flags Fixup flags. .. py:method:: is_extdef() -> bool .. py:method:: set_extdef() -> None .. py:method:: clr_extdef() -> None .. py:method:: is_unused() -> bool .. py:method:: set_unused() -> None .. py:method:: clr_unused() -> None .. py:method:: has_base() -> bool Is fixup relative? .. py:method:: was_created() -> bool Is fixup artificial? .. py:method:: get_base() -> ida_idaapi.ea_t Get base of fixup. .. py:method:: set_base(new_base: ida_idaapi.ea_t) -> None Set base of fixup. The target should be set before a call of this function. .. py:method:: set_sel(seg: segment_t const *) -> None .. py:method:: set_target_sel() -> None Set selector of fixup to the target. The target should be set before a call of this function. .. py:method:: set(source: ida_idaapi.ea_t) -> None set_fixup() .. py:method:: get(source: ida_idaapi.ea_t) -> bool get_fixup() .. py:method:: get_handler() -> fixup_handler_t const * get_fixup_handler() .. py:method:: get_desc(source: ida_idaapi.ea_t) -> str get_fixup_desc() .. py:method:: calc_size() -> int calc_fixup_size() .. py:method:: get_value(ea: ida_idaapi.ea_t) -> int get_fixup_value() .. py:method:: patch_value(ea: ida_idaapi.ea_t) -> bool patch_fixup_value() .. py:function:: get_fixup(fd: fixup_data_t, source: ida_idaapi.ea_t) -> bool Get fixup information. .. py:function:: exists_fixup(source: ida_idaapi.ea_t) -> bool Check that a fixup exists at the given address. .. py:function:: set_fixup(source: ida_idaapi.ea_t, fd: fixup_data_t) -> None Set fixup information. You should fill fixup_data_t and call this function and the kernel will remember information in the database. :param source: the fixup source address, i.e. the address modified by the fixup :param fd: fixup data .. py:function:: del_fixup(source: ida_idaapi.ea_t) -> None Delete fixup information. .. py:function:: get_first_fixup_ea() -> ida_idaapi.ea_t .. py:function:: get_next_fixup_ea(ea: ida_idaapi.ea_t) -> ida_idaapi.ea_t .. py:function:: get_prev_fixup_ea(ea: ida_idaapi.ea_t) -> ida_idaapi.ea_t .. py:function:: get_fixup_handler(type: fixup_type_t) -> fixup_handler_t const * Get handler of standard or custom fixup. .. py:function:: get_fixup_value(ea: ida_idaapi.ea_t, type: fixup_type_t) -> int Get the operand value. This function get fixup bytes from data or an instruction at `ea` and convert them to the operand value (maybe partially). It is opposite in meaning to the `patch_fixup_value()`. For example, FIXUP_HI8 read a byte at `ea` and shifts it left by 8 bits, or AArch64's custom fixup BRANCH26 get low 26 bits of the insn at `ea` and shifts it left by 2 bits. This function is mainly used to get a relocation addend. :param ea: address to get fixup bytes from, the size of the fixup bytes depends on the fixup type. :param type: fixup type :returns: operand: value .. py:function:: patch_fixup_value(ea: ida_idaapi.ea_t, fd: fixup_data_t) -> bool Patch the fixup bytes. This function updates data or an instruction at `ea` to the fixup bytes. For example, FIXUP_HI8 updates a byte at `ea` to the high byte of `fd->off`, or AArch64's custom fixup BRANCH26 updates low 26 bits of the insn at `ea` to the value of `fd->off` shifted right by 2. :param ea: address where data are changed, the size of the changed data depends on the fixup type. :param fd: fixup data :returns: false: the fixup bytes do not fit (e.g. `fd->off` is greater than 0xFFFFFFC for BRANCH26). The database is changed even in this case. .. py:function:: get_fixup_desc(source: ida_idaapi.ea_t, fd: fixup_data_t) -> str Get FIXUP description comment. .. py:function:: calc_fixup_size(type: fixup_type_t) -> int Calculate size of fixup in bytes (the number of bytes the fixup patches) :returns: -1: means error .. py:function:: find_custom_fixup(name: str) -> fixup_type_t .. py:class:: fixup_info_t Bases: :py:obj:`object` .. py:attribute:: thisown .. py:attribute:: ea :type: ida_idaapi.ea_t .. py:attribute:: fd :type: fixup_data_t .. py:function:: get_fixups(out: fixups_t *, ea: ida_idaapi.ea_t, size: asize_t) -> bool .. py:function:: contains_fixups(ea: ida_idaapi.ea_t, size: asize_t) -> bool Does the specified address range contain any fixup information? .. py:function:: gen_fix_fixups(_from: ida_idaapi.ea_t, to: ida_idaapi.ea_t, size: asize_t) -> None Relocate the bytes with fixup information once more (generic function). This function may be called from loader_t::move_segm() if it suits the goal. If loader_t::move_segm is not defined then this function will be called automatically when moving segments or rebasing the entire program. Special parameter values (from = BADADDR, size = 0, to = delta) are used when the function is called from rebase_program(delta). .. py:function:: handle_fixups_in_macro(ri: refinfo_t, ea: ida_idaapi.ea_t, other: fixup_type_t, macro_reft_and_flags: int) -> bool Handle two fixups in a macro. We often combine two instruction that load parts of a value into one macro instruction. For example: ADRP X0, #var@PAGE ADD X0, X0, #var@PAGEOFF --> ADRL X0, var lui $v0, %hi(var) addiu $v0, $v0, %lo(var) --> la $v0, var :returns: success ('false' means that RI was not changed)