rtld: allocate obj->vertab only once
authorJohn Marino <draco@marino.st>
Fri, 30 Mar 2012 18:07:35 +0000 (20:07 +0200)
committerJohn Marino <draco@marino.st>
Fri, 30 Mar 2012 19:00:58 +0000 (21:00 +0200)
Verbatim from FreeBSD SVN 233546 (27 MAR 2012)

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.

libexec/rtld-elf/rtld.c
libexec/rtld-elf/rtld.h

index 74752d8..17e4a58 100644 (file)
@@ -4377,6 +4377,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
index 3870177..718cf0e 100644 (file)
@@ -228,6 +228,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 */