Lines Matching refs:reloc

143 static inline struct reloc *insn_jump_table(struct instruction *insn)  in insn_jump_table()
549 struct reloc *reloc; in add_pv_ops() local
559 reloc = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off); in add_pv_ops()
560 if (!reloc) in add_pv_ops()
563 idx = (reloc_offset(reloc) - sym->offset) / sizeof(unsigned long); in add_pv_ops()
565 func = reloc->sym; in add_pv_ops()
567 func = find_symbol_by_offset(reloc->sym->sec, in add_pv_ops()
568 reloc_addend(reloc)); in add_pv_ops()
570 ERROR_FUNC(reloc->sym->sec, reloc_addend(reloc), in add_pv_ops()
578 off = reloc_offset(reloc) + 1; in add_pv_ops()
928 struct reloc *reloc; in create_mcount_loc_sections() local
930 reloc = elf_init_reloc_text_sym(file->elf, sec, idx * addr_size, idx, in create_mcount_loc_sections()
932 if (!reloc) in create_mcount_loc_sections()
935 set_reloc_type(file->elf, reloc, addr_size == 8 ? R_ABS64 : R_ABS32); in create_mcount_loc_sections()
989 struct reloc *reloc; in add_ignores() local
995 for_each_reloc(rsec, reloc) { in add_ignores()
996 switch (reloc->sym->type) { in add_ignores()
998 func = reloc->sym; in add_ignores()
1002 func = find_func_by_offset(reloc->sym->sec, reloc_addend(reloc)); in add_ignores()
1009 rsec->name, reloc->sym->type); in add_ignores()
1255 static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn) in insn_reloc()
1257 struct reloc *reloc; in insn_reloc() local
1265 reloc = find_reloc_by_dest_range(file->elf, insn->sec, in insn_reloc()
1267 if (!reloc) { in insn_reloc()
1272 return reloc; in insn_reloc()
1289 struct reloc *reloc = insn_reloc(file, insn); in annotate_call_site() local
1293 sym = reloc->sym; in annotate_call_site()
1311 if (reloc) in annotate_call_site()
1312 set_reloc_type(file->elf, reloc, R_NONE); in annotate_call_site()
1340 if (reloc) in annotate_call_site()
1341 set_reloc_type(file->elf, reloc, R_NONE); in annotate_call_site()
1482 struct reloc *reloc; in add_jump_destinations() local
1500 reloc = insn_reloc(file, insn); in add_jump_destinations()
1501 if (!reloc) { in add_jump_destinations()
1504 } else if (reloc->sym->type == STT_SECTION) { in add_jump_destinations()
1505 dest_sec = reloc->sym->sec; in add_jump_destinations()
1506 dest_off = arch_dest_reloc_offset(reloc_addend(reloc)); in add_jump_destinations()
1507 } else if (reloc->sym->retpoline_thunk) { in add_jump_destinations()
1512 } else if (reloc->sym->return_thunk) { in add_jump_destinations()
1520 ret = add_call_dest(file, insn, reloc->sym, true); in add_jump_destinations()
1524 } else if (reloc->sym->sec->idx) { in add_jump_destinations()
1525 dest_sec = reloc->sym->sec; in add_jump_destinations()
1526 dest_off = reloc->sym->sym.st_value + in add_jump_destinations()
1527 arch_dest_reloc_offset(reloc_addend(reloc)); in add_jump_destinations()
1645 struct reloc *reloc; in add_call_destinations() local
1653 reloc = insn_reloc(file, insn); in add_call_destinations()
1654 if (!reloc) { in add_call_destinations()
1675 } else if (reloc->sym->type == STT_SECTION) { in add_call_destinations()
1676 dest_off = arch_dest_reloc_offset(reloc_addend(reloc)); in add_call_destinations()
1677 dest = find_call_destination(reloc->sym->sec, dest_off); in add_call_destinations()
1680 reloc->sym->sec->name, dest_off); in add_call_destinations()
1688 } else if (reloc->sym->retpoline_thunk) { in add_call_destinations()
1694 ret = add_call_dest(file, insn, reloc->sym, false); in add_call_destinations()
1793 struct reloc *alt_reloc; in handle_group_alt()
1869 struct reloc *reloc = insn_reloc(file, orig_insn); in handle_jump_alt() local
1871 if (reloc) in handle_jump_alt()
1872 set_reloc_type(file->elf, reloc, R_NONE); in handle_jump_alt()
1980 __weak unsigned long arch_jump_table_sym_offset(struct reloc *reloc, struct reloc *table) in arch_jump_table_sym_offset() argument
1982 return reloc->sym->offset + reloc_addend(reloc); in arch_jump_table_sym_offset()
1989 struct reloc *table = insn_jump_table(insn); in add_jump_table()
1992 struct reloc *reloc = table; in add_jump_table() local
2000 for_each_reloc_from(table->sec, reloc) { in add_jump_table()
2003 if (table_size && reloc_offset(reloc) - reloc_offset(table) >= table_size) in add_jump_table()
2005 if (reloc != table && is_jump_table(reloc)) in add_jump_table()
2009 if (prev_offset && reloc_offset(reloc) != prev_offset + arch_reloc_size(reloc)) in add_jump_table()
2012 sym_offset = arch_jump_table_sym_offset(reloc, table); in add_jump_table()
2015 if (reloc->sym->sec == pfunc->sec && sym_offset == pfunc->offset) in add_jump_table()
2022 if (reloc->sym->sec == pfunc->sec && in add_jump_table()
2026 dest_insn = find_insn(file, reloc->sym->sec, sym_offset); in add_jump_table()
2044 prev_offset = reloc_offset(reloc); in add_jump_table()
2062 struct reloc *table_reloc; in find_jump_table()
2197 struct reloc *reloc; in read_unwind_hints() local
2220 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint)); in read_unwind_hints()
2221 if (!reloc) { in read_unwind_hints()
2226 if (reloc->sym->type == STT_SECTION) { in read_unwind_hints()
2227 offset = reloc_addend(reloc); in read_unwind_hints()
2228 } else if (reloc->sym->local_label) { in read_unwind_hints()
2229 offset = reloc->sym->offset; in read_unwind_hints()
2235 insn = find_insn(file, reloc->sym->sec, offset); in read_unwind_hints()
2298 struct reloc *reloc; in read_annotate() local
2318 for_each_reloc(sec->rsec, reloc) { in read_annotate()
2319 type = *(u32 *)(sec->data->d_buf + (reloc_idx(reloc) * sec->sh.sh_entsize) + 4); in read_annotate()
2321 offset = reloc->sym->offset + reloc_addend(reloc); in read_annotate()
2322 insn = find_insn(file, reloc->sym->sec, offset); in read_annotate()
2325 ERROR("bad .discard.annotate_insn entry: %d of type %d", reloc_idx(reloc), type); in read_annotate()
3326 struct reloc *reloc; in call_dest_name() local
3332 reloc = insn_reloc(NULL, insn); in call_dest_name()
3333 if (reloc && !strcmp(reloc->sym->name, "pv_ops")) { in call_dest_name()
3334 idx = (reloc_addend(reloc) / sizeof(void *)); in call_dest_name()
3345 struct reloc *reloc; in pv_call_dest() local
3348 reloc = insn_reloc(file, insn); in pv_call_dest()
3349 if (!reloc || strcmp(reloc->sym->name, "pv_ops")) in pv_call_dest()
3352 idx = (arch_dest_reloc_offset(reloc_addend(reloc)) / sizeof(void *)); in pv_call_dest()
4354 struct reloc *reloc; in validate_ibt_insn() local
4394 for (reloc = insn_reloc(file, insn); in validate_ibt_insn()
4395 reloc; in validate_ibt_insn()
4396 reloc = find_reloc_by_dest_range(file->elf, insn->sec, in validate_ibt_insn()
4397 reloc_offset(reloc) + 1, in validate_ibt_insn()
4398 (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) { in validate_ibt_insn()
4400 off = reloc->sym->offset; in validate_ibt_insn()
4401 if (reloc_type(reloc) == R_X86_64_PC32 || in validate_ibt_insn()
4402 reloc_type(reloc) == R_X86_64_PLT32) in validate_ibt_insn()
4403 off += arch_dest_reloc_offset(reloc_addend(reloc)); in validate_ibt_insn()
4405 off += reloc_addend(reloc); in validate_ibt_insn()
4407 dest = find_insn(file, reloc->sym->sec, off); in validate_ibt_insn()
4418 struct reloc *reloc) in validate_ibt_data_reloc() argument
4422 dest = find_insn(file, reloc->sym->sec, in validate_ibt_data_reloc()
4423 reloc->sym->offset + reloc_addend(reloc)); in validate_ibt_data_reloc()
4435 WARN_FUNC(reloc->sec->base, reloc_offset(reloc), in validate_ibt_data_reloc()
4449 struct reloc *reloc; in validate_ibt() local
4492 for_each_reloc(sec->rsec, reloc) in validate_ibt()
4493 warnings += validate_ibt_data_reloc(file, reloc); in validate_ibt()