Prevent rtld_verify_object_versions() from being called several times

for the same object. This can happen when object is a dependency of the
dlopen()ed dso. When called several times, we waste time due to unneeded
processing, and memory, because obj->vertab is allocated anew on each
iteration.

Reviewed by:	kan
MFC after:	2 weeks
This commit is contained in:
Konstantin Belousov 2012-03-27 14:10:15 +00:00
parent 35011d20cb
commit ff17bc61e2
2 changed files with 5 additions and 0 deletions

View File

@ -4158,6 +4158,10 @@ rtld_verify_object_versions(Obj_Entry *obj)
const Obj_Entry *depobj;
int maxvernum, vernum;
if (obj->ver_checked)
return (0);
obj->ver_checked = true;
maxvernum = 0;
/*
* Walk over defined and required version records and figure out

View File

@ -230,6 +230,7 @@ typedef struct Struct_Obj_Entry {
bool mainprog : 1; /* True if this is the main program */
bool rtld : 1; /* True if this is the dynamic linker */
bool relocated : 1; /* True if processed by relocate_objects() */
bool ver_checked : 1; /* True if processed by rtld_verify_object_versions */
bool textrel : 1; /* True if there are relocations to text seg */
bool symbolic : 1; /* True if generated with "-Bsymbolic" */
bool bind_now : 1; /* True if all relocations should be made first */