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 <[email protected]> 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
