git: 4305fd126c77 - stable/13 - Kernel linkers: add emergency sysctl to restore old behavior
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 15 Dec 2021 01:55:17 UTC
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=4305fd126c77143f3f3205e201ec413ae2012a0f
commit 4305fd126c77143f3f3205e201ec413ae2012a0f
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-11-07 09:26:26 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-12-15 01:41:29 +0000
Kernel linkers: add emergency sysctl to restore old behavior
PR: 207898
(cherry picked from commit ecd8245e0d7784bcd78dafce233f303eee765068)
---
sys/kern/link_elf.c | 9 +++++++++
sys/kern/link_elf_obj.c | 12 ++++++++++--
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 445260246946..245c8697cf79 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -194,6 +194,11 @@ static struct linker_class link_elf_class = {
link_elf_methods, sizeof(struct elf_file)
};
+static bool link_elf_leak_locals = true;
+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");
+
typedef int (*elf_reloc_fn)(linker_file_t lf, Elf_Addr relocbase,
const void *data, int type, elf_lookup_fn lookup);
@@ -1552,6 +1557,8 @@ link_elf_lookup_symbol1(linker_file_t lf, const char *name, c_linker_sym_t *sym,
static int
link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
{
+ if (link_elf_leak_locals)
+ return (link_elf_lookup_debug_symbol(lf, name, sym));
return (link_elf_lookup_symbol1(lf, name, sym, false));
}
@@ -1612,6 +1619,8 @@ static int
link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym,
linker_symval_t *symval)
{
+ if (link_elf_leak_locals)
+ return (link_elf_debug_symbol_values(lf, sym, symval));
return (link_elf_symbol_values1(lf, sym, symval, false));
}
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index 2c1b7713c346..689aeae86840 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/rwlock.h>
+#include <sys/sysctl.h>
#include <sys/vnode.h>
#include <machine/elf.h>
@@ -183,6 +184,11 @@ static struct linker_class link_elf_class = {
link_elf_methods, sizeof(struct elf_file)
};
+static bool link_elf_obj_leak_locals = true;
+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");
+
static int relocate_file(elf_file_t ef);
static void elf_obj_cleanup_globals_cache(elf_file_t);
@@ -1455,7 +1461,8 @@ link_elf_lookup_symbol1(linker_file_t lf, const char *name, c_linker_sym_t *sym,
static int
link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
{
- return (link_elf_lookup_symbol1(lf, name, sym, false));
+ return (link_elf_lookup_symbol1(lf, name, sym,
+ link_elf_obj_leak_locals));
}
static int
@@ -1494,7 +1501,8 @@ static int
link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym,
linker_symval_t *symval)
{
- return (link_elf_symbol_values1(lf, sym, symval, false));
+ return (link_elf_symbol_values1(lf, sym, symval,
+ link_elf_obj_leak_locals));
}
static int