diff options
author | Philip Guenther <guenther@cvs.openbsd.org> | 2019-07-21 03:54:17 +0000 |
---|---|---|
committer | Philip Guenther <guenther@cvs.openbsd.org> | 2019-07-21 03:54:17 +0000 |
commit | 244289f2dc68e97ac98cbf4c8d7c7f6cdce80fff (patch) | |
tree | 91bb4b4b7ba246498c183ea37ce0581b7e05537e /libexec/ld.so | |
parent | 7008829524759b347301fe53c3f85958ff850a81 (diff) |
In 2004, we upgraded to binutils 2.14 with did -zcombreloc by default.
In 2013, I implemented the single-entry LRU cache that gets the maximal
symbol reuse from combreloc. Since then, the ld.so generic relocation
symcache has been a waste of CPU and memory with 0% hit-rate, so kill it.
ok mpi@
Diffstat (limited to 'libexec/ld.so')
-rw-r--r-- | libexec/ld.so/dlfcn.c | 8 | ||||
-rw-r--r-- | libexec/ld.so/loader.c | 31 | ||||
-rw-r--r-- | libexec/ld.so/resolve.c | 49 | ||||
-rw-r--r-- | libexec/ld.so/resolve.h | 5 |
4 files changed, 7 insertions, 86 deletions
diff --git a/libexec/ld.so/dlfcn.c b/libexec/ld.so/dlfcn.c index 016e6316cc8..39fdf27457d 100644 --- a/libexec/ld.so/dlfcn.c +++ b/libexec/ld.so/dlfcn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dlfcn.c,v 1.102 2018/10/22 01:59:08 guenther Exp $ */ +/* $OpenBSD: dlfcn.c,v 1.103 2019/07/21 03:54:16 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -526,12 +526,6 @@ _dl_show_objects(void) } _dl_tracefmt(outputfd, object, fmt1, fmt2, objtypename); } - - if (_dl_symcachestat_lookups != 0) - DL_DEB(("symcache lookups %d hits %d ratio %d% hits\n", - _dl_symcachestat_lookups, _dl_symcachestat_hits, - (_dl_symcachestat_hits * 100) / - _dl_symcachestat_lookups)); } lock_cb * diff --git a/libexec/ld.so/loader.c b/libexec/ld.so/loader.c index 7e8f60578cb..e7b4e031b54 100644 --- a/libexec/ld.so/loader.c +++ b/libexec/ld.so/loader.c @@ -1,4 +1,4 @@ -/* $OpenBSD: loader.c,v 1.182 2019/06/07 16:27:47 deraadt Exp $ */ +/* $OpenBSD: loader.c,v 1.183 2019/07/21 03:54:16 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -687,13 +687,9 @@ _dl_boot(const char **argv, char **envp, const long dyn_loff, long *dl_data) return(dl_data[AUX_entry]); } -#define DL_SM_SYMBUF_CNT 512 -sym_cache _dl_sm_symcache_buffer[DL_SM_SYMBUF_CNT]; - int _dl_rtld(elf_object_t *object) { - size_t sz; struct load_list *llist; int fails = 0; @@ -703,26 +699,6 @@ _dl_rtld(elf_object_t *object) if (object->status & STAT_RELOC_DONE) return 0; - sz = 0; - if (object->nchains < DL_SM_SYMBUF_CNT) { - _dl_symcache = _dl_sm_symcache_buffer; -// DL_DEB(("using static buffer for %d entries\n", -// object->nchains)); - _dl_memset(_dl_symcache, 0, - sizeof (sym_cache) * object->nchains); - } else { - sz = ELF_ROUND(sizeof (sym_cache) * object->nchains, - _dl_pagesz); -// DL_DEB(("allocating symcache sz %x with mmap\n", sz)); - - _dl_symcache = (void *)_dl_mmap(0, sz, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANON, -1, 0); - if (_dl_mmap_error(_dl_symcache)) { - sz = 0; - _dl_symcache = NULL; - } - } - /* * Do relocation information first, then GOT. */ @@ -741,11 +717,6 @@ _dl_rtld(elf_object_t *object) } } - if (_dl_symcache != NULL) { - if (sz != 0) - _dl_munmap( _dl_symcache, sz); - _dl_symcache = NULL; - } if (fails == 0) object->status |= STAT_RELOC_DONE; diff --git a/libexec/ld.so/resolve.c b/libexec/ld.so/resolve.c index 2574cc3b953..2b9874ba7b3 100644 --- a/libexec/ld.so/resolve.c +++ b/libexec/ld.so/resolve.c @@ -1,4 +1,4 @@ -/* $OpenBSD: resolve.c,v 1.90 2019/07/14 03:23:12 guenther Exp $ */ +/* $OpenBSD: resolve.c,v 1.91 2019/07/21 03:54:16 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -518,60 +518,19 @@ _dl_remove_object(elf_object_t *object) } -sym_cache *_dl_symcache; -int _dl_symcachestat_hits; -int _dl_symcachestat_lookups; - - Elf_Addr _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, - const Elf_Sym **this, int flags, const Elf_Sym *ref_sym, const elf_object_t **pobj) + const Elf_Sym **this, int flags, const Elf_Sym *ref_sym, + const elf_object_t **pobj) { - Elf_Addr ret; const Elf_Sym *sym; const char *symn; - const elf_object_t *sobj; - - _dl_symcachestat_lookups ++; - if (_dl_symcache != NULL && - symidx < req_obj->nchains && - _dl_symcache[symidx].obj != NULL && - _dl_symcache[symidx].sym != NULL && - _dl_symcache[symidx].flags == flags) { - - _dl_symcachestat_hits++; - sobj = _dl_symcache[symidx].obj; - *this = _dl_symcache[symidx].sym; - if (pobj) - *pobj = sobj; - return sobj->obj_base; - } sym = req_obj->dyn.symtab; sym += symidx; symn = req_obj->dyn.strtab + sym->st_name; - ret = _dl_find_symbol(symn, this, flags, ref_sym, req_obj, &sobj); - - if (pobj) - *pobj = sobj; - - if (_dl_symcache != NULL && symidx < req_obj->nchains) { -#if 0 - DL_DEB(("cache miss %d %p %p, %p %p %s %s %d %d %s\n", - symidx, - _dl_symcache[symidx].sym, *this, - _dl_symcache[symidx].obj, sobj, sobj->load_name, - sobj->dyn.strtab + (*this)->st_name, - _dl_symcache[symidx].flags, flags, req_obj->load_name)); -#endif - - _dl_symcache[symidx].sym = *this; - _dl_symcache[symidx].obj = sobj; - _dl_symcache[symidx].flags = flags; - } - - return ret; + return _dl_find_symbol(symn, this, flags, ref_sym, req_obj, pobj); } static int diff --git a/libexec/ld.so/resolve.h b/libexec/ld.so/resolve.h index 82ac21b487b..ac90ac4a0e7 100644 --- a/libexec/ld.so/resolve.h +++ b/libexec/ld.so/resolve.h @@ -1,4 +1,4 @@ -/* $OpenBSD: resolve.h,v 1.92 2019/05/11 21:02:35 guenther Exp $ */ +/* $OpenBSD: resolve.h,v 1.93 2019/07/21 03:54:16 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -368,9 +368,6 @@ typedef struct sym_cache { int flags; } sym_cache; -extern sym_cache *_dl_symcache; -extern int _dl_symcachestat_hits; -extern int _dl_symcachestat_lookups; TAILQ_HEAD(dlochld, dep_node); extern struct dlochld _dlopened_child_list; __END_HIDDEN_DECLS |