Looking around I noticed changes introduced to resolve.[ch] under libexec/ld.so that seem a bit "off"; potential oversight or maybe by design?
Looking at cvs diff snippets here: } Index: resolve.c } =================================================================== } RCS file: /cvs/obsd/src/libexec/ld.so/resolve.c,v } retrieving revision 1.49 } retrieving revision 1.50 } diff -u -p -r1.49 -r1.50 } --- resolve.c 5 May 2008 02:29:02 -0000 1.49 } +++ resolve.c 1 Jul 2010 19:25:44 -0000 1.50 } @@ -302,6 +303,26 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned } return ret; } } } } +uint32_t _dl_searchnum = 0; } +void } +_dl_newsymsearch(void) } +{ } + _dl_searchnum += 1; } + } + if (_dl_searchnum < 0) { } + /* if the signed number roll over, reset } + * all counters so we dont get accidental collision } + */ } + elf_object_t *walkobj; } + for (walkobj = _dl_objects; } + walkobj != NULL; } + walkobj = walkobj->next) { } + walkobj->lastlookup = 0; } + } } + _dl_searchnum = 1; } + } } +} The above if-condition will never be true. I assume there are specific reasons why the _dl_searchnum is chosen to be unsigned while being assigned and compared to signed variables below: } @@ -377,6 +400,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **this } (n->data != req_obj->load_object)) } continue; } } + n->data->lastlookup_head = _dl_searchnum; } TAILQ_FOREACH(m, &n->data->grpsym_list, next_sib) { } if (skip == 1) { } if (m->data == req_obj) { } @@ -389,6 +413,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **this } if ((flags & SYM_SEARCH_OTHER) && } (m->data == req_obj)) } continue; } + m->data->lastlookup = _dl_searchnum; } if (_dl_find_symbol_obj(m->data, name, h, flags, } this, &weak_sym, &weak_object)) { } object = m->data; } Index: resolve.h } =================================================================== } RCS file: /cvs/obsd/src/libexec/ld.so/resolve.h,v } retrieving revision 1.59 } retrieving revision 1.60 } diff -u -p -r1.59 -r1.60 } --- resolve.h 2 May 2010 04:57:01 -0000 1.59 } +++ resolve.h 1 Jul 2010 19:25:44 -0000 1.60 } @@ -142,6 +142,10 @@ struct elf_object { } /* for object confirmation */ } dev_t dev; } ino_t inode; } + } + /* last symbol lookup on this object, to avoid mutiple searches */ } + int lastlookup_head; } + int lastlookup; } }; } } struct dep_node { } @@ -274,5 +279,9 @@ extern int _dl_symcachestat_lookups; } TAILQ_HEAD(dlochld, dep_node); } extern struct dlochld _dlopened_child_list; } } +/* variables used to avoid duplicate node checking */ } +uint32_t _dl_searchnum; } +uint32_t _dl_skipnum; } +void _dl_newsymsearch(void); } } #endif /* _RESOLVE_H_ */ } } } Index: library_subr.c } =================================================================== } RCS file: /cvs/obsd/src/libexec/ld.so/library_subr.c,v } retrieving revision 1.30 } retrieving revision 1.31 } diff -u -p -r1.30 -r1.31 } --- library_subr.c 9 May 2010 09:53:28 -0000 1.30 } +++ library_subr.c 1 Jul 2010 19:25:44 -0000 1.31 } @@ -1,4 +1,4 @@ } -/* $OpenBSD: library_subr.c,v 1.29 2010/05/01 07:46:30 jsg Exp $ */ } +/* $OpenBSD: library_subr.c,v 1.30 2010/05/09 09:53:28 matthieu Exp $ */ } } /* } * Copyright (c) 2002 Dale Rahn } @@ -448,13 +448,20 @@ _dl_link_child(elf_object_t *dep, elf_object_t *p) } } } } void } -_dl_link_grpsym(elf_object_t *object) } +_dl_link_grpsym(elf_object_t *object, int checklist) } { } struct dep_node *n; } } - TAILQ_FOREACH(n, &_dl_loading_object->grpsym_list, next_sib) } - if (n->data == object) } + if (checklist) { } + TAILQ_FOREACH(n, &_dl_loading_object->grpsym_list, next_sib) } + if (n->data == object) } + return; /* found, dont bother adding */ } + } else { } + if (object->lastlookup == _dl_searchnum) { } return; /* found, dont bother adding */ } + } } + } } + object->lastlookup = _dl_searchnum;