git: 2956f5885cf4 - main - Add an UNDEFINED_VERSION option

From: Brooks Davis <brooks_at_FreeBSD.org>
Date: Fri, 01 Mar 2024 23:22:28 UTC
The branch main has been updated by brooks:

URL: https://cgit.FreeBSD.org/src/commit/?id=2956f5885cf4f001bd5c220ee9753d49aa1ad656

commit 2956f5885cf4f001bd5c220ee9753d49aa1ad656
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2024-03-01 23:21:46 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2024-03-01 23:22:11 +0000

    Add an UNDEFINED_VERSION option
    
    When enabled (current default) link with --undefined-version to allow
    symbol maps to contain symbols not defined by libraries.  When disabled,
    link with --no-undefined-version to disallow these bugs.
    
    WITHOUT_UNDEFINED_VERSION is currently broken.  Once it is fixed it
    should be made the default and this option should likely be removed.
    
    Reviewed by:    dim, emaste
    Differential Revision:  https://reviews.freebsd.org/D44169
---
 share/man/man5/src.conf.5                     |  5 ++++-
 share/mk/bsd.lib.mk                           | 10 ++++++----
 share/mk/bsd.opts.mk                          |  1 +
 tools/build/options/WITHOUT_UNDEFINED_VERSION |  2 ++
 4 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index 2713e7416a52..255d5a567ec0 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,5 +1,5 @@
 .\" DO NOT EDIT-- this file is @generated by tools/build/options/makeman.
-.Dd February 17, 2024
+.Dd March 1, 2024
 .Dt SRC.CONF 5
 .Os
 .Sh NAME
@@ -1726,6 +1726,9 @@ and that the runtime support library is available
 Do not build
 .Xr unbound 8
 and related programs.
+.It Va WITHOUT_UNDEFINED_VERSION
+Link libraries with --no-undefined-version to ensure all symbols are
+provided.
 .It Va WITHOUT_UNIFIED_OBJDIR
 Use the historical object directory format for
 .Xr build 7
diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk
index 3cb2f9305e45..981d0b49df39 100644
--- a/share/mk/bsd.lib.mk
+++ b/share/mk/bsd.lib.mk
@@ -260,10 +260,12 @@ SHLIB_NAME_FULL=${SHLIB_NAME}
 ${SHLIB_NAME_FULL}:	${VERSION_MAP}
 LDFLAGS+=	-Wl,--version-script=${VERSION_MAP}
 
-# lld >= 16 turned on --no-undefined-version by default, but we have several
-# symbols in our version maps that may or may not exist, depending on
-# compile-time defines.
-.if ${LINKER_TYPE} == "lld" && ${LINKER_VERSION} >= 160000
+# Ideally we'd always enable --no-undefined-version (default for lld >= 16),
+# but we have several symbols in our version maps that may or may not exist,
+# depending on compile-time defines and that needs to be handled first.
+.if ${MK_UNDEFINED_VERSION} == "no"
+LDFLAGS+=	-Wl,--no-undefined-version
+.else
 LDFLAGS+=	-Wl,--undefined-version
 .endif
 .endif
diff --git a/share/mk/bsd.opts.mk b/share/mk/bsd.opts.mk
index 51260533e265..dcfe64ac1350 100644
--- a/share/mk/bsd.opts.mk
+++ b/share/mk/bsd.opts.mk
@@ -68,6 +68,7 @@ __DEFAULT_YES_OPTIONS = \
     SSP \
     TESTS \
     TOOLCHAIN \
+    UNDEFINED_VERSION \
     WARNS \
     WERROR
 
diff --git a/tools/build/options/WITHOUT_UNDEFINED_VERSION b/tools/build/options/WITHOUT_UNDEFINED_VERSION
new file mode 100644
index 000000000000..0e58eb00f3c1
--- /dev/null
+++ b/tools/build/options/WITHOUT_UNDEFINED_VERSION
@@ -0,0 +1,2 @@
+Link libraries with --no-undefined-version to ensure all symbols are
+provided.