Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147588923
D32878.1783824822.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
14 KB
Referenced Files
None
Subscribers
None
D32878.1783824822.diff
View Options
diff --git a/sys/conf/kmod_syms.awk b/sys/conf/kmod_syms.awk
--- a/sys/conf/kmod_syms.awk
+++ b/sys/conf/kmod_syms.awk
@@ -2,6 +2,7 @@
# Read global symbols from object file.
BEGIN {
+ modname = ARGV[1]
while ("${NM:='nm'} -g " ARGV[1] | getline) {
if (match($0, /^[^[:space:]]+ [^AU] (.*)$/)) {
syms[$3] = $2
@@ -12,7 +13,12 @@
# De-list symbols from the export list.
{
- delete syms[$0]
+ smbl = $0
+ if (!(smbl in syms)) {
+ printf "Symbol %s is not present in %s\n", \
+ smbl, modname > "/dev/stderr"
+ }
+ delete syms[smbl]
}
# Strip commons, make everything else local.
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -911,7 +911,7 @@
linker_file_t lf;
TAILQ_FOREACH(lf, &linker_files, link) {
- if (LINKER_LOOKUP_SYMBOL(lf, symstr, sym) == 0)
+ if (LINKER_LOOKUP_DEBUG_SYMBOL(lf, symstr, sym) == 0)
return (0);
}
return (ENOENT);
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -144,8 +144,12 @@
linker_file_t *);
static int link_elf_lookup_symbol(linker_file_t, const char *,
c_linker_sym_t *);
+static int link_elf_lookup_debug_symbol(linker_file_t, const char *,
+ c_linker_sym_t *);
static int link_elf_symbol_values(linker_file_t, c_linker_sym_t,
linker_symval_t *);
+static int link_elf_debug_symbol_values(linker_file_t, c_linker_sym_t,
+ linker_symval_t*);
static int link_elf_search_symbol(linker_file_t, caddr_t,
c_linker_sym_t *, long *);
@@ -162,9 +166,12 @@
static long link_elf_strtab_get(linker_file_t, caddr_t *);
static int elf_lookup(linker_file_t, Elf_Size, int, Elf_Addr *);
+
static kobj_method_t link_elf_methods[] = {
KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol),
+ KOBJMETHOD(linker_lookup_debug_symbol, link_elf_lookup_debug_symbol),
KOBJMETHOD(linker_symbol_values, link_elf_symbol_values),
+ KOBJMETHOD(linker_debug_symbol_values, link_elf_debug_symbol_values),
KOBJMETHOD(linker_search_symbol, link_elf_search_symbol),
KOBJMETHOD(linker_unload, link_elf_unload_file),
KOBJMETHOD(linker_load_file, link_elf_load_file),
@@ -188,6 +195,11 @@
link_elf_methods, sizeof(struct elf_file)
};
+static bool link_elf_leak_locals;
+SYSCTL_BOOL(_kern, OID_AUTO, link_elf_leak_locals,
+ CTLFLAG_RWTUN, &link_elf_leak_locals, 0,
+ "");
+
typedef int (*elf_reloc_fn)(linker_file_t lf, Elf_Addr relocbase,
const void *data, int type, elf_lookup_fn lookup);
@@ -1490,14 +1502,14 @@
}
static int
-link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
+link_elf_lookup_symbol1(linker_file_t lf, const char *name, c_linker_sym_t *sym,
+ bool see_local)
{
elf_file_t ef = (elf_file_t) lf;
unsigned long symnum;
const Elf_Sym* symp;
const char *strp;
unsigned long hash;
- int i;
/* If we don't have a hash, bail. */
if (ef->buckets == NULL || ef->nbuckets == 0) {
@@ -1528,8 +1540,11 @@
(symp->st_value != 0 &&
(ELF_ST_TYPE(symp->st_info) == STT_FUNC ||
ELF_ST_TYPE(symp->st_info) == STT_GNU_IFUNC))) {
- *sym = (c_linker_sym_t) symp;
- return (0);
+ if (see_local ||
+ ELF_ST_BIND(symp->st_info) != STB_LOCAL) {
+ *sym = (c_linker_sym_t) symp;
+ return (0);
+ }
}
return (ENOENT);
}
@@ -1537,11 +1552,29 @@
symnum = ef->chains[symnum];
}
- /* If we have not found it, look at the full table (if loaded) */
- if (ef->symtab == ef->ddbsymtab)
- return (ENOENT);
+ return (ENOENT);
+}
+
+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, link_elf_leak_locals));
+}
+
+static int
+link_elf_lookup_debug_symbol(linker_file_t lf, const char *name,
+ c_linker_sym_t *sym)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ const Elf_Sym* symp;
+ const char *strp;
+ int i;
+
+ if (link_elf_lookup_symbol1(lf, name, sym, true) == 0)
+ return (0);
- /* Exhaustive search */
for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
strp = ef->ddbstrtab + symp->st_name;
if (strcmp(name, strp) == 0) {
@@ -1560,8 +1593,8 @@
}
static int
-link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym,
- linker_symval_t *symval)
+link_elf_symbol_values1(linker_file_t lf, c_linker_sym_t sym,
+ linker_symval_t *symval, bool see_local)
{
elf_file_t ef;
const Elf_Sym *es;
@@ -1569,7 +1602,9 @@
ef = (elf_file_t)lf;
es = (const Elf_Sym *)sym;
- if (es >= ef->symtab && es < (ef->symtab + ef->nchains)) {
+ if (es >= ef->symtab && es < ef->symtab + ef->nchains) {
+ if (!see_local && ELF_ST_BIND(es->st_info) == STB_LOCAL)
+ return (ENOENT);
symval->name = ef->strtab + es->st_name;
val = (caddr_t)ef->address + es->st_value;
if (ELF_ST_TYPE(es->st_info) == STT_GNU_IFUNC)
@@ -1578,8 +1613,31 @@
symval->size = es->st_size;
return (0);
}
+ return (ENOENT);
+}
+
+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));
+}
+
+static int
+link_elf_debug_symbol_values(linker_file_t lf, c_linker_sym_t sym,
+ linker_symval_t *symval)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ const Elf_Sym *es = (const Elf_Sym *)sym;
+ caddr_t val;
+
+ if (link_elf_symbol_values1(lf, sym, symval, true) == 0)
+ return (0);
if (ef->symtab == ef->ddbsymtab)
return (ENOENT);
+
if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
symval->name = ef->ddbstrtab + es->st_name;
val = (caddr_t)ef->address + es->st_value;
@@ -1596,12 +1654,12 @@
link_elf_search_symbol(linker_file_t lf, caddr_t value,
c_linker_sym_t *sym, long *diffp)
{
- elf_file_t ef = (elf_file_t) lf;
- u_long off = (uintptr_t) (void *) value;
+ elf_file_t ef = (elf_file_t)lf;
+ u_long off = (uintptr_t) (void *)value;
u_long diff = off;
u_long st_value;
- const Elf_Sym* es;
- const Elf_Sym* best = NULL;
+ const Elf_Sym *es;
+ const Elf_Sym *best = NULL;
int i;
for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) {
@@ -1711,7 +1769,7 @@
{
linker_symval_t symval;
elf_file_t ef = (elf_file_t)file;
- const Elf_Sym* symp;
+ const Elf_Sym *symp;
int i, error;
/* Exhaustive search */
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -44,6 +44,7 @@
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/rwlock.h>
+#include <sys/sysctl.h>
#include <sys/vnode.h>
#include <machine/elf.h>
@@ -131,8 +132,12 @@
static int link_elf_load_file(linker_class_t, const char *, linker_file_t *);
static int link_elf_lookup_symbol(linker_file_t, const char *,
c_linker_sym_t *);
+static int link_elf_lookup_debug_symbol(linker_file_t, const char *,
+ c_linker_sym_t *);
static int link_elf_symbol_values(linker_file_t, c_linker_sym_t,
linker_symval_t *);
+static int link_elf_debug_symbol_values(linker_file_t, c_linker_sym_t,
+ linker_symval_t *);
static int link_elf_search_symbol(linker_file_t, caddr_t value,
c_linker_sym_t *sym, long *diffp);
@@ -153,7 +158,9 @@
static kobj_method_t link_elf_methods[] = {
KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol),
+ KOBJMETHOD(linker_lookup_debug_symbol, link_elf_lookup_debug_symbol),
KOBJMETHOD(linker_symbol_values, link_elf_symbol_values),
+ KOBJMETHOD(linker_debug_symbol_values, link_elf_debug_symbol_values),
KOBJMETHOD(linker_search_symbol, link_elf_search_symbol),
KOBJMETHOD(linker_unload, link_elf_unload_file),
KOBJMETHOD(linker_load_file, link_elf_load_file),
@@ -177,6 +184,11 @@
link_elf_methods, sizeof(struct elf_file)
};
+static bool link_elf_obj_leak_locals;
+SYSCTL_BOOL(_kern, OID_AUTO, link_elf_obj_leak_locals,
+ CTLFLAG_RWTUN, &link_elf_obj_leak_locals, 0,
+ "");
+
static int relocate_file(elf_file_t ef);
static void elf_obj_cleanup_globals_cache(elf_file_t);
@@ -1407,9 +1419,10 @@
}
static int
-link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
+link_elf_lookup_symbol1(linker_file_t lf, const char *name, c_linker_sym_t *sym,
+ bool see_local)
{
- elf_file_t ef = (elf_file_t) lf;
+ elf_file_t ef = (elf_file_t)lf;
const Elf_Sym *symp;
const char *strp;
int i;
@@ -1417,16 +1430,34 @@
for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
strp = ef->ddbstrtab + symp->st_name;
if (symp->st_shndx != SHN_UNDEF && strcmp(name, strp) == 0) {
- *sym = (c_linker_sym_t) symp;
- return 0;
+ if (see_local ||
+ ELF_ST_BIND(symp->st_info) == STB_GLOBAL) {
+ *sym = (c_linker_sym_t) symp;
+ return (0);
+ }
+ return (ENOENT);
}
}
- return ENOENT;
+ return (ENOENT);
}
static int
-link_elf_symbol_values(linker_file_t lf, c_linker_sym_t sym,
- linker_symval_t *symval)
+link_elf_lookup_symbol(linker_file_t lf, const char *name, c_linker_sym_t *sym)
+{
+ return (link_elf_lookup_symbol1(lf, name, sym,
+ link_elf_obj_leak_locals));
+}
+
+static int
+link_elf_lookup_debug_symbol(linker_file_t lf, const char *name,
+ c_linker_sym_t *sym)
+{
+ return (link_elf_lookup_symbol1(lf, name, sym, true));
+}
+
+static int
+link_elf_symbol_values1(linker_file_t lf, c_linker_sym_t sym,
+ linker_symval_t *symval, bool see_local)
{
elf_file_t ef;
const Elf_Sym *es;
@@ -1436,23 +1467,40 @@
es = (const Elf_Sym*) sym;
val = (caddr_t)es->st_value;
if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
+ if (!see_local && ELF_ST_BIND(es->st_info) == STB_LOCAL)
+ return (ENOENT);
symval->name = ef->ddbstrtab + es->st_name;
val = (caddr_t)es->st_value;
if (ELF_ST_TYPE(es->st_info) == STT_GNU_IFUNC)
val = ((caddr_t (*)(void))val)();
symval->value = val;
symval->size = es->st_size;
- return 0;
+ return (0);
}
- return ENOENT;
+ return (ENOENT);
+}
+
+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,
+ link_elf_obj_leak_locals));
+}
+
+static int
+link_elf_debug_symbol_values(linker_file_t lf, c_linker_sym_t sym,
+ linker_symval_t *symval)
+{
+ return (link_elf_symbol_values1(lf, sym, symval, true));
}
static int
link_elf_search_symbol(linker_file_t lf, caddr_t value,
c_linker_sym_t *sym, long *diffp)
{
- elf_file_t ef = (elf_file_t) lf;
- u_long off = (uintptr_t) (void *) value;
+ elf_file_t ef = (elf_file_t)lf;
+ u_long off = (uintptr_t)(void *)value;
u_long diff = off;
u_long st_value;
const Elf_Sym *es;
@@ -1480,7 +1528,7 @@
*diffp = diff;
*sym = (c_linker_sym_t) best;
- return 0;
+ return (0);
}
/*
@@ -1779,25 +1827,21 @@
static long
link_elf_symtab_get(linker_file_t lf, const Elf_Sym **symtab)
{
- elf_file_t ef = (elf_file_t)lf;
-
- *symtab = ef->ddbsymtab;
-
- if (*symtab == NULL)
- return (0);
+ elf_file_t ef = (elf_file_t)lf;
- return (ef->ddbsymcnt);
+ *symtab = ef->ddbsymtab;
+ if (*symtab == NULL)
+ return (0);
+ return (ef->ddbsymcnt);
}
static long
link_elf_strtab_get(linker_file_t lf, caddr_t *strtab)
{
- elf_file_t ef = (elf_file_t)lf;
-
- *strtab = ef->ddbstrtab;
-
- if (*strtab == NULL)
- return (0);
+ elf_file_t ef = (elf_file_t)lf;
- return (ef->ddbstrcnt);
+ *strtab = ef->ddbstrtab;
+ if (*strtab == NULL)
+ return (0);
+ return (ef->ddbstrcnt);
}
diff --git a/sys/kern/linker_if.m b/sys/kern/linker_if.m
--- a/sys/kern/linker_if.m
+++ b/sys/kern/linker_if.m
@@ -40,12 +40,24 @@
c_linker_sym_t* symp;
};
+METHOD int lookup_debug_symbol {
+ linker_file_t file;
+ const char* name;
+ c_linker_sym_t* symp;
+};
+
METHOD int symbol_values {
linker_file_t file;
c_linker_sym_t sym;
linker_symval_t* valp;
};
+METHOD int debug_symbol_values {
+ linker_file_t file;
+ c_linker_sym_t sym;
+ linker_symval_t* valp;
+};
+
METHOD int search_symbol {
linker_file_t file;
caddr_t value;
diff --git a/sys/modules/ata/atacore/Makefile b/sys/modules/ata/atacore/Makefile
--- a/sys/modules/ata/atacore/Makefile
+++ b/sys/modules/ata/atacore/Makefile
@@ -6,4 +6,6 @@
SRCS= ata-all.c ata_if.c ata-lowlevel.c
SRCS+= ata_if.h bus_if.h device_if.h opt_cam.h pci_if.h
+EXPORT_SYMS= YES
+
.include <bsd.kmod.mk>
diff --git a/sys/modules/linux_common/Makefile b/sys/modules/linux_common/Makefile
--- a/sys/modules/linux_common/Makefile
+++ b/sys/modules/linux_common/Makefile
@@ -9,8 +9,6 @@
EXPORT_SYMS=
EXPORT_SYMS+= linux_emul_path
-EXPORT_SYMS+= linux_ioctl_register_handler
-EXPORT_SYMS+= linux_ioctl_unregister_handler
EXPORT_SYMS+= linux_get_osname
EXPORT_SYMS+= linux_get_osrelease
diff --git a/sys/modules/mii/Makefile b/sys/modules/mii/Makefile
--- a/sys/modules/mii/Makefile
+++ b/sys/modules/mii/Makefile
@@ -17,8 +17,12 @@
mii_bitbang_readreg \
mii_bitbang_sync \
mii_bitbang_writereg \
+ miibus_devclass \
+ miibus_driver \
mii_mediachg \
mii_pollstat \
- mii_tick
+ miibus_readreg_desc \
+ mii_tick \
+ miibus_writereg_desc
.include <bsd.kmod.mk>
diff --git a/sys/modules/ppbus/Makefile b/sys/modules/ppbus/Makefile
--- a/sys/modules/ppbus/Makefile
+++ b/sys/modules/ppbus/Makefile
@@ -7,7 +7,7 @@
opt_ppb_1284.h \
ppb_1284.c ppb_base.c ppb_msq.c ppbconf.c
-EXPORT_SYMS= ppb_attach_device \
+EXPORT_SYMS= \
ppb_request_bus \
ppb_release_bus \
ppb_get_status \
diff --git a/sys/modules/procfs/Makefile b/sys/modules/procfs/Makefile
--- a/sys/modules/procfs/Makefile
+++ b/sys/modules/procfs/Makefile
@@ -18,7 +18,6 @@
SRCS+= procfs.c
EXPORT_SYMS=
-EXPORT_SYMS+= procfs_attr
EXPORT_SYMS+= procfs_candebug
EXPORT_SYMS+= procfs_docurproc
EXPORT_SYMS+= procfs_doprocfile
diff --git a/sys/modules/pseudofs/Makefile b/sys/modules/pseudofs/Makefile
--- a/sys/modules/pseudofs/Makefile
+++ b/sys/modules/pseudofs/Makefile
@@ -10,7 +10,8 @@
pseudofs_vncache.c \
pseudofs_vnops.c
-EXPORT_SYMS= pfs_mount \
+EXPORT_SYMS= pfs_cmount \
+ pfs_mount \
pfs_unmount \
pfs_root \
pfs_statfs \
@@ -19,8 +20,6 @@
pfs_create_dir \
pfs_create_file \
pfs_create_link \
- pfs_disable \
- pfs_enable \
pfs_destroy
.if !defined(KERNBUILDDIR)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jul 12, 2:53 AM (44 m, 47 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29087685
Default Alt Text
D32878.1783824822.diff (14 KB)
Attached To
Mode
D32878: kernel linker: do not read debug symbol tables for non-debug symbols
Attached
Detach File
Event Timeline
Log In to Comment