Re: [Buildroot] [PATCH 1/1] package/pahole: fix build on modern toolchains

Thomas Perale via buildroot <[email protected]> Fri, 24 Jul 2026 16:14:43 +0200
Newsgroups net.busybox.buildroot
Message-ID <[email protected]>
In reply of:
> When building pahole using a modern GCC (e.g. when building
> host-pahole), discarded-qualifiers and unused-but-set-variable warnings
> are produced. In builds that don't set CMAKE_BUILD_TYPE=Release, -Werror
> gets set and causes a build failure.
> 
> Fix this by backporting an unreleased upstream patch (for
> discarded-qualifiers) and adding another pending one for
> unused-but-set-variable (and, arguably, a correctness issue).
> 
> Fixes: https://autobuild.buildroot.org/results/ba7/ba79fb9d08b2c6ec573b79fdbb6b4880bf603a57
> 
> Signed-off-by: Florian Larysch <[email protected]>

Applied to 2026.05.x. Thanks

> ---
>  ...scarded-qualifiers-for-strchr-strstr.patch | 147 ++++++++++++++++++
>  ...-function-parameter-type-match-check.patch |  41 +++++
>  2 files changed, 188 insertions(+)
>  create mode 100644 package/pahole/0001-pahole-Fix-discarded-qualifiers-for-strchr-strstr.patch
>  create mode 100644 package/pahole/0002-pahole-fix-BTF-function-parameter-type-match-check.patch
> 
> diff --git a/package/pahole/0001-pahole-Fix-discarded-qualifiers-for-strchr-strstr.patch b/package/pahole/0001-pahole-Fix-discarded-qualifiers-for-strchr-strstr.patch
> new file mode 100644
> index 0000000000..87a63cfdc9
> --- /dev/null
> +++ b/package/pahole/0001-pahole-Fix-discarded-qualifiers-for-strchr-strstr.patch
> @@ -0,0 +1,147 @@
> +From 5f5809cd50cc4d583a2fe3f4d556cb120760e229 Mon Sep 17 00:00:00 2001
> +From: Damien Hourtoulle <[email protected]>
> +Date: Wed, 11 Mar 2026 15:09:39 +0100
> +Subject: [PATCH] pahole: Fix discarded-qualifiers for strchr/strstr.
> +
> +Glibc 2.43 added C23 const-preserving overloads :
> +https://sourceware.org/glibc/wiki/Release/2.43.
> +
> +For the function prototype__new, fix local variable declaration to use
> +the correct const char* type instead of char*, removing the need to
> +discard the const qualifier.
> +
> +Also fix a pre-existing bug in type__find_type_enum: when iterating
> +over a '+'-concatenated list of enum names, after advancing to the next
> +segment the new separator was not nullified, causing "second+third" to
> +be passed to cu__find_enumeration_by_name instead of "second".  Add a
> +null check before writing to sep_mutable to avoid a null dereference
> +when no further '+' is present.
> +
> +Signed-off-by: Damien Hourtoulle <[email protected]>
> +Signed-off-by: Alan Maguire <[email protected]>
> +Link: https://lore.kernel.org/dwarves/[email protected]/
> +
> +Upstream: https://git.kernel.org/pub/scm/devel/pahole/pahole.git/commit/?id=ba31cfa08ffcfe6ff5757f325de5b03ca157cb78
> +Signed-off-by: Florian Larysch <[email protected]>
> +---
> + btf_encoder.c |  2 +-
> + pahole.c      | 35 ++++++++++++++++++-----------------
> + 2 files changed, 19 insertions(+), 18 deletions(-)
> +
> +diff --git a/btf_encoder.c b/btf_encoder.c
> +index 03bc3c7..4a585f5 100644
> +--- a/btf_encoder.c
> ++++ b/btf_encoder.c
> +@@ -1199,7 +1199,7 @@ static bool str_contains_non_fn_suffix(const char *str) {
> + 		".cold",
> + 		".part"
> + 	};
> +-	char *suffix = strchr(str, '.');
> ++	const char *suffix = strchr(str, '.');
> + 	int i;
> + 
> + 	if (!suffix)
> +diff --git a/pahole.c b/pahole.c
> +index ef01e58..8c827fc 100644
> +--- a/pahole.c
> ++++ b/pahole.c
> +@@ -2482,7 +2482,7 @@ static int64_t type_instance__int_value(struct type_instance *instance, const ch
> + 	int byte_offset = 0;
> + 
> + 	if (!member) {
> +-		char *sep = strchr(member_name_orig, '.');
> ++		const char *sep = strchr(member_name_orig, '.');
> + 
> + 		if (!sep)
> + 			return -1;
> +@@ -2495,8 +2495,8 @@ static int64_t type_instance__int_value(struct type_instance *instance, const ch
> + 		char *member_name = member_name_alloc;
> + 		struct type *type = instance->type;
> + 
> +-		sep = member_name_alloc + (sep - member_name_orig);
> +-		*sep = 0;
> ++		char *sep_mutable = member_name_alloc + (sep - member_name_orig);  // sep mutable for the copy
> ++		*sep_mutable = 0;
> + 
> + 		while (1) {
> + 			member = type__find_member_by_name(type, member_name);
> +@@ -2509,9 +2509,9 @@ out_free_member_name:
> + 			type = tag__type(cu__type(cu, member->tag.type));
> + 			if (type == NULL)
> + 				goto out_free_member_name;
> +-			member_name = sep + 1;
> +-			sep = strchr(member_name, '.');
> +-			if (!sep)
> ++			member_name = sep_mutable + 1;
> ++			sep_mutable = strchr(member_name, '.');
> ++			if (!sep_mutable)
> + 				break;
> + 
> + 		}
> +@@ -2949,7 +2949,7 @@ static struct prototype *prototype__new(const char *expression)
> + 
> + 	strcpy(prototype->name, expression);
> + 
> +-	const char *name = prototype->name;
> ++	char *name = prototype->name;
> + 
> + 	prototype->nr_args = 0;
> + 
> +@@ -2963,10 +2963,9 @@ static struct prototype *prototype__new(const char *expression)
> + 	if (args_close == NULL)
> + 		goto out_no_closing_parens;
> + 
> ++	*args_open++ = *args_close = '\0';
> + 	char *args = args_open;
> + 
> +-	*args++ = *args_close = '\0';
> +-
> + 	while (isspace(*args))
> + 		++args;
> + 
> +@@ -3113,7 +3112,7 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty
> + 		return type__add_type_enum(type, te, cu);
> + 
> + 	// Now look at a 'virtual enum', i.e. the concatenation of multiple enums
> +-	char *sep = strchr(type_enum, '+');
> ++	const char *sep = strchr(type_enum, '+');
> + 
> + 	if (!sep)
> + 		return -1;
> +@@ -3125,13 +3124,13 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty
> + 
> + 	int ret = -1;
> + 
> +-	sep = type_enums + (sep - type_enum);
> ++	char *sep_mutable = type_enums + (sep - type_enum);
> ++	char *cur = type_enums;
> + 
> +-	type_enum = type_enums;
> +-	*sep = '\0';
> ++	*sep_mutable = '\0';
> + 
> + 	while (1) {
> +-		te = cu__find_enumeration_by_name(cu, type_enum, NULL);
> ++		te = cu__find_enumeration_by_name(cu, cur, NULL);
> + 
> + 		if (!te)
> + 			goto out;
> +@@ -3140,10 +3139,12 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty
> + 		if (ret)
> + 			goto out;
> + 
> +-		if (sep == NULL)
> ++		if (sep_mutable == NULL)
> + 			break;
> +-		type_enum = sep + 1;
> +-		sep = strchr(type_enum, '+');
> ++		cur = sep_mutable + 1;
> ++		sep_mutable = strchr(cur, '+');
> ++		if (sep_mutable)
> ++			*sep_mutable = '\0';
> + 	}
> + 
> + 	ret = 0;
> +-- 
> +2.55.0
> +
> diff --git a/package/pahole/0002-pahole-fix-BTF-function-parameter-type-match-check.patch b/package/pahole/0002-pahole-fix-BTF-function-parameter-type-match-check.patch
> new file mode 100644
> index 0000000000..0bea2a602f
> --- /dev/null
> +++ b/package/pahole/0002-pahole-fix-BTF-function-parameter-type-match-check.patch
> @@ -0,0 +1,41 @@
> +From f282f4e995becc55a8fa380781dc36e0ff0796d2 Mon Sep 17 00:00:00 2001
> +From: Florian Larysch <[email protected]>
> +Date: Tue, 14 Jul 2026 16:07:54 +0200
> +Subject: [PATCH] pahole: fix BTF function parameter type match check
> +
> +The BTF_KIND_FUNC_PROTO arm in types__match() first checks whether two
> +function types identified by t1/t2 have matching return types and then
> +attempts to iterate over the function parameters (p1/p2) to check them
> +for compatibility too.
> +
> +However, the loop just repeats the check on t1/t2 instead of p1/p2, so
> +we just keep re-checking return type compatibility, ignoring possible
> +mismatches of the actual parameter types.
> +
> +Fix this by actually comparing p1 and p2. This also resolves a
> +unused-but-set-variable build-time warning.
> +
> +Upstream: https://lore.kernel.org/dwarves/[email protected]/
> +Signed-off-by: Florian Larysch <[email protected]>
> +---
> + btf_encoder.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/btf_encoder.c b/btf_encoder.c
> +index 4a585f5..4f9790e 100644
> +--- a/btf_encoder.c
> ++++ b/btf_encoder.c
> +@@ -1109,8 +1109,8 @@ static bool types__match(struct btf_encoder *encoder,
> + 					  btf2, t2->type))
> + 				return false;
> + 			for (i = 0; i < vlen; i++, p1++, p2++) {
> +-				if (!types__match(encoder, btf1, t1->type,
> +-						  btf2, t2->type))
> ++				if (!types__match(encoder, btf1, p1->type,
> ++						  btf2, p2->type))
> + 					return false;
> + 			}
> + 			return true;
> +-- 
> +2.55.0
> +
> -- 
> 2.55.0
> 
> _______________________________________________
> buildroot mailing list
> [email protected]
> https://lists.buildroot.org/mailman/listinfo/buildroot
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot