Re: Personal aarch64 FreeBSD OS build gets SIGSEGV during: ./pmu-events/jevents arm64 /usr/main-src/lib/libpmc/pmu-events/arch libpmc_event [cause identified]

From: Mark Millard <marklmi_at_yahoo.com>
Date: Tue, 22 Sep 2026 15:25:56 UTC
On 9/22/26 08:21, Mark Millard wrote:
> On 9/22/26 06:43, Alan Somers wrote:
>> On Sun, Sep 20, 2026 at 10:46 PM Mark Millard <marklmi@yahoo.com> wrote:
>>>
>>> On 9/20/26 18:54, Mark Millard wrote:
>>>> On 9/20/26 11:13, Mark Millard wrote:
>>>>> [I have CC'd a could of authors with recent libpmc commits. I did not
>>>>> list any recent libc authors.]
>>>>>
>>>>> . . .
>>>>>
>>>>
>>>> I found the type of problem --but it is not a obvious extension of
>>>> the prior material: META_MODE recorded something that indicates the
>>>> actual problem . . .
>>>>
>>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jevents.pieo.meta:R
>>>> 12651 /usr/include/fts.h
>>>>
>>>> The build is using the /usr/include/fts.h from the live old system
>>>> while trying to build the new system.
>>>>
>>>> Given the FTSENT change of layout from old to new, that does not
>>>> work. Also, this is not something that clearing out /usr/obj/ . . .
>>>> and rebuilding fixes.
>>>>
>>>> The build of lib/libpmc/pmu-events/jevents.* should get the fts.h
>>>> file from the source tree being built, in my case I was working in
>>>> /usr/main-src/ so:
>>>>
>>>> # find -s /usr/main-src/ -name fts.h -print
>>>> /usr/main-src/include/fts.h
>>>>
>>>> lists a path to the file that should have been used for the build.
>>>>
>>>> I expect that this would be a libpmc development issue, not a fts
>>>> development issue for who solves it.
>>>>
>>>>
>>>> Also: this turns out to not be an arm specific problem.
>>>>
>>>>
>>>
>>> The problematic include handling for building system updates extends far
>>> beyond the specific example in jevents.pieo.meta : All but 8 of the many
>>> include file usages were strictly tied to the old live system instead of
>>> to the new system's source tree (to some degree):
>>> (The ones that mention main-src are those that involve the source tree
>>> that I was doing the build for.)
>>>
>>> # grep -e /include/ -e '\.h$'
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jevents.pieo.meta
>>> R 12651 /usr/include/sys/param.h
>>> R 12651 /usr/include/sys/_null.h
>>> R 12651 /usr/include/sys/_param.h
>>> R 12651 /usr/include/sys/types.h
>>> R 12651
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/tmp/legacy/usr/include/sys/cdefs.h
>>> R 12651
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/tmp/legacy/usr/include/sys/_decls.h
>>> R 12651
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/tmp/legacy/usr/include/sys/_visible.h
>>> R 12651 /usr/include/machine/endian.h
>>> R 12651 /usr/include/sys/_types.h
>>> R 12651 /usr/include/machine/_types.h
>>> R 12651 /usr/include/sys/_endian.h
>>> R 12651 /usr/include/sys/_offsetof.h
>>> R 12651 /usr/include/sys/_pthreadtypes.h
>>> R 12651 /usr/include/sys/_stdint.h
>>> R 12651 /usr/include/sys/bitcount.h
>>> R 12651 /usr/include/sys/select.h
>>> R 12651 /usr/include/sys/_sigset.h
>>> R 12651 /usr/include/sys/_timeval.h
>>> R 12651 /usr/include/sys/timespec.h
>>> R 12651 /usr/include/sys/_timespec.h
>>> R 12651 /usr/include/sys/syslimits.h
>>> R 12651 /usr/include/sys/signal.h
>>> R 12651 /usr/include/sys/_sigaltstack.h
>>> R 12651 /usr/include/sys/_sigval.h
>>> R 12651 /usr/include/machine/_limits.h
>>> R 12651 /usr/include/machine/signal.h
>>> R 12651 /usr/include/machine/param.h
>>> R 12651 /usr/include/sys/_align.h
>>> R 12651 /usr/include/sys/limits.h
>>> R 12651 /usr/include/sys/_maxphys.h
>>> R 12651 /usr/include/sys/resource.h
>>> R 12651 /usr/include/sys/stat.h
>>> R 12651 /usr/include/sys/time.h
>>> R 12651 /usr/include/sys/_clock_id.h
>>> R 12651 /usr/include/time.h
>>> R 12651 /usr/include/xlocale/_time.h
>>> R 12651 /usr/include/ctype.h
>>> R 12651 /usr/include/_ctype.h
>>> R 12651 /usr/include/runetype.h
>>> R 12651 /usr/include/xlocale/_ctype.h
>>> R 12651 /usr/include/dirent.h
>>> R 12651 /usr/include/sys/dirent.h
>>> R 12651 /usr/include/errno.h
>>> R 12651 /usr/include/libgen.h
>>> R 12651 /usr/include/limits.h
>>> R 12651 /usr/include/stdarg.h
>>> R 12651 /usr/include/sys/_stdarg.h
>>> R 12651
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/tmp/legacy/usr/include/stddef.h
>>> R 12651 /usr/include/stddef.h
>>> R 12651 /usr/include/stdio.h
>>> R 12651 /usr/include/stdlib.h
>>> R 12651 /usr/include/string.h
>>> R 12651 /usr/include/strings.h
>>> R 12651 /usr/include/xlocale/_strings.h
>>> R 12651 /usr/include/xlocale/_string.h
>>> R 12651 /usr/include/unistd.h
>>> R 12651 /usr/include/sys/unistd.h
>>> R 12651 /usr/include/ftw.h
>>> R 12651 /usr/main-src/lib/libpmc/pmu-events/list.h
>>> R 12651 /usr/main-src/lib/libpmc/pmu-events/jsmn.h
>>> R 12651 /usr/main-src/lib/libpmc/pmu-events/json.h
>>> R 12651 /usr/include/stdbool.h
>>> R 12651 /usr/main-src/lib/libpmc/pmu-events/pmu-events.h
>>> R 12651 /usr/include/fts.h
>>>
>>>
>>> Some of those may be lower risk of incompatible changes than others but
>>> the general trend is not good for doing system builds when layout
>>> changes or other incompatibilities are introduced.
>>>
>>> Of course, there are some things that are built for operation on the
>>> older system instead of the newer one. So the classification is case by
>>> case across the various *.meta files.
>>>
>>>
>>> Taking a quick stab at finding other examples (incomplete because of the
>>> failed build):
>>>
>>> # find -s /usr/obj/BUILDs/main-CA76-nodbg-clang/ -name \*.meta -exec
>>> grep -l -e ' /usr/include/' {} \; | grep -v /tmp/obj-tools/
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/bin/csh/gethost.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/bin/sh/mknodes.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/bin/sh/mksyntax.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/host-osreldate.h.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libmagic/mkmagic.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jevents.pieo.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jsmn.pieo.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/json.pieo.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/ncurses/tinfo/make_hash.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/lib/ncurses/tinfo/make_keys.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/rescue/rescue/usr/main-src/bin/csh/gethost.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/rescue/rescue/usr/main-src/bin/sh/mknodes.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/rescue/rescue/usr/main-src/bin/sh/mksyntax.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/armscii8-2haik8.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/iso-8859-1_to_cp437.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/iso-8859-4_for_vga9.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/iso-8859-7_to_cp437.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/koi8-r2cp866.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/koi8-u2cp866u.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/share/syscons/scrnmaps/us-ascii_to_cp437.mk.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/usr.bin/awk/maketab.meta
>>> /usr/obj/BUILDs/main-CA76-nodbg-clang/usr/main-src/arm64.aarch64/usr.bin/vi/catalog/dump.meta
>>>
>>>
>>> --
>>> ===
>>> Mark Millard
>>> marklmi at yahoo.com
>>
>> Interesting find.  And I can reproduce it, partially.  If I build
>> 16.0-CURRENT from a 15.1 host, and look at the generated symbols:
>>
>>> objdump -T /usr/obj/.../amd64.amd64/lib/libpmc/pmu-events/jevents.full | grep fts_
>> 0000000000000000      DF *UND*  0000000000000000 (FBSD_1.5)   fts_open
>> 0000000000000000      DF *UND*  0000000000000000 (FBSD_1.5)   fts_read
>> 0000000000000000      DF *UND*  0000000000000000 (FBSD_1.5)   fts_close
>>
>> I see the FBSD_1.5 version of those symbols.  It should be FBSD_1.9
>> instead.  Indeed, if I build from a 16.0 host I do see the FBSD_1.9
>> symbols.  So the build is definitely wrong.  But that doesn't quite
>> explain why you would get a segfault.  Linking to the FBSD_1.5 symbols
>> while using the old header files should work fine.  So I wonder if the
>> build is somehow including a mixture of old header files and new ones.
>> That would explain a segfault.
>>
>>
> 
> Yes, it is getting a mnixture: one place gets /usr/inbclude/fts.h .
> 
> Using find for .meta files in the build directorty tree and grep for
> fts.h in such files I find:
> 
> ) The odd:
> 
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jevents.pieo.meta:R
> 77658 /usr/include/fts.h
> 
> ) Mostly reference to: /usr/main-src/include/fts.h
>   (I'll not show the list of places.)
> 
> For reference:
> 
> # diff -u /usr/include/fts.h /usr/main-src/include/fts.h
> --- /usr/include/fts.h	2025-05-11 07:29:42.791259000 -0700
> +++ /usr/main-src/include/fts.h	2026-09-18 16:13:35.766402000 -0700
> @@ -1,4 +1,4 @@
> -/*-
> +/*
>   * SPDX-License-Identifier: BSD-3-Clause
>   *
>   * Copyright (c) 1989, 1993
> @@ -92,6 +92,8 @@
>  	char *fts_path;			/* root path */
>  	int fts_errno;			/* errno for this node */
>  	int fts_symfd;			/* fd for symlink */
> +	int fts_dirfd;                  /* fd for this directory, if a
> directory */
> +	int __fts_reserved[3];          /* reserved for future use */
>  	__size_t fts_pathlen;		/* strlen(fts_path) */
>  	__size_t fts_namelen;		/* strlen(fts_name) */
> 
> @@ -146,6 +148,8 @@
>  #define	 fts_get_stream(ftsent)	((ftsent)->fts_fts)
>  FTS	*fts_open(char * const *, int,
>  	    int (*)(const FTSENT * const *, const FTSENT * const *));
> +FTS	*fts_openat(int, char * const *, int,
> +	    int (*)(const FTSENT * const *, const FTSENT * const *));
>  #ifdef __BLOCKS__
>  FTS	*fts_open_b(char * const *, int,
>  	    int (^)(const FTSENT * const *, const FTSENT * const *));
> 
> ) A rereference:
> 
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libsysdecode/ioctl.c.tmp.meta:R
> 64787 ./fts.h
> 
> There are a lot of ./. . ./*.h paths in this meta file. If I gatehr
> right, these are relative to:
> 
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/
> 
> For reference:
> 
> # diff -u
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/main-src/include/fts.h
> #
> 
> 
> ) There are references:
> 
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/asan/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 60898
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/asan_dynamic/sanitizer_common_sanitizer_platform_limits_freebsd.pico.meta:R
> 61150
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/cfi/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 60129
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/cfi_diag/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 60241
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/msan/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 61596
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/stats/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 61726
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/tsan/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 61835
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/ubsan_standalone/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 62121
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libclang_rt/xray/sanitizer_common_sanitizer_platform_limits_freebsd.o.meta:R
> 62367
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> 
> For reference:
> 
> # diff -u
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/tmp/usr/include/fts.h
> /usr/main-src/include/fts.h
> #
> 
> ) I ignore here references in . . ./include/_INCSINS.meta
> 
> 
> So, just the one example:

Sorry, poor wording above. Missing: of fts.h

> 
> /usr/obj/BUILDs/main-CA76-dbg-clang/usr/main-src/arm64.aarch64/lib/libpmc/pmu-events/jevents.pieo.meta:R
> 77658 /usr/include/fts.h
> 
> 

jevents.pieo.meta shows lots of other *.h files incorrectly from the
/usr/include/ area as well.

-- 
===
Mark Millard
marklmi at yahoo.com