From e47b3f8456fc34ac136e9fddef59a9ae37febcbe Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Thu, 23 Oct 2014 14:19:07 -0700 Subject: [PATCH] Remove unnecessary lookups during relocations local_group includes this library and its dependencies. Change-Id: Ib02474b2355bb147de3889f60092cb2f312997ef --- linker/linker.cpp | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/linker/linker.cpp b/linker/linker.cpp index eb1a483ae..c63ac35bb 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -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",