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)
2035 if (reloc->sym->sec == pfunc->sec &&
2036 reloc_addend(reloc) == pfunc->offset + pfunc->len)
2039 dest_insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2057 prev_offset = reloc_offset(reloc);
2072 static struct reloc *find_jump_table(struct objtool_file *file,
2076 struct reloc *table_reloc;
2119 struct reloc *reloc;
2142 reloc = find_jump_table(file, func, insn);
2143 if (reloc)
2144 insn->_jump_table = reloc;
2219 struct reloc *reloc;
2241 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint));
2242 if (!reloc) {
2243 WARN("can't find reloc for unwind_hints[%d]", i);
2247 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2308 struct reloc *reloc;
2314 for_each_reloc(rsec, reloc) {
2315 insn = find_insn(file, reloc->sym->sec,
2316 reloc->sym->offset + reloc_addend(reloc));
2332 struct reloc *reloc;
2338 for_each_reloc(rsec, reloc) {
2339 if (reloc->sym->type != STT_SECTION) {
2344 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2368 struct reloc *reloc;
2374 for_each_reloc(rsec, reloc) {
2375 if (reloc->sym->type != STT_SECTION) {
2380 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2393 for_each_reloc(rsec, reloc) {
2394 if (reloc->sym->type != STT_SECTION) {
2399 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2415 struct reloc *reloc;
2421 for_each_reloc(rsec, reloc) {
2422 if (reloc->sym->type != STT_SECTION) {
2427 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
2443 struct reloc *reloc;
2449 for_each_reloc(rsec, reloc) {
2452 if (reloc->sym->type != STT_SECTION) {
2458 insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc));
3362 struct reloc *reloc;
3368 reloc = insn_reloc(NULL, insn);
3369 if (reloc && !strcmp(reloc->sym->name, "pv_ops")) {
3370 idx = (reloc_addend(reloc) / sizeof(void *));
3381 struct reloc *reloc;
3384 reloc = insn_reloc(file, insn);
3385 if (!reloc || strcmp(reloc->sym->name, "pv_ops"))
3388 idx = (arch_dest_reloc_offset(reloc_addend(reloc)) / sizeof(void *));
4309 struct reloc *reloc;
4331 for (reloc = insn_reloc(file, insn);
4332 reloc;
4333 reloc = find_reloc_by_dest_range(file->elf, insn->sec,
4334 reloc_offset(reloc) + 1,
4335 (insn->offset + insn->len) - (reloc_offset(reloc) + 1))) {
4341 if (reloc->sym->static_call_tramp)
4344 off = reloc->sym->offset;
4345 if (reloc_type(reloc) == R_X86_64_PC32 ||
4346 reloc_type(reloc) == R_X86_64_PLT32)
4347 off += arch_dest_reloc_offset(reloc_addend(reloc));
4349 off += reloc_addend(reloc);
4351 dest = find_insn(file, reloc->sym->sec, off);
4402 struct reloc *reloc)
4406 dest = find_insn(file, reloc->sym->sec,
4407 reloc->sym->offset + reloc_addend(reloc));
4420 reloc->sec->base, reloc_offset(reloc),
4434 struct reloc *reloc;
4474 for_each_reloc(sec->rsec, reloc)
4475 warnings += validate_ibt_data_reloc(file, reloc);