Messages in this thread Patch in this message | | | From | Tiezhu Yang <> | Subject | [PATCH v4 7/8] objtool: Check local label in read_unwind_hints() | Date | Mon, 23 Oct 2023 16:11:30 +0800 |
| |
When update the latest upstream gcc and binutils which enables linker relaxation by default, it generates more objtool warnings on LoongArch.
We can see that the reloc sym name is local label instead of section in relocation section '.rela.discard.unwind_hints', in this case, the reloc sym type is STT_NOTYPE instead of STT_SECTION. Let us check it to not return -1, then use reloc->sym->offset instead of reloc addend which is 0 to find the corresponding instruction.
Here are some detailed info: [fedora@linux 6.6.test]$ gcc --version gcc (GCC) 14.0.0 20231009 (experimental) [fedora@linux 6.6.test]$ as --version GNU assembler (GNU Binutils) 2.41.50.20231009 [fedora@linux 6.6.test]$ readelf -r arch/loongarch/kernel/entry.o | grep -A 2 "rela.discard.unwind_hints" Relocation section '.rela.discard.unwind_hints' at offset 0x458 contains 7 entries: Offset Info Type Sym. Value Sym. Name + Addend 000000000000 000800000063 R_LARCH_32_PCREL 000000000000001c .Lhere_1 + 0
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> --- tools/objtool/check.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 8ddf02f..c2ebb96 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -2224,6 +2224,7 @@ static int read_unwind_hints(struct objtool_file *file) struct unwind_hint *hint; struct instruction *insn; struct reloc *reloc; + unsigned long offset; int i; sec = find_section_by_name(file->elf, ".discard.unwind_hints"); @@ -2251,7 +2252,16 @@ static int read_unwind_hints(struct objtool_file *file) return -1; } - insn = find_insn(file, reloc->sym->sec, reloc_addend(reloc)); + if (reloc->sym->type == STT_SECTION) { + offset = reloc_addend(reloc); + } else if (reloc->sym->local_label) { + offset = reloc->sym->offset; + } else { + WARN("unexpected relocation symbol type in %s", sec->rsec->name); + return -1; + } + + insn = find_insn(file, reloc->sym->sec, offset); if (!insn) { WARN("can't find insn for unwind_hints[%d]", i); return -1; -- 2.1.0
| |