OSDN Git Service

Remove unnecessary lookups during relocations
authorDmitriy Ivanov <dimitry@google.com>
Thu, 23 Oct 2014 21:19:07 +0000 (14:19 -0700)
committerDmitriy Ivanov <dimitry@google.com>
Thu, 23 Oct 2014 21:19:07 +0000 (14:19 -0700)
  local_group includes this library and its dependencies.

Change-Id: Ib02474b2355bb147de3889f60092cb2f312997ef

linker/linker.cpp

index eb1a483..c63ac35 100644 (file)
@@ -530,6 +530,11 @@ static ElfW(Sym)* soinfo_do_lookup(soinfo* si, const char* name, soinfo** lsi, c
   // 3. Look for it in the local group
   if (s == nullptr) {
     local_group.visit([&](soinfo* local_si) {
+      if (local_si == si && si->has_DT_SYMBOLIC) {
+        // we already did this - skip
+        return true;
+      }
+
       DEBUG("%s: looking up %s in %s (from local group)", si->name, name, local_si->name);
       s = soinfo_elf_lookup(local_si, elf_hash, name);
       if (s != nullptr) {
@@ -541,28 +546,6 @@ static ElfW(Sym)* soinfo_do_lookup(soinfo* si, const char* name, soinfo** lsi, c
     });
   }
 
-  // 4. Look for it in this library (unless we already did it because of DT_SYMBOLIC)
-  if (s == nullptr && !si->has_DT_SYMBOLIC) {
-    DEBUG("%s: looking up %s in local scope", si->name, name);
-    s = soinfo_elf_lookup(si, elf_hash, name);
-    if (s != nullptr) {
-      *lsi = si;
-    }
-  }
-
-  // 5. Dependencies
-  if (s == nullptr) {
-    si->get_children().visit([&](soinfo* child) {
-      DEBUG("%s: looking up %s in %s", si->name, name, child->name);
-      s = soinfo_elf_lookup(child, elf_hash, name);
-      if (s != nullptr) {
-        *lsi = child;
-        return false;
-      }
-      return true;
-    });
-  }
-
   if (s != nullptr) {
     TRACE_TYPE(LOOKUP, "si %s sym %s s->st_value = %p, "
                "found in %s, base = %p, load bias = %p",