|
IDAPython 9.0
|
A loader should setup fixup information using set_fixup().
Classes | |
| class | fixup_data_t |
| Proxy of C++ fixup_data_t class. More... | |
| class | fixup_info_t |
| Proxy of C++ fixup_info_t class. More... | |
Functions | |
| "bool" | is_fixup_custom ("fixup_type_t" type) |
| is_fixup_custom(type) -> bool Is fixup processed by processor module? | |
| "bool" | get_fixup ("fixup_data_t" fd, "ea_t" source) |
| get_fixup(fd, source) -> bool Get fixup information. | |
| "bool" | exists_fixup ("ea_t" source) |
| exists_fixup(source) -> bool Check that a fixup exists at the given address. | |
| "void" | set_fixup ("ea_t" source, "fixup_data_t" fd) |
| set_fixup(source, fd) Set fixup information. | |
| "void" | del_fixup ("ea_t" source) |
| del_fixup(source) Delete fixup information. | |
| "ea_t" | get_first_fixup_ea () |
| get_first_fixup_ea() -> ea_t | |
| "ea_t" | get_next_fixup_ea ("ea_t" ea) |
| get_next_fixup_ea(ea) -> ea_t Find next address with fixup information | |
| "ea_t" | get_prev_fixup_ea ("ea_t" ea) |
| get_prev_fixup_ea(ea) -> ea_t Find previous address with fixup information | |
| "fixup_handler_t const *" | get_fixup_handler ("fixup_type_t" type) |
| get_fixup_handler(type) -> fixup_handler_t const * Get handler of standard or custom fixup. | |
| "uval_t" | get_fixup_value ("ea_t" ea, "fixup_type_t" type) |
| get_fixup_value(ea, type) -> uval_t Get the operand value. | |
| "bool" | patch_fixup_value ("ea_t" ea, "fixup_data_t" fd) |
| patch_fixup_value(ea, fd) -> bool Patch the fixup bytes. | |
| "fixup_data_t const &" | get_fixup_desc ("ea_t" source, "fixup_data_t" fd) |
| get_fixup_desc(source, fd) -> str Get FIXUP description comment. | |
| "int" | calc_fixup_size ("fixup_type_t" type) |
| calc_fixup_size(type) -> int Calculate size of fixup in bytes (the number of bytes the fixup patches) | |
| "fixup_type_t" | find_custom_fixup ("char const *" name) |
| find_custom_fixup(name) -> fixup_type_t Get id of a custom fixup handler. | |
| "bool" | get_fixups ("fixups_t *" out, "ea_t" ea, "asize_t" size) |
| get_fixups(out, ea, size) -> bool | |
| "bool" | contains_fixups ("ea_t" ea, "asize_t" size) |
| contains_fixups(ea, size) -> bool Does the specified address range contain any fixup information? | |
| "void" | gen_fix_fixups ("ea_t" _from, "ea_t" to, "asize_t" size) |
| gen_fix_fixups(_from, to, size) Relocate the bytes with fixup information once more (generic function). | |
| "bool" | handle_fixups_in_macro ("refinfo_t" ri, "ea_t" ea, "fixup_type_t" other, "uint32" macro_reft_and_flags) |
| handle_fixups_in_macro(ri, ea, other, macro_reft_and_flags) -> bool Handle two fixups in a macro. | |
Variables | |
| FIXUP_OFF8 = _ida_fixup.FIXUP_OFF8 | |
| FIXUP_OFF16 = _ida_fixup.FIXUP_OFF16 | |
| FIXUP_SEG16 = _ida_fixup.FIXUP_SEG16 | |
| FIXUP_PTR16 = _ida_fixup.FIXUP_PTR16 | |
| FIXUP_OFF32 = _ida_fixup.FIXUP_OFF32 | |
| FIXUP_PTR32 = _ida_fixup.FIXUP_PTR32 | |
| FIXUP_HI8 = _ida_fixup.FIXUP_HI8 | |
| FIXUP_HI16 = _ida_fixup.FIXUP_HI16 | |
| FIXUP_LOW8 = _ida_fixup.FIXUP_LOW8 | |
| FIXUP_LOW16 = _ida_fixup.FIXUP_LOW16 | |
| V695_FIXUP_VHIGH = _ida_fixup.V695_FIXUP_VHIGH | |
| V695_FIXUP_VLOW = _ida_fixup.V695_FIXUP_VLOW | |
| FIXUP_OFF64 = _ida_fixup.FIXUP_OFF64 | |
| FIXUP_OFF8S = _ida_fixup.FIXUP_OFF8S | |
| FIXUP_OFF16S = _ida_fixup.FIXUP_OFF16S | |
| FIXUP_OFF32S = _ida_fixup.FIXUP_OFF32S | |
| FIXUP_CUSTOM = _ida_fixup.FIXUP_CUSTOM | |
| FIXUPF_REL = _ida_fixup.FIXUPF_REL | |
| FIXUPF_EXTDEF = _ida_fixup.FIXUPF_EXTDEF | |
| FIXUPF_UNUSED = _ida_fixup.FIXUPF_UNUSED | |
| FIXUPF_CREATED = _ida_fixup.FIXUPF_CREATED | |
| FIXUPF_LOADER_MASK = _ida_fixup.FIXUPF_LOADER_MASK | |
| "int" calc_fixup_size | ( | "fixup_type_t" | type | ) |
| -1 | means error |
| type | (C++: fixup_type_t) |
| "bool" contains_fixups | ( | "ea_t" | ea, |
| "asize_t" | size ) |
| ea | (C++: ea_t) |
| size | (C++: asize_t) |
| "void" del_fixup | ( | "ea_t" | source | ) |
| source | (C++: ea_t) |
| "bool" exists_fixup | ( | "ea_t" | source | ) |
| source | (C++: ea_t) |
| "fixup_type_t" find_custom_fixup | ( | "char const *" | name | ) |
| name | (C++: const char *) name of the custom fixup handler |
| "void" gen_fix_fixups | ( | "ea_t" | _from, |
| "ea_t" | to, | ||
| "asize_t" | size ) |
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).
| from | (C++: ea_t) |
| to | (C++: ea_t) |
| size | (C++: asize_t) |
| "ea_t" get_first_fixup_ea | ( | ) |
| "bool" get_fixup | ( | "fixup_data_t" | fd, |
| "ea_t" | source ) |
| fd | (C++: fixup_data_t *) |
| source | (C++: ea_t) |
| "fixup_data_t const &" get_fixup_desc | ( | "ea_t" | source, |
| "fixup_data_t" | fd ) |
| source | (C++: ea_t) |
| fd | (C++: const fixup_data_t &) fixup_data_t const & |
| "fixup_handler_t const *" get_fixup_handler | ( | "fixup_type_t" | type | ) |
| type | (C++: fixup_type_t) |
| "uval_t" get_fixup_value | ( | "ea_t" | ea, |
| "fixup_type_t" | type ) |
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.
| ea | (C++: ea_t) address to get fixup bytes from, the size of the fixup bytes depends on the fixup type. |
| type | (C++: fixup_type_t) fixup type |
| operand | value |
| "bool" get_fixups | ( | "fixups_t *" | out, |
| "ea_t" | ea, | ||
| "asize_t" | size ) |
| out | fixups_t * |
| ea | ea_t |
| size | asize_t |
| "ea_t" get_next_fixup_ea | ( | "ea_t" | ea | ) |
| ea | (C++: ea_t) current address |
| "ea_t" get_prev_fixup_ea | ( | "ea_t" | ea | ) |
| ea | (C++: ea_t) current address |
| "bool" handle_fixups_in_macro | ( | "refinfo_t" | ri, |
| "ea_t" | ea, | ||
| "fixup_type_t" | other, | ||
| "uint32" | macro_reft_and_flags ) |
We often combine two instruction that load parts of a value into one macro instruction. For example: ARM: ADRP X0, #var@PAGE ADD X0, X0, #var@PAGEOFF --> ADRL X0, var MIPS: lui $v0, hi(var) addiu $v0, $v0, lo(var) --> la $v0, var When applying the fixups that fall inside such a macro, we should convert them to one refinfo. This function does exactly that. It should be called from the apply() callback of a custom fixup.
| ri | (C++: refinfo_t *) |
| ea | (C++: ea_t) |
| other | (C++: fixup_type_t) |
| macro_reft_and_flags | (C++: uint32) |
| "bool" is_fixup_custom | ( | "fixup_type_t" | type | ) |
| type | (C++: fixup_type_t) |
| "bool" patch_fixup_value | ( | "ea_t" | ea, |
| "fixup_data_t" | fd ) |
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.
| ea | (C++: ea_t) address where data are changed, the size of the changed data depends on the fixup type. |
| fd | (C++: const fixup_data_t &) fixup data |
| 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. |
| "void" set_fixup | ( | "ea_t" | source, |
| "fixup_data_t" | fd ) |
You should fill fixup_data_t and call this function and the kernel will remember information in the database.
| source | (C++: ea_t) the fixup source address, i.e. the address modified by the fixup |
| fd | (C++: const fixup_data_t &) fixup data |
| FIXUP_CUSTOM = _ida_fixup.FIXUP_CUSTOM |
| FIXUP_HI16 = _ida_fixup.FIXUP_HI16 |
| FIXUP_HI8 = _ida_fixup.FIXUP_HI8 |
| FIXUP_LOW16 = _ida_fixup.FIXUP_LOW16 |
| FIXUP_LOW8 = _ida_fixup.FIXUP_LOW8 |
| FIXUP_OFF16 = _ida_fixup.FIXUP_OFF16 |
| FIXUP_OFF16S = _ida_fixup.FIXUP_OFF16S |
| FIXUP_OFF32 = _ida_fixup.FIXUP_OFF32 |
| FIXUP_OFF32S = _ida_fixup.FIXUP_OFF32S |
| FIXUP_OFF64 = _ida_fixup.FIXUP_OFF64 |
| FIXUP_OFF8 = _ida_fixup.FIXUP_OFF8 |
| FIXUP_OFF8S = _ida_fixup.FIXUP_OFF8S |
| FIXUP_PTR16 = _ida_fixup.FIXUP_PTR16 |
| FIXUP_PTR32 = _ida_fixup.FIXUP_PTR32 |
| FIXUP_SEG16 = _ida_fixup.FIXUP_SEG16 |
| FIXUPF_CREATED = _ida_fixup.FIXUPF_CREATED |
| FIXUPF_EXTDEF = _ida_fixup.FIXUPF_EXTDEF |
| FIXUPF_LOADER_MASK = _ida_fixup.FIXUPF_LOADER_MASK |
| FIXUPF_REL = _ida_fixup.FIXUPF_REL |
| FIXUPF_UNUSED = _ida_fixup.FIXUPF_UNUSED |
| V695_FIXUP_VHIGH = _ida_fixup.V695_FIXUP_VHIGH |
| V695_FIXUP_VLOW = _ida_fixup.V695_FIXUP_VLOW |