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;

Reply via email to