Lines Matching refs:reloc

144 static inline struct reloc *insn_jump_table(struct instruction *insn)
497 struct reloc *reloc;
507 reloc = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off);
508 if (!reloc)
511 func = reloc->sym;
513 func = find_symbol_by_offset(reloc->sym->sec,
514 reloc_addend(reloc));
516 idx = (reloc_offset(reloc) - sym->offset) / sizeof(unsigned long);
520 off = reloc_offset(reloc) + 1;
586 struct reloc *reloc;
597 for_each_reloc(rsec, reloc) {
598 if (reloc->sym->type == STT_SECTION) {
599 offset = reloc_addend(reloc);
600 } else if (reloc->sym->local_label) {
601 offset = reloc->sym->offset;
607 insn = find_insn(file, reloc->sym->sec, offset);
610 else if (offset == reloc->sym->sec->sh.sh_size) {
611 insn = find_last_insn(file, reloc->sym->sec);
614 reloc->sym->sec->name, offset);
619 reloc->sym->sec->name, offset);
637 for_each_reloc(rsec, reloc) {
638 if (reloc->sym->type == STT_SECTION) {
639 offset = reloc_addend(reloc);
640 } else if (reloc->sym->local_label) {
641 offset = reloc->sym->offset;
647 insn = find_insn(file, reloc->sym->sec, offset);
650 else if (offset == reloc->sym->sec->sh.sh_size) {
651 insn = find_last_insn(file, reloc->sym->sec);
654 reloc->sym->sec->name, offset);
659 reloc->sym->sec->name, offset);
703 /* populate reloc for 'addr' */
745 /* populate reloc for 'key' */
967 struct reloc *reloc;
969 reloc = elf_init_reloc_text_sym(file->elf, sec, idx * addr_size, idx,
971 if (!reloc)
974 set_reloc_type(file->elf, reloc, addr_size == 8 ? R_ABS64 : R_ABS32);
1029 struct reloc *reloc;
1035 for_each_reloc(rsec, reloc) {
1036 switch (reloc->sym->type) {
1038 func = reloc->sym;
1042 func = find_func_by_offset(reloc->sym->sec, reloc_addend(reloc));
1049 rsec->name, reloc->sym->type);
1269 struct reloc *reloc;
1276 for_each_reloc(rsec, reloc) {
1277 if (reloc->sym->type != STT_SECTION) {
1282 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
1321 static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
1323 struct reloc *reloc;
1331 reloc = find_reloc_by_dest_range(file->elf, insn->sec,
1333 if (!reloc) {
1338 return reloc;
1355 struct reloc *reloc = insn_reloc(file, insn);
1359 sym = reloc->sym;
1386 if (reloc)
1387 set_reloc_type(file->elf, reloc, R_NONE);
1413 if (reloc)
1414 set_reloc_type(file->elf, reloc, R_NONE);
1550 struct reloc *reloc;
1565 reloc = insn_reloc(file, insn);
1566 if (!reloc) {
1569 } else if (reloc->sym->type == STT_SECTION) {
1570 dest_sec = reloc->sym->sec;
1571 dest_off = arch_dest_reloc_offset(reloc_addend(reloc));
1572 } else if (reloc->sym->retpoline_thunk) {
1575 } else if (reloc->sym->return_thunk) {
1581 * STT_FUNC reloc.
1583 add_call_dest(file, insn, reloc->sym, true);
1585 } else if (reloc->sym->sec->idx) {
1586 dest_sec = reloc->sym->sec;
1587 dest_off = reloc->sym->sym.st_value +
1588 arch_dest_reloc_offset(reloc_addend(reloc));
1662 * Internal sibling call without reloc or with
1663 * STT_SECTION reloc.
1694 struct reloc *reloc;
1700 reloc = insn_reloc(file, insn);
1701 if (!reloc) {
1720 } else if (reloc->sym->type == STT_SECTION) {
1721 dest_off = arch_dest_reloc_offset(reloc_addend(reloc));
1722 dest = find_call_destination(reloc->sym->sec, dest_off);
1725 reloc->sym->sec->name, dest_off);
1731 } else if (reloc->sym->retpoline_thunk) {
1735 add_call_dest(file, insn, reloc->sym, false);
1831 struct reloc *alt_reloc;
1907 struct reloc *reloc = insn_reloc(file, orig_insn);
1909 if (reloc)
1910 set_reloc_type(file->elf, reloc, R_NONE);
2022 struct reloc *next_table)
2025 struct reloc *table = insn_jump_table(insn);
2028 struct reloc *reloc = table;
2032 * Each @reloc is a switch table relocation which points to the target
2035 for_each_reloc_from(table->sec, reloc) {
2038 if (reloc != table && reloc == next_table)
2042 if (prev_offset && reloc_offset(reloc) != prev_offset + 8)
2046 if (reloc->sym->sec == pfunc->sec &&
2047 reloc_addend(reloc) == pfunc->offset)
2050 dest_insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2067 prev_offset = reloc_offset(reloc);
2082 static struct reloc *find_jump_table(struct objtool_file *file,
2086 struct reloc *table_reloc;
2129 struct reloc *reloc;
2152 reloc = find_jump_table(file, func, insn);
2153 if (reloc)
2154 insn->_jump_table = reloc;
2229 struct reloc *reloc;
2252 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint));
2253 if (!reloc) {
2254 WARN("can't find reloc for unwind_hints[%d]", i);
2258 if (reloc->sym->type == STT_SECTION) {
2259 offset = reloc_addend(reloc);
2260 } else if (reloc->sym->local_label) {
2261 offset = reloc->sym->offset;
2267 insn = find_insn(file, reloc->sym->sec, offset);
2328 struct reloc *reloc;
2334 for_each_reloc(rsec, reloc) {
2335 insn = find_insn(file, reloc->sym->sec,
2336 reloc->sym->offset + reloc_addend(reloc));
2352 struct reloc *reloc;
2358 for_each_reloc(rsec, reloc) {
2359 if (reloc->sym->type != STT_SECTION) {
2364 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2388 struct reloc *reloc;
2394 for_each_reloc(rsec, reloc) {
2395 if (reloc->sym->type != STT_SECTION) {
2400 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2413 for_each_reloc(rsec, reloc) {
2414 if (reloc->sym->type != STT_SECTION) {
2419 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2435 struct reloc *reloc;
2441 for_each_reloc(rsec, reloc) {
2442 if (reloc->sym->type != STT_SECTION) {
2447 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2463 struct reloc *reloc;
2469 for_each_reloc(rsec, reloc) {
2472 if (reloc->sym->type != STT_SECTION) {
2478 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
3385 struct reloc *reloc;
3391 reloc = insn_reloc(NULL, insn);
3392 if (reloc && !strcmp(reloc->sym->name, "pv_ops")) {
3393 idx = (reloc_addend(reloc) / sizeof(void *));
3404 struct reloc *reloc;
3407 reloc = insn_reloc(file, insn);
3408 if (!reloc || strcmp(reloc->sym->name, "pv_ops"))
3411 idx = (arch_dest_reloc_offset(reloc_addend(reloc)) / sizeof(void *));
4329 struct reloc *reloc;
4351 for (reloc = insn_reloc(file, insn);
4352 reloc;
4353 reloc = find_reloc_by_dest_range(file->elf, insn->sec,
4354 reloc_offset(reloc) + 1,
4355 (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {
4361 if (reloc->sym->static_call_tramp)
4364 off = reloc->sym->offset;
4365 if (reloc_type(reloc) == R_X86_64_PC32 ||
4366 reloc_type(reloc) == R_X86_64_PLT32)
4367 off += arch_dest_reloc_offset(reloc_addend(reloc));
4369 off += reloc_addend(reloc);
4371 dest = find_insn(file, reloc->sym->sec, off);
4422 struct reloc *reloc)
4426 dest = find_insn(file, reloc->sym->sec,
4427 reloc->sym->offset + reloc_addend(reloc));
4440 reloc->sec->base, reloc_offset(reloc),
4454 struct reloc *reloc;
4494 for_each_reloc(sec->rsec, reloc)
4495 warnings += validate_ibt_data_reloc(file, reloc);