Re: [PATCH] btf_encoder: Add extra checks for symbol names
From: Arnaldo Carvalho de Melo <acme@kernel.org>
Date: 2021-01-21 19:38:41
Em Thu, Jan 21, 2021 at 05:06:25PM +0100, Sedat Dilek escreveu:
On Thu, Jan 21, 2021 at 2:38 PM Arnaldo Carvalho de Melo [off-list ref] wrote:quoted
Em Tue, Jan 12, 2021 at 04:27:59PM -0800, Tom Stellard escreveu:quoted
On 1/12/21 10:40 AM, Jiri Olsa wrote:quoted
When processing kernel image build by clang we can find some functions without the name, which causes pahole to segfault. Adding extra checks to make sure we always have function's name defined before using it.I backported this patch to pahole 1.19, and I can confirm it fixes the segfault for me.I'm applying v2 for this patch and based on your above statement I'm adding a: Tested-by: Tom Stellard <redacted> Ok? Who originally reported this?The origin was AFAICS the thread where I asked initially [1]. Tom reported in the same thread in [2] that pahole segfaults. Later in the thread Jiri offered a draft of this patch after doing some tests. I have tested all diffs and v1 and v2 of Jiri's patch. ( Anyway, latest pahole ToT plus Jiri's patch did not solve my origin problem. ) So up to you Arnaldo for the credits.
Reported-by: Sedat Dilek <redacted> Tested-by: Tom Stellard <redacted> is how I'm going about it. Thanks for clarifying, - Arnaldo
- Sedat - [1] https://marc.info/?t=161036949500004&r=1&w=2 [2] https://marc.info/?t=161036949500004&r=1&w=2quoted
- Arnaldoquoted
-Tomquoted
Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- btf_encoder.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)diff --git a/btf_encoder.c b/btf_encoder.c index 333973054b61..17f7a14f2ef0 100644 --- a/btf_encoder.c +++ b/btf_encoder.c@@ -72,6 +72,8 @@ static int collect_function(struct btf_elf *btfe, GElf_Sym *sym) if (elf_sym__type(sym) != STT_FUNC) return 0; + if (!elf_sym__name(sym, btfe->symtab)) + return 0; if (functions_cnt == functions_alloc) { functions_alloc = max(1000, functions_alloc * 3 / 2);@@ -730,9 +732,11 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force, if (!has_arg_names(cu, &fn->proto)) continue; if (functions_cnt) { - struct elf_function *func; + const char *name = function__name(fn, cu); + struct elf_function *func = NULL; - func = find_function(btfe, function__name(fn, cu)); + if (name) + func = find_function(btfe, name); if (!func || func->generated) continue; func->generated = true;-- - Arnaldo
-- - Arnaldo