Re: armv7 target /sys/kern/kern_linker.c build failures for main in personal build (KLD_DPF with __func__ used in argment as if it produced a string literal)

From: Brooks Davis <brooks_at_freebsd.org>
Date: Mon, 21 Sep 2026 09:54:38 UTC
It's clear I never compiled this code.  I guess your kernel must have
KLD_DEBUG defined.  No config in the base currently does which is surly a bug
(it should be in NOTES at least).

-- Brooks

On Sat, Sep 19, 2026 at 12:34:23PM -0700, Mark Millard wrote:
> Both non-debug and debug builds got the issue:
> 
> --- kern_linker.o ---
> /usr/main-src/sys/kern/kern_linker.c:340:16: error: expected ')'
>   340 |             (__func__ ": registering exterror categories for %s\n",
>       |                       ^
> /usr/main-src/sys/kern/kern_linker.c:340:6: note: to match this '('
>   340 |             (__func__ ": registering exterror categories for %s\n",
>       |             ^
> /usr/main-src/sys/kern/kern_linker.c:357:16: error: expected ')'
>   357 |             (__func__ ": unregistering exterror categories for
> %s\n",
>       |                       ^
> /usr/main-src/sys/kern/kern_linker.c:357:6: note: to match this '('
>   357 |             (__func__ ": unregistering exterror categories for
> %s\n",
>       |             ^
> Building
> /usr/obj/BUILDs/main-CA7-nodbg-clang/usr/main-src/arm.armv7/sys/GENERIC-NODBG-CA7/kern_module.o
> Building
> /usr/obj/BUILDs/main-CA7-nodbg-clang/usr/main-src/arm.armv7/sys/GENERIC-NODBG-CA7/kern_mtxpool.o
> 2 errors generated.
> *** [kern_linker.o] Error code 1
> 
> 
> --- kern_linker.o ---
> /usr/main-src/sys/kern/kern_linker.c:340:16: error: expected ')'
>   340 |             (__func__ ": registering exterror categories for %s\n",
>       |                       ^
> /usr/main-src/sys/kern/kern_linker.c:340:6: note: to match this '('
>   340 |             (__func__ ": registering exterror categories for %s\n",
>       |             ^
> /usr/main-src/sys/kern/kern_linker.c:357:16: error: expected ')'
>   357 |             (__func__ ": unregistering exterror categories for
> %s\n",
>       |                       ^
> /usr/main-src/sys/kern/kern_linker.c:357:6: note: to match this '('
>   357 |             (__func__ ": unregistering exterror categories for
> %s\n",
>       |             ^
> Building
> /usr/obj/BUILDs/main-CA7-dbg-clang/usr/main-src/arm.armv7/sys/GENERIC-DBG-CA7/kern_mutex.o
> 2 errors generated.
> *** [kern_linker.o] Error code 1
> 
> 
> I'll remind that, in C, __func__ is a reference to an implicit, function
> local:
> 
> static const char __func__[] = "function-name";
> 
> and is not a string literal. One cannot concatenate __func__ with a
> string literal via adjacent placement (that would be a language extension).
> 
> Note: aarch4 did not report such a failure when built from the same
> source tree on the same machine. an amd64 system also did not report the
> failure when based on a copy of the same source tree.
> 
> 
> My prior context predated:
> 
> author	Brooks Davis <brooks@FreeBSD.org>	2026-08-03 16:50:01 +0000
> committer	Brooks Davis <brooks@FreeBSD.org>	2026-08-03 21:43:23 +0000
> commit	295f10230903d54c700518467c4ea4492f5c4faa (patch)
> tree	fc76723160a417b8aa23121ff7a8a4e29f634527 /sys/kern/kern_linker.c
> parent	bbf95a9b8481e41a99b301e12338e1cda6915a01 (diff)
> 
> exterror(9): dynamic kernel categories
> 
> Make it possible to define categories without compiling their
> paths into libc (important for third-party modules).  The
> EXTERR_CATEGORY_DYNAMIC macro can be defined to a string describing the
> compilation unit (generally the path relative to src/sys) which takes
> the place of EXTERR_CATEGORY.
> 
> These strings are assembled in linker sets with category numbers
> assigned at system startup or module load time.  The strings can be
> retrieved from the kern.exterr.categories.<category> sysctl.
> 
> Reviewed by:	kib
> Sponsored by:	Innovate UK
> Differential Revision:	https://reviews.freebsd.org/D58237
> 
> The code from that is:
> 
> +static void
> +linker_file_register_exterr(linker_file_t lf)
> +{
> +	struct exterr_cat **start, **stop;
> +
> +	KLD_DPF(FILE,
> +	    (__func__ ": registering exterror categories for %s\n",
> +	    lf->filename));
> +
> +	sx_assert(&kld_sx, SA_XLOCKED);
> +
> +	if (linker_file_lookup_set(lf, "exterr_cats", &start, &stop, NULL) != 0)
> +		return;
> +
> +	exterr_cat_register_module(start, stop);
> +}
> +
> +static void
> +linker_file_unregister_exterr(linker_file_t lf)
> +{
> +	struct exterr_cat **start, **stop;
> +
> +	KLD_DPF(FILE,
> +	    (__func__ ": unregistering exterror categories for %s\n",
> +	    lf->filename));
> +
> +	sx_assert(&kld_sx, SA_XLOCKED);
> +
> +	if (linker_file_lookup_set(lf, "exterr_cats", &start, &stop, NULL) != 0)
> +		return;
> +
> +	exterr_cat_unregister_module(start, stop);
> +}
> +
> 
> 
> -- 
> ===
> Mark Millard
> marklmi at yahoo.com
>