Re: [PATCH] recordmcount: avoid using ABS symbol as reference
flat view
From: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
Date: 2021-06-07 17:31:47
Also in:
linux-kbuild, linux-mediatek, linux-toolchains, lkml
On Mon, 7 Jun 2021 13:44:21 +0200 Peter Zijlstra [off-list ref] wrote:quoted
There's an extended section header index section for just that. And recordmcount actually seems to use that as well. I can't seem to find enough of the thread to figure out what the actual problem is though. The lore archive doesn't have anything prior to this message. One should only use st_shndx when >SHN_UDEF and <SHN_LORESERVE. When SHN_XINDEX, then use .symtab_shndx. Apparently you've found a case where neither is true? In that case objtool seems to use shndx 0. A matching recordmcount patch would be something like this.
Hi Peter, Should I resend the below patch as v2?
Mark-PK, Does the below patch fix it for you too (if you backport it to your kernel). I much rather have recordmcount match objtool, as one day the two will hopefully merge to one executable. -- Steve
Yes, this patch fix it.
quoted
diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h index f9b19524da11..d99cc0aed6fe 100644 --- a/scripts/recordmcount.h +++ b/scripts/recordmcount.h@@ -194,13 +194,18 @@ static unsigned int get_symindex(Elf_Sym const *sym, Elf32_Word const *symtab, unsigned long offset; int index; - if (sym->st_shndx != SHN_XINDEX) + if (sym->st_shndx > SHN_UDEF && + sym->st_shndx < SHN_LORESERVE) return w2(sym->st_shndx); - offset = (unsigned long)sym - (unsigned long)symtab; - index = offset / sizeof(*sym); + if (sym->st_shndx == SHN_XINDEX) { + offset = (unsigned long)sym - (unsigned long)symtab; + index = offset / sizeof(*sym); - return w(symtab_shndx[index]); + return w(symtab_shndx[index]); + } + + return 0; } static unsigned int get_shnum(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0)
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel