diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2005-09-21 23:12:12 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2005-09-21 23:12:12 +0000 |
commit | 167e3760d86ba62a9da0d07fe138e4121997246b (patch) | |
tree | c594795ac03e0da8b00fba4bbe336ee85cb61b89 /libexec/ld.so/resolve.c | |
parent | 63e90dafb93b6a3e64ad9102d8e9c4045a03ea3a (diff) |
Simplify the internal symbol finding API, with some cleanup, prep for
next step. ok kurt@
Diffstat (limited to 'libexec/ld.so/resolve.c')
-rw-r--r-- | libexec/ld.so/resolve.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/libexec/ld.so/resolve.c b/libexec/ld.so/resolve.c index d79362cf0de..1a39efab9b0 100644 --- a/libexec/ld.so/resolve.c +++ b/libexec/ld.so/resolve.c @@ -1,4 +1,4 @@ -/* $OpenBSD: resolve.c,v 1.31 2005/09/19 21:08:43 kurt Exp $ */ +/* $OpenBSD: resolve.c,v 1.32 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -211,7 +211,7 @@ int _dl_symcachestat_lookups; Elf_Addr _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, - const Elf_Sym **ref, int flags, int req_size, 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; @@ -227,7 +227,7 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, _dl_symcachestat_hits++; sobj = _dl_symcache[symidx].obj; - *ref = _dl_symcache[symidx].sym; + *this = _dl_symcache[symidx].sym; if (pobj) *pobj = sobj; return sobj->load_offs; @@ -237,14 +237,14 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, sym += symidx; symn = req_obj->dyn.strtab + sym->st_name; - ret = _dl_find_symbol(symn, ref, flags, req_size, req_obj, &sobj); + ret = _dl_find_symbol(symn, this, flags, ref_sym, req_obj, &sobj); if (pobj) *pobj = sobj; if ((_dl_symcache != NULL) && (symidx < req_obj->nchains)) { - _dl_symcache[symidx].sym = *ref; + _dl_symcache[symidx].sym = *this; _dl_symcache[symidx].obj = sobj; _dl_symcache[symidx].flags = flags; } @@ -253,8 +253,9 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, } Elf_Addr -_dl_find_symbol(const char *name, const Elf_Sym **ref, - int flags, int req_size, elf_object_t *req_obj, const elf_object_t **pobj) +_dl_find_symbol(const char *name, const Elf_Sym **this, + int flags, const Elf_Sym *ref_sym, elf_object_t *req_obj, + const elf_object_t **pobj) { const Elf_Sym *weak_sym = NULL; unsigned long h = 0; @@ -273,7 +274,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, } if (req_obj->dyn.symbolic) - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, &weak_sym, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; @@ -281,20 +282,20 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, } if (flags & SYM_SEARCH_OBJ) { - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; } } else if (flags & SYM_DLSYM) { - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; } if (weak_object != NULL && found == 0) { object=weak_object; - *ref = weak_sym; + *this = weak_sym; found = 1; } /* search dlopened obj and all children */ @@ -303,7 +304,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, TAILQ_FOREACH(n, &req_obj->load_object->dload_list, next_sib) { if (_dl_find_symbol_obj(n->data, name, h, - flags, ref, + flags, this, &weak_sym, &weak_object)) { object = n->data; found = 1; @@ -339,7 +340,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, (m->data == req_obj)) continue; if (_dl_find_symbol_obj(m->data, name, h, flags, - ref, &weak_sym, &weak_object)) { + this, &weak_sym, &weak_object)) { object = m->data; found = 1; goto found; @@ -351,7 +352,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, found: if (weak_object != NULL && found == 0) { object=weak_object; - *ref = weak_sym; + *this = weak_sym; found = 1; } @@ -363,8 +364,9 @@ found: return (0); } - if (req_size != (*ref)->st_size && req_size != 0 && - (ELF_ST_TYPE((*ref)->st_info) != STT_FUNC)) { + if (ref_sym != NULL && ref_sym->st_size != 0 && + (ref_sym->st_size != (*this)->st_size) && + (ELF_ST_TYPE((*this)->st_info) != STT_FUNC) ) { _dl_printf("%s:%s: %s : WARNING: " "symbol(%s) size mismatch, relink your program\n", _dl_progname, req_obj->load_name, @@ -379,7 +381,7 @@ found: int _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, - int flags, const Elf_Sym **ref, const Elf_Sym **weak_sym, + int flags, const Elf_Sym **this, const Elf_Sym **weak_sym, elf_object_t **weak_object) { const Elf_Sym *symt = object->dyn.symtab; @@ -400,7 +402,7 @@ _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, continue; symn = strt + sym->st_name; - if (sym != *ref && _dl_strcmp(symn, name)) + if (sym != *this && _dl_strcmp(symn, name)) continue; /* allow this symbol if we are referring to a function @@ -417,7 +419,7 @@ _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, } if (ELF_ST_BIND(sym->st_info) == STB_GLOBAL) { - *ref = sym; + *this = sym; return 1; } else if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { if (!*weak_sym) { |