diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 6a4a29f8f2f5..1a20ff89df74 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -1623,34 +1623,13 @@ static int add_jump_destinations(struct objtool_file *file) continue; } - if (!insn->sym || insn->sym == dest_insn->sym) + if (!insn->sym || insn->sym->pfunc == dest_sym->pfunc) goto set_jump_dest; /* * Internal cross-function jump. */ - /* - * For GCC 8+, create parent/child links for any cold - * subfunctions. This is _mostly_ redundant with a - * similar initialization in read_symbols(). - * - * If a function has aliases, we want the *first* such - * function in the symbol table to be the subfunction's - * parent. In that case we overwrite the - * initialization done in read_symbols(). - * - * However this code can't completely replace the - * read_symbols() code because this doesn't detect the - * case where the parent function's only reference to a - * subfunction is through a jump table. - */ - if (func && dest_sym->cold) { - func->cfunc = dest_sym; - dest_sym->pfunc = func; - goto set_jump_dest; - } - if (is_first_func_insn(file, dest_insn)) { /* Internal sibling call */ if (add_call_dest(file, insn, dest_sym, true)) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 7e2c0ae6b41a..6a8ed9c62323 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -658,8 +658,9 @@ static int read_symbols(struct elf *elf) return -1; } - sym->pfunc = pfunc; + sym->pfunc = pfunc->alias; pfunc->cfunc = sym; + pfunc->alias->cfunc = sym; /* * Unfortunately, -fnoreorder-functions puts the child