Re: git: 9562994a7aac - main - kernel linker: Disable local sym resolution by default
- In reply to: Ed Maste : "git: 9562994a7aac - main - kernel linker: Disable local sym resolution by default"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 25 Nov 2025 16:32:32 UTC
On Tue, 25 Nov 2025 13:49:40 +0000
Ed Maste <emaste@FreeBSD.org> wrote:
> The branch main has been updated by emaste:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=9562994a7aacee2baae6ddee1a7b558b48ae39ef
>
> commit 9562994a7aacee2baae6ddee1a7b558b48ae39ef
> Author: Ed Maste <emaste@FreeBSD.org>
> AuthorDate: 2024-11-25 19:05:54 +0000
> Commit: Ed Maste <emaste@FreeBSD.org>
> CommitDate: 2025-11-25 13:49:20 +0000
>
> kernel linker: Disable local sym resolution by default
>
> In 95c20faf11a1 and ecd8245e0d77 kib introduced support to have the
> kernel linker stop resolving local symbols from other files, but did
> not enable it by default to avoid surprises. Flip the default now,
> before FreeBSD 16.0.
>
> The debug.link_elf_leak_locals and debug.link_elf_obj_leak_locals
> sysctls are available to revert to the previous behaviour if necessary.
>
> PR: 207898
> Reviewed by: bz
> Relnotes: Yes
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D47742
> ---
> UPDATING | 9 +++++++++
> sys/kern/link_elf.c | 2 +-
> sys/kern/link_elf_obj.c | 2 +-
> 3 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/UPDATING b/UPDATING
> index aaef0e5b4cd3..7f0cb44181d3 100644
> --- a/UPDATING
> +++ b/UPDATING
> @@ -27,6 +27,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:
> world, or to merely disable the most expensive debugging functionality
> at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
>
> +20251125:
> + The `debug.link_elf_leak_locals` and `debug.link_elf_obj_leak_locals`
> + sysctls now default to 0, so the kernel module linker no longer
> + performs symbol resolution against local symbols from other modules.
> +
> + If a kernel module now fails to load because of an unresolved symbol,
> + set these sysctls to 1 and file a bug report including details about
> + the affected module.
> +
> 20251115:
> The FreeBSD-base repository is now defined in /etc/pkg/FreeBSD.conf,
> disabled by default. In -CURRENT and -STABLE this points at nightly
> diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
> index ebd203858b66..f910fc3d5df5 100644
> --- a/sys/kern/link_elf.c
> +++ b/sys/kern/link_elf.c
> @@ -203,7 +203,7 @@ static struct linker_class link_elf_class = {
> link_elf_methods, sizeof(struct elf_file)
> };
>
> -static bool link_elf_leak_locals = true;
> +static bool link_elf_leak_locals = false;
> SYSCTL_BOOL(_debug, OID_AUTO, link_elf_leak_locals,
> CTLFLAG_RWTUN, &link_elf_leak_locals, 0,
> "Allow local symbols to participate in global module symbol resolution");
> diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
> index a3a53a39bfd6..759cd75cba31 100644
> --- a/sys/kern/link_elf_obj.c
> +++ b/sys/kern/link_elf_obj.c
> @@ -192,7 +192,7 @@ static struct linker_class link_elf_class = {
> link_elf_methods, sizeof(struct elf_file)
> };
>
> -static bool link_elf_obj_leak_locals = true;
> +static bool link_elf_obj_leak_locals = false;
> SYSCTL_BOOL(_debug, OID_AUTO, link_elf_obj_leak_locals,
> CTLFLAG_RWTUN, &link_elf_obj_leak_locals, 0,
> "Allow local symbols to participate in global module symbol resolution");
>
After updating recent CURRENT, x11/nvidia-driver (nvidia-modeset) fails to load.
Setting both
debug.link_elf_leak_locals=1
debug.link_elf_obj_leak_locals=1
in /etc/sysctl.conf results in a stuck system: No graphics, stuck keyboard (no change to
console possible). Shutting down the box leaves me with a stuck system (need to shutoff
power the hard way, no reboot).
Regards,
oliver