Lines Matching defs:reloc
143 static inline struct reloc *insn_jump_table(struct instruction *insn)
496 struct reloc *reloc;
506 reloc = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off);
507 if (!reloc)
510 func = reloc->sym;
512 func = find_symbol_by_offset(reloc->sym->sec,
513 reloc_addend(reloc));
515 idx = (reloc_offset(reloc) - sym->offset) / sizeof(unsigned long);
519 off = reloc_offset(reloc) + 1;
585 struct reloc *reloc;
596 for_each_reloc(rsec, reloc) {
598 if (reloc->sym->type != STT_SECTION) {
603 addend = reloc_addend(reloc);
605 insn = find_insn(file, reloc->sym->sec, addend);
608 else if (addend == reloc->sym->sec->sh.sh_size) {
609 insn = find_last_insn(file, reloc->sym->sec);
612 reloc->sym->sec->name, addend);
617 reloc->sym->sec->name, addend);
635 for_each_reloc(rsec, reloc) {
637 if (reloc->sym->type != STT_SECTION) {
642 addend = reloc_addend(reloc);
644 insn = find_insn(file, reloc->sym->sec, addend);
647 else if (addend == reloc->sym->sec->sh.sh_size) {
648 insn = find_last_insn(file, reloc->sym->sec);
651 reloc->sym->sec->name, addend);
656 reloc->sym->sec->name, addend);
700 /* populate reloc for 'addr' */
742 /* populate reloc for 'key' */
964 struct reloc *reloc;
966 reloc = elf_init_reloc_text_sym(file->elf, sec, idx * addr_size, idx,
968 if (!reloc)
971 set_reloc_type(file->elf, reloc, addr_size == 8 ? R_ABS64 : R_ABS32);
1026 struct reloc *reloc;
1032 for_each_reloc(rsec, reloc) {
1033 switch (reloc->sym->type) {
1035 func = reloc->sym;
1039 func = find_func_by_offset(reloc->sym->sec, reloc_addend(reloc));
1046 rsec->name, reloc->sym->type);
1266 struct reloc *reloc;
1273 for_each_reloc(rsec, reloc) {
1274 if (reloc->sym->type != STT_SECTION) {
1279 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
1318 static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
1320 struct reloc *reloc;
1328 reloc = find_reloc_by_dest_range(file->elf, insn->sec,
1330 if (!reloc) {
1335 return reloc;
1352 struct reloc *reloc = insn_reloc(file, insn);
1356 sym = reloc->sym;
1383 if (reloc)
1384 set_reloc_type(file->elf, reloc, R_NONE);
1410 if (reloc)
1411 set_reloc_type(file->elf, reloc, R_NONE);
1547 struct reloc *reloc;
1562 reloc = insn_reloc(file, insn);
1563 if (!reloc) {
1566 } else if (reloc->sym->type == STT_SECTION) {
1567 dest_sec = reloc->sym->sec;
1568 dest_off = arch_dest_reloc_offset(reloc_addend(reloc));
1569 } else if (reloc->sym->retpoline_thunk) {
1572 } else if (reloc->sym->return_thunk) {
1578 * STT_FUNC reloc.
1580 add_call_dest(file, insn, reloc->sym, true);
1582 } else if (reloc->sym->sec->idx) {
1583 dest_sec = reloc->sym->sec;
1584 dest_off = reloc->sym->sym.st_value +
1585 arch_dest_reloc_offset(reloc_addend(reloc));
1643 * Internal sibling call without reloc or with
1644 * STT_SECTION reloc.
1675 struct reloc *reloc;
1681 reloc = insn_reloc(file, insn);
1682 if (!reloc) {
1701 } else if (reloc->sym->type == STT_SECTION) {
1702 dest_off = arch_dest_reloc_offset(reloc_addend(reloc));
1703 dest = find_call_destination(reloc->sym->sec, dest_off);
1706 reloc->sym->sec->name, dest_off);
1712 } else if (reloc->sym->retpoline_thunk) {
1716 add_call_dest(file, insn, reloc->sym, false);
1812 struct reloc *alt_reloc;
1888 struct reloc *reloc = insn_reloc(file, orig_insn);
1890 if (reloc)
1891 set_reloc_type(file->elf, reloc, R_NONE);
2003 struct reloc *next_table)
2006 struct reloc *table = insn_jump_table(insn);
2009 struct reloc *reloc = table;
2013 * Each @reloc is a switch table relocation which points to the target
2016 for_each_reloc_from(table->sec, reloc) {
2019 if (reloc != table && reloc == next_table)
2023 if (prev_offset && reloc_offset(reloc) != prev_offset + 8)
2027 if (reloc->sym->sec == pfunc->sec &&
2028 reloc_addend(reloc) == pfunc->offset)
2031 dest_insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2048 prev_offset = reloc_offset(reloc);
2063 static struct reloc *find_jump_table(struct objtool_file *file,
2067 struct reloc *table_reloc;
2110 struct reloc *reloc;
2133 reloc = find_jump_table(file, func, insn);
2134 if (reloc)
2135 insn->_jump_table = reloc;
2210 struct reloc *reloc;
2232 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint));
2233 if (!reloc) {
2234 WARN("can't find reloc for unwind_hints[%d]", i);
2238 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2299 struct reloc *reloc;
2305 for_each_reloc(rsec, reloc) {
2306 insn = find_insn(file, reloc->sym->sec,
2307 reloc->sym->offset + reloc_addend(reloc));
2323 struct reloc *reloc;
2329 for_each_reloc(rsec, reloc) {
2330 if (reloc->sym->type != STT_SECTION) {
2335 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2359 struct reloc *reloc;
2365 for_each_reloc(rsec, reloc) {
2366 if (reloc->sym->type != STT_SECTION) {
2371 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2384 for_each_reloc(rsec, reloc) {
2385 if (reloc->sym->type != STT_SECTION) {
2390 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2406 struct reloc *reloc;
2412 for_each_reloc(rsec, reloc) {
2413 if (reloc->sym->type != STT_SECTION) {
2418 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2434 struct reloc *reloc;
2440 for_each_reloc(rsec, reloc) {
2443 if (reloc->sym->type != STT_SECTION) {
2449 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
3353 struct reloc *reloc;
3359 reloc = insn_reloc(NULL, insn);
3360 if (reloc && !strcmp(reloc->sym->name, "pv_ops")) {
3361 idx = (reloc_addend(reloc) / sizeof(void *));
3372 struct reloc *reloc;
3375 reloc = insn_reloc(file, insn);
3376 if (!reloc || strcmp(reloc->sym->name, "pv_ops"))
3379 idx = (arch_dest_reloc_offset(reloc_addend(reloc)) / sizeof(void *));
4297 struct reloc *reloc;
4319 for (reloc = insn_reloc(file, insn);
4320 reloc;
4321 reloc = find_reloc_by_dest_range(file->elf, insn->sec,
4322 reloc_offset(reloc) + 1,
4323 (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {
4329 if (reloc->sym->static_call_tramp)
4332 off = reloc->sym->offset;
4333 if (reloc_type(reloc) == R_X86_64_PC32 ||
4334 reloc_type(reloc) == R_X86_64_PLT32)
4335 off += arch_dest_reloc_offset(reloc_addend(reloc));
4337 off += reloc_addend(reloc);
4339 dest = find_insn(file, reloc->sym->sec, off);
4390 struct reloc *reloc)
4394 dest = find_insn(file, reloc->sym->sec,
4395 reloc->sym->offset + reloc_addend(reloc));
4408 reloc->sec->base, reloc_offset(reloc),
4422 struct reloc *reloc;
4462 for_each_reloc(sec->rsec, reloc)
4463 warnings += validate_ibt_data_reloc(file, reloc);