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 @@ -12,7 +12,10 @@ # De-list symbols from the export list. { - delete syms[$0] + split($0, exports) + for (member in exports) { + delete syms[$member] + } } # 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), @@ -1490,14 +1497,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 +1535,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 +1547,27 @@ 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) +{ + return (link_elf_lookup_symbol1(lf, name, sym, false)); +} + +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 +1586,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 +1595,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 +1606,29 @@ 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) +{ + 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 +1645,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 +1760,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 @@ -131,8 +131,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 +157,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), @@ -1407,7 +1413,8 @@ } 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; const Elf_Sym *symp; @@ -1417,16 +1424,33 @@ 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, false)); +} + +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 +1460,39 @@ 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, false)); +} + +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 +1520,7 @@ *diffp = diff; *sym = (c_linker_sym_t) best; - return 0; + return (0); } /* @@ -1779,25 +1819,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 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 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 \