diff options
Diffstat (limited to 'usr/src/uts/common/krtld/kobj.c')
| -rw-r--r-- | usr/src/uts/common/krtld/kobj.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/usr/src/uts/common/krtld/kobj.c b/usr/src/uts/common/krtld/kobj.c index 32c61e5c64..4f8997adfc 100644 --- a/usr/src/uts/common/krtld/kobj.c +++ b/usr/src/uts/common/krtld/kobj.c @@ -2180,6 +2180,7 @@ static void free_module_data(struct module *mp) { struct module_list *lp, *tmp; + hotinline_desc_t *hid, *next; int ksyms_exported = 0; lp = mp->head; @@ -2189,6 +2190,15 @@ free_module_data(struct module *mp) kobj_free((char *)tmp, sizeof (*tmp)); } + /* release hotinlines */ + hid = mp->hi_calls; + while (hid != NULL) { + next = hid->hid_next; + kobj_free(hid->hid_symname, strlen(hid->hid_symname) + 1); + kobj_free(hid, sizeof (hotinline_desc_t)); + hid = next; + } + rw_enter(&ksyms_lock, RW_WRITER); if (mp->symspace) { if (vmem_contains(ksyms_arena, mp->symspace, mp->symsize)) { @@ -3034,8 +3044,18 @@ do_symbols(struct module *mp, Elf64_Addr bss_base) if (sp->st_shndx == SHN_UNDEF) { resolved = 0; + /* + * Skip over sdt probes and smap calls, + * they're relocated later. + */ if (strncmp(name, sdt_prefix, strlen(sdt_prefix)) == 0) continue; +#if defined(__x86) + if (strcmp(name, "smap_enable") == 0 || + strcmp(name, "smap_disable") == 0) + continue; +#endif /* defined(__x86) */ + /* * If it's not a weak reference and it's |
