From elf/dl-lookup.c, lines 179 ff.: if (__builtin_expect (act < undef_map->l_reldepsmax, 1)) undef_map->l_reldeps[undef_map->l_reldepsact++] = map; if (map->l_searchlist.r_list != NULL) /* And increment the counter in the referenced object. */ ++map->l_opencount; else /* We have to bump the counts for all dependencies since so far this object was only a normal or transitive dependency. Now it might be closed with _dl_close() directly. */ for (list = map->l_initfini; *list != NULL; ++list) ++(*list)->l_opencount; This causes the opencount for libcrypto.so to be incremented once when an libssl symbol is referenced (because l_searchlist.r_list is NULL and libcrypto is in libssl's l_initfini list), and once when a symbol from libcrypto itself is referenced. The second reference has a corresponding entry in l_reldeps which is therefore cleared on dlclose(), but the first does not. I'm not comfortable suggesting any particular fix here; the one that's apparent to me would be to drop the conditional altogether and always just increment map->l_opencount instead of mucking around with l_initfini, but given that I don't have an understanding of why this stuff is there to begin with, I could be way off base. Any ideas? -- Steve Langasek postmodern programmer
Attachment:
signature.asc
Description: Digital signature